「封裝原則主張透過資訊隱藏實踐關注點分離——例如隱藏抽象的實作細節、隱藏實作中的變化點。」

為什麼要封裝?以汽車為例#

開車的人需要懂引擎運作機制嗎?需要懂 ABS 防鎖死系統的實作嗎?

不需要。汽車向駕駛人隱藏了不必要的細節——這正是封裝原則的具體展現。

更進一步:

  • 不論車子是汽油還是柴油引擎,駕駛方式不變——這是隱藏實作變化
  • 客戶端只需要看到「做什麼」,不必看到「怎麼做」。

封裝原則與抽象原則互補:抽象負責簡化,封裝負責隱藏

Figure 4.1: 汽車向使用者隱藏內部細節(引擎)

封裝的兩項使能技巧#

「Encapsulate what varies.」(隱藏會變的東西)—— Gamma et al.

  • 隱藏實作細節(hide implementation details)
    • 抽象只暴露「能做什麼」,隱藏「怎麼做」。
    • 包括內部資料表示(欄位、資料結構)與方法的實作(演算法、流程)。
  • 隱藏變化(hide variations)
    • 隱藏型別或階層中可能變動的部分。
    • 變化被隱藏後,實作改動才不會波及客戶端。

Figure 4.2: 封裝原則的兩項使能技巧

封裝壞味道與使能技巧的對應#

設計壞味道違反的使能技巧
Deficient Encapsulation、Leaky Encapsulation隱藏實作細節
Missing Encapsulation、Unexploited Encapsulation隱藏變化

Figure 4.3: 違反封裝原則所衍生的壞味道

接下來四個小節會逐一展開這四個壞味道的成因、範例、重構策略。