本節對應原書 2.4 與 2.5 節,先界定本書所涵蓋的壞味道範圍,再呈現整本書貫穿的分類框架——PHAME 模型

2.4 本書涵蓋哪些壞味道?#

壞味道的整體疆域可以從兩個維度切割:

  • 層級:架構層級(architectural)/設計層級(design,亦稱微架構)/實作層級(implementation)。
  • 性質:結構性(structural)/行為性(behavioral)。

本書的範圍**只涵蓋「結構性」「設計層級」**的壞味道。

Figure 2.2: 本書涵蓋的壞味道範圍

語言聚焦#

  • 焦點:物件導向語言(Java、C#、C++)共同支援的語言特性。
  • 不深入處理多重類別繼承——因 Java 與 C# 並未支援,書中以單一繼承為主。

本書未發明任何壞味道。所有壞味道都來自既有的研究論文、專書,或設計分析工具的文件。

2.5 設計壞味道的分類框架#

為什麼需要分類?#

作者整理文獻時,找到 283 個與結構性設計壞味道相關的條目。若無分類框架,這份清單就只是無秩序的條列。

分類為認知引入了階層式抽象:協助記憶、便於辨別、深化理解。

以「設計原則」為分類依據#

作者選擇以「壞味道違反了哪個設計原則」作為分類軸線。理由:

  • 開發者若知道某個壞味道違反了哪個原則,就能更深入理解該壞味道。
  • 一旦回溯到原則層級,對應的重構方向便自然浮現

採用的設計原則來自 Booch 物件模型的四大要素,本書合稱為 PHAME(Principles of Hierarchy, Abstraction, Modularization, and Encapsulation):

Figure 2.3: 設計壞味道的分類框架

原則描述
抽象(Abstraction)透過化簡(去除不必要細節)與泛化(識別共通且重要的特徵)來簡化實體
封裝(Encapsulation)透過隱藏實作細節與隱藏變化來實踐關注點分離資訊隱藏
模組化(Modularization)透過區域化與分解,建立內聚高、耦合鬆的抽象
階層(Hierarchy)透過分類、泛化、替換性、排序,建立抽象之間的階層組織

每個壞味道會被映射到其最主要違反的那一個原則

壞味道的命名規則#

命名要協助實務工作者記得住、理解快、能溯因

作者為命名訂出四個目標:

  • 一致性:所有壞味道都依同一規則命名。
  • 簡潔:易於記憶。
  • 能反映被違反的原則
  • 能透露壞味道主要的呈現形態

最終採用的命名規則:

  • 每個壞味道由兩個字組成。
  • 第一字(形容詞):限定該壞味道的具體形態。
  • 第二字(被違反的原則):直接揭示其根源。

範例:

  • Multifaceted Abstraction → 違反了抽象原則,形態為「多重切面」。
  • Broken Hierarchy → 違反了階層原則,形態為「替換性已斷」。

原則交叉時的歸屬規則#

四個原則並非彼此互斥;同一個壞味道可能違反多個。對於這類情況,書中以「違反了哪個原則的『使能技巧(enabling technique)』」作為歸屬依據。

範例:

  • 想像一個壞味道——應該本來在同一個抽象內的資料/方法被切散到多個抽象。
  • 可以歸到「抽象」(責任指派錯誤),也可以歸到「模組化」(緊耦合)。
  • 但它直接違反模組化的使能技巧「將相關的資料與方法區域化」。
  • 因此歸到模組化

壞味道的描述模板#

為使閱讀體驗一致,書中使用統一的模板描述每個壞味道,主要欄位包含:

  • 壞味道名稱
  • 別名(如果有)
  • 成因
  • 範例
  • 受影響的品質屬性
  • 對應的重構方向
  • 實務上的考量

模板讓讀者可以橫向比較不同壞味道,並快速擷取所需資訊。

接下來的章節#

第 3–6 章分別涵蓋違反四個原則的壞味道:

  • 第 3 章:抽象(Abstraction)
  • 第 4 章:封裝(Encapsulation)
  • 第 5 章:模組化(Modularization)
  • 第 6 章:階層(Hierarchy)