模組化設計的基本想法:把軟體系統拆解成一群相對獨立的模組(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 為主,但概念與技巧普遍適用於各層級。

好模組的關鍵特徵#

最好的模組:介面比實作簡單得多。

兩大優點:

  1. 簡單的介面 → 模組對其他人造成的複雜性極低
  2. 修改實作而不動介面時 → 不會影響其他模組
    • 介面相對於實作越簡單,能被自由修改的內部空間就越大