Martin Fowler《重構》經典代碼異味分類,識別並消除這些問題是提升代碼質量的核心路徑。
| # | 異味 | 核心問題 | 重構方向 |
|---|---|---|---|
| 1 | Duplicated Code | Copy-Paste編程 | 提取方法/類,OAOO原則 |
| 2 | Long Method | 多意圖混雜 | 拆分方法,單一職責 |
| 3 | Large Class | 責任過重 | One Class One Responsibility |
| 4 | Divergent Change | 類內變化率不一 | 拆分類,隔離變化維度 |
| 5 | Shotgun Surgery | 一處改動波及多處 | 合併相關變化到同一類 |
| 6 | Feature Envy | 頻繁訪問他類數據 | 搬移方法到數據所在類 |
| 7 | Data Clumps | 數據群結伴出現 | 提取為值對象 |
| 8 | Primitive Obsession | 用基本類型表達概念 | 引入小對象(Range、Money等) |
| 9 | Switch Statements | 基於常量分支 | 多態/State/Strategy模式 |
| 10 | Parallel Inheritance Hierarchies | 雙層次並行變化 | 合併層次或移動方法 |
| 11 | Lazy Class | 類幾乎無所作為 | 內聯或刪除 |
| 12 | Speculative Generality | 實現未用功能 | YAGNI,刪除僅測試用代碼 |
| 13 | Temporary Field | 字段僅特定場景有效 | 提取專用類持有相關字段/行為 |
| 14 | Message Chains | a.getB().getC().doD() | 隱藏委托,引入中介方法 |
| 15 | Middle Man | 過度委托封裝 | 移除中間人,直接調用 |
| 16 | Inappropriate Intimacy | 類間過度耦合私有細節 | 封裝邊界清晰化 |
| 17 | Alternative Classes with Different Interfaces | 同功能不同簽名 | 統一協議,上移共同接口 |
| 18 | Incomplete Library Class | 庫類缺失所需功能 | 擴展/裝飾/適配器模式 |
| 19 | Data Class | 純數據無行為 | 搬移行為進類或凍結為不可變值對象 |
| 20 | Refused Bequest | 子類拒絕父類遺產 | 調整繼承體系,組合優於繼承 |
| 21 | Comments | 過度註釋掩蓋混亂代碼 | 重構令代碼自説明 |
Long Method、Duplicated Code零容忍