本節對應原書 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)