這是本書中最短但訊息最明確的一章。核心觀念是:直接依賴你無法控制的 library 類別,會帶來嚴重的風險。
問題#
許多語言中的某些特性(如 Java 的 final、C# 的 sealed)會阻止你建立子類別。當 library 使用這些特性時:
- 你無法建立 fake objects 來測試
- 你無法使用 Extract Interface 或 Extract Implementer 來打破依賴
- Library 類別不在你的控制範圍內
建議#
避免直接散佈 library 的依賴到整個程式碼中。 最好用一層薄薄的 wrapper 將 library 類別隔離起來,這樣你有調整的空間。
具體做法:
- 封裝 library 呼叫:不要讓 library 類別直接出現在你的業務邏輯中
- 使用 wrapper 或 adapter:參見 Chapter 15 的 Skin and Wrap the API 技術
- 謹慎使用
sealed/final:如果你自己在寫 library,請三思是否真的需要防止子類別化 - 保留彈性空間:透過 wrapper 讓你在測試時可以替換 library 的行為
當你需要使用 library 類別時,隔離它們在某些 wrapper 後面是個好習慣。這樣在做改變時,你有迴旋的餘地。詳細的技術請參閱 Chapter 15(My Application Is All API Calls)。