模組化設計的基本想法:把軟體系統拆解成一群相對獨立的模組(class、subsystem、service 皆可)。
理想 vs. 現實#
- 理想世界:每個模組完全獨立,開發者在任一模組工作都不用知道其他模組的事;系統的整體複雜性 = 最糟模組的複雜性
- 現實:模組必須互相呼叫才能協作 → 必然存在依賴
例如:方法的參數列表會在「方法」與「呼叫端」之間建立依賴;參數一改,所有呼叫處都得跟著改。
模組化設計的目標:將模組之間的依賴最小化。
介面與實作(Interface and Implementation)#
要管理依賴,把每個模組想成兩部分:
- 介面(interface):其他模組要使用本模組所必須知道的一切;通常描述「做什麼」,不描述「怎麼做」
- 實作(implementation):兌現介面承諾的程式碼
開發者的責任分配#
在某個模組內工作的人需要理解:
- 自己模組的介面 + 實作
- 自己呼叫到的其他模組的介面
✗ 不需要理解其他模組的實作。
範例:平衡樹模組#
- 內部含複雜的程式碼確保樹保持平衡
- 但這個複雜性對使用者不可見
- 介面只暴露 insert / remove / fetch 等簡單操作
- 呼叫 insert 時只給 key 與 value,遍歷與節點分裂的細節不會出現在介面上
模組的形式#
本書中,「模組」泛指任何擁有介面與實作的程式碼單位。
- OO 語言中的每個 class 都是模組
- class 中的方法、非 OO 語言中的函式也可視為模組
- 更高層的 subsystem、service 也是模組(介面可能是 syscall、HTTP request 等形式)
書中討論多以 class 為主,但概念與技巧普遍適用於各層級。
好模組的關鍵特徵#
最好的模組:介面比實作簡單得多。
兩大優點:
- 簡單的介面 → 模組對其他人造成的複雜性極低
- 修改實作而不動介面時 → 不會影響其他模組
- 介面相對於實作越簡單,能被自由修改的內部空間就越大