「階層原則主張透過分類、泛化、替換性、排序等技巧,建立抽象之間的階層組織。」
為什麼需要階層?#
地球上有超過 870 萬個物種。生物學家如何處理這份多樣性?答案是 Carl Linnaeus ↗ 提出的分類學——以階層組織所有物種:界 → 門 → 綱 → 目 → 科 → 屬 → 種。

Figure 6.1: Linnaeus 分類學——人類在生物階層中的位置
階層提供強大的工具:
- 為實體排序。
- 處理相似與差異。
- 以「泛化(generalization)」與「特化(specialization)」思考世界。
軟體設計亦然。物件導向語言支援兩種階層:
- 型別階層(type hierarchy):is-a 關係。
- 物件階層(object hierarchy):part-of 關係。
本章「階層」一詞特指型別階層。
階層的五項使能技巧#

Figure 6.2: 階層原則的使能技巧
- 應用有意義的分類(meaningful classification)
- 識別共通與差異 → 共通放在父型別、差異放在子型別。
- 把父型別與子型別組織成多層階層:根部抽象、葉子具體。
- 重點是行為的共通與差異,而非資料。
- 應用有意義的泛化(meaningful generalization)
- 把子型別之間的共通成員抽到父型別 → 提升重用性、理解性、可擴充性,並消除重複。
- 確保可替換性(substitutability)
- 遵守 Liskov Substitution Principle ↗(LSP):父型別參考能用子型別物件替換而不改變程式行為。
- 避免冗餘路徑
- 階層不應有不必要的重複繼承路徑——會讓階層難以理解,甚至引發執行期錯誤。
- 確保適當的順序
- 子型別依賴父型別是直觀的;父型別反過來依賴子型別則違反順序。
階層壞味道與使能技巧的對應#

Figure 6.3: 違反階層原則所衍生的設計壞味道
| 設計壞味道 | 違反的使能技巧 |
|---|---|
| Missing Hierarchy、Unnecessary Hierarchy | 應用有意義的分類 |
| Unfactored Hierarchy、Wide Hierarchy、Speculative Hierarchy、Deep Hierarchy | 應用有意義的泛化 |
| Rebellious Hierarchy、Broken Hierarchy | 確保可替換性 |
| Multipath Hierarchy | 避免冗餘路徑 |
| Cyclic Hierarchy | 確保適當的順序 |