資訊隱藏(information hiding):每個模組封裝若干項知識(這些知識代表設計決策)。這些知識嵌入在實作中,不出現在介面上,因此其他模組看不到。

此概念由 David Parnas 在 1971 年的經典論文中首次提出。

可以隱藏什麼樣的資訊#

模組內隱藏的通常是「實作某個機制的細節」,例如:

  • B 樹的儲存與高效存取方式
  • 檔案中邏輯區塊與磁碟實體區塊的對應方式
  • TCP 網路協定的實作
  • 多核處理器上執行緒的排程策略
  • JSON 文件的解析方式

被隱藏的資訊可能包含:

  • 與機制相關的資料結構與演算法
  • 較低層次的細節(例如分頁大小)
  • 較高層次的抽象假設(例如「多數檔案都很小」)

為什麼能降低複雜性#

資訊隱藏從兩個方向降低複雜性:

  1. 簡化介面

    • 介面呈現更簡單、更抽象的功能視角
    • 細節被隱藏 → 使用者的認知負擔降低
    • 例如:使用 B 樹類別的開發者不需要知道節點的最佳 fanout,也不需要知道如何維持平衡
  2. 方便系統演進

    • 被隱藏的資訊沒有外部依賴
    • 因此相關設計變更只會影響該模組
    • 例如:TCP 協定加入新的壅塞控制機制 → 只需要修改協定的實作;上層使用 TCP 收發資料的程式碼不需要改

設計新模組時的思考起點#

設計新模組時,仔細想想「有什麼資訊可以藏在這個模組裡?

能藏的資訊越多,介面就能越簡單,模組也就越深。

private ≠ 資訊隱藏#

把變數或方法宣告為 private 不等於資訊隱藏。

  • private 元素有助於資訊隱藏,因為它阻擋外部直接存取
  • 但若透過 public 的 getter / setter 仍能取得這些變數的本質與用法,那資訊並沒有被藏起來——暴露程度跟把變數設成 public 沒什麼兩樣

全藏 vs. 部分藏#

  • 最佳形式:資訊完全藏在模組內,使用者完全感覺不到它的存在
  • 部分隱藏也有價值:
    • 例如某個特性只有少數使用者需要
    • 透過獨立的方法存取,常見用途中看不到它
    • 這仍能減少依賴