第八章 邊界
8.1 使用第三方代碼
藉口提供者和使用者之間存在天然的分歧:提供者希望藉口具有普適性,而使用者希望滿足特定的需求;這樣的差異導致在使用第三方接口時在邊界上出現問題
//此方法將sensors暴露在外部,在函數間傳遞不安全 Map sensors = new HashMap(); ... Sensor s = (Sensor)sensors.get(sensorId); //此種方法在使用Sensors時無需考慮其內部實現,避免了對sensors的無意修改;當HashMap修改時,對Sensors 的修改就在此類的內部,做到了很好的隔離 public class Sensors{ private Map sensors = new HashMap(); public Sensor getById(String id){ return (Sensor) sensors.get(id); } .... }
以上的重構方法使HashMap的使用隔離在Sensors類的內部,當HashMap修改時,只需修改Sensors類一處,實現低耦合;
8.2 瀏覽和學習邊界
- 對於第三方代碼的瀏覽和學習應該獨立出來,而不是在生產代碼中;
- 編寫測試來遍覽和理解第三方代碼,稱爲學習性測試;
- 在測試時聚焦於想要了解的特性;
8.3 學習log4j
- 該標題下的內容爲一步步實現log4j的日誌輸出
8.4 學習性測試的的好處不只是免費
- 學習性測試是精確試驗,幫助增進對API的理解;
- 對於新發行的第三方軟件包可以運行學習性測試,查看功能是否改變;
- 使用好邊界測試,方便軟件遷移和第三方代碼升級;
8.5 使用尚不存在的代碼
- 另一種邊界是已知和未知;
- 項目中可能存在能力圈範圍之外的領域,工作可以先從遠離該領域的地方開始;
- 對於不存在的接口可以先按照想要的樣子編寫接口,細節等該領域的人員設計出來後,再完善接口中的細節;
- 編寫想要的接口可以使接口在自己的控制之下,有助於保持代碼的可讀性和內聚性;
8.6 整潔的邊界
- 邊界會經常需要改動,良好的軟件設計無需巨大的投入和重寫即可修改;
- 在使用控制不了的代碼(第三方庫)時,需要加倍的小心,確保未來的修改代價不要太大;
- 避免代碼過多的依賴第三方代碼中特定的信息,依靠能控制的好過依靠控制不了的,避免日後受它控制;