介紹一些保持軟件邊界(和其他接口對接的界限)整潔的實踐手段和技巧
8.1 使用第三方代碼
- 第三方程序包和框架提供者追求 普適性 ,這樣就能在多環境中工作,吸引廣泛的用戶
- 使用者則想要集中滿足特定需求接口
- 接口提供方和接口使用方在期望值上的差異,就會導致系統在邊界上出現問題
8.1.1 舉一個 Map 的例子
java.util.Map
是 Java 提供的一個接口和功能都很豐富的對象- 但是當我們通過 Map 進行內容傳遞時,如果想要禁止調用者刪除裏面存入的數據,卻很難做到
- 因爲 Map 的
clear()
方法是對外公開的,任何調用者都可以直接使用 - 除非通過以下方式將 Map 獲取數據的方式進行封裝
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
}
8.2 瀏覽和學習邊界
- 在接入第三方代碼時,不要在生產代碼中直接接入
- 應該先編寫測試來遍覽和理解第三方代碼,這種方式叫 學習性測試( Learning Tests )
8.3 學習 log4j
- 使用標準的日誌工具類來操作系統日誌,是構建項目的不二之選
8.4 學習性測試的好處不只是免費
- 當需要接入第三方接口時,不論如何都無法避免去學習其中的 APi
- 而編寫測試則是獲得這些知識的 即容易,又不會影響其他工作 的途徑
- 而且,當第三方程序包發佈了新版本,可以通過之前編寫的學習性測試看看程序包的行爲是否發生改變
8.5 使用尚不存在的代碼
- 如果系統的部分邊界是需要和其他項目對接
- 提前編寫我們想要得到的接口,有助於保持客戶代碼高可讀性
- 例如現在盛行的前後分離項目,前後端工程師先說出各自對接口的期望,然後同步開發,前端工程師通常會使用 mock.js 工具進行接口模擬
8.6 整潔的邊界
- 良好的軟件設計,後期無需巨大投入和重寫即可對系統進行修改
- 而整潔的邊界有助於將系統本身和第三方代碼分割開來,當後期需要替換時工作量就更小