「封裝原則主張透過資訊隱藏實踐關注點分離——例如隱藏抽象的實作細節、隱藏實作中的變化點。」
為什麼要封裝?以汽車為例#
開車的人需要懂引擎運作機制嗎?需要懂 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: 違反封裝原則所衍生的壞味道
接下來四個小節會逐一展開這四個壞味道的成因、範例、重構策略。