資訊隱藏(information hiding):每個模組封裝若干項知識(這些知識代表設計決策)。這些知識嵌入在實作中,不出現在介面上,因此其他模組看不到。
此概念由 David Parnas 在 1971 年的經典論文中首次提出。
可以隱藏什麼樣的資訊#
模組內隱藏的通常是「實作某個機制的細節」,例如:
- B 樹的儲存與高效存取方式
- 檔案中邏輯區塊與磁碟實體區塊的對應方式
- TCP 網路協定的實作
- 多核處理器上執行緒的排程策略
- JSON 文件的解析方式
被隱藏的資訊可能包含:
- 與機制相關的資料結構與演算法
- 較低層次的細節(例如分頁大小)
- 較高層次的抽象假設(例如「多數檔案都很小」)
為什麼能降低複雜性#
資訊隱藏從兩個方向降低複雜性:
簡化介面
- 介面呈現更簡單、更抽象的功能視角
- 細節被隱藏 → 使用者的認知負擔降低
- 例如:使用 B 樹類別的開發者不需要知道節點的最佳 fanout,也不需要知道如何維持平衡
方便系統演進
- 被隱藏的資訊沒有外部依賴
- 因此相關設計變更只會影響該模組
- 例如:TCP 協定加入新的壅塞控制機制 → 只需要修改協定的實作;上層使用 TCP 收發資料的程式碼不需要改
設計新模組時的思考起點#
設計新模組時,仔細想想「有什麼資訊可以藏在這個模組裡?」
能藏的資訊越多,介面就能越簡單,模組也就越深。
private ≠ 資訊隱藏#
把變數或方法宣告為 private 不等於資訊隱藏。
- private 元素有助於資訊隱藏,因為它阻擋外部直接存取
- 但若透過 public 的 getter / setter 仍能取得這些變數的本質與用法,那資訊並沒有被藏起來——暴露程度跟把變數設成 public 沒什麼兩樣
全藏 vs. 部分藏#
- 最佳形式:資訊完全藏在模組內,使用者完全感覺不到它的存在
- 部分隱藏也有價值:
- 例如某個特性只有少數使用者需要
- 透過獨立的方法存取,常見用途中看不到它
- 這仍能減少依賴