「階層原則主張透過分類、泛化、替換性、排序等技巧,建立抽象之間的階層組織。」

為什麼需要階層?#

地球上有超過 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)
  • 避免冗餘路徑
    • 階層不應有不必要的重複繼承路徑——會讓階層難以理解,甚至引發執行期錯誤。
  • 確保適當的順序
    • 子型別依賴父型別是直觀的;父型別反過來依賴子型別則違反順序。

階層壞味道與使能技巧的對應#

Figure 6.3: 違反階層原則所衍生的設計壞味道

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