📌 30 秒摘要(Layer 3)
重構=在不改變外部行為的前提下,改善程式內部結構。做法是「小步前進、每步都跑測試」,用一系列有名字的標準手法(提煉函式、改名、搬移…)逐步改善。判斷「哪裡該重構」靠嗅出程式碼壞味道。原則:要加功能時,先重構讓它容易加,再加。
🗺 心智圖(Canvas)
重構
Link to original
🧰 這本書給我的工具(即用快速工具)
📖 完整型錄(詳解在 reference/)
🦨 程式碼壞味道 Code Smells(24,判斷「哪裡該重構」)
- 神秘命名 Mysterious Name、重複程式碼 Duplicated Code、過長函式 Long Function、過長參數列 Long Parameter List、全域資料 Global Data、可變資料 Mutable Data、發散式變化 Divergent Change、霰彈式修改 Shotgun Surgery、依戀情結 Feature Envy、資料泥團 Data Clumps、基本型別偏執 Primitive Obsession、重複的 switch Repeated Switches、迴圈 Loops、冗員元素 Lazy Element、誇誇其談通用性 Speculative Generality、暫時欄位 Temporary Field、訊息鏈 Message Chains、中間人 Middle Man、內幕交易 Insider Trading、過大類別 Large Class、異曲同工的類別 Alternative Classes with Different Interfaces、純資料類別 Data Class、被拒絕的遺贈 Refused Bequest、註釋 Comments
🔧 主要重構手法 Refactorings(30,怎麼改)
組織函式與變數
- 提煉函式 Extract Function、行內函式 Inline Function、提煉變數 Extract Variable、行內變數 Inline Variable、改變函式宣告 Change Function Declaration、封裝變數 Encapsulate Variable、引入參數物件 Introduce Parameter Object、拆分階段 Split Phase
封裝
- 封裝記錄 Encapsulate Record、封裝集合 Encapsulate Collection、以物件取代基本型別 Replace Primitive with Object、以查詢取代暫時變數 Replace Temp with Query、提煉類別 Extract Class、內聯類別 Inline Class、隱藏委託關係 Hide Delegate
搬移與迴圈
- 搬移函式 Move Function、搬移欄位 Move Field、拆分迴圈 Split Loop、以管道取代迴圈 Replace Loop with Pipeline、移除死程式碼 Remove Dead Code
簡化條件邏輯
- 分解條件式 Decompose Conditional、合併條件式 Consolidate Conditional Expression、以衛述句取代嵌套條件式 Replace Nested Conditional with Guard Clauses、以多型取代條件式 Replace Conditional with Polymorphism、引入特例 Introduce Special Case
重構 API 與繼承
- 將查詢與修改分離 Separate Query from Modifier、移除旗標參數 Remove Flag Argument、以子類取代型別碼 Replace Type Code with Subclasses、提煉超類 Extract Superclass、函式上移 Pull Up Method
✨ 關鍵重點(Layer 1–2)
- 定義:不改行為、只改結構;靠測試保證行為不變。
- 兩頂帽子:你要嘛在「加功能」、要嘛在「重構」,別同時戴。
- 先重構再加功能:「如果加功能很難,先重構到容易加,再加。」
- 常見壞味道:重複程式碼、過長函式、過大類別、發散式變化、依戀情結、資料泥團…
- 重構的前提是測試:沒有測試就先補(見 修改程式碼的藝術)。
💬 金句原文(Layer 0)
- 「任何傻瓜都能寫出電腦看得懂的程式;優秀的程式設計師寫出人看得懂的程式。」
- 「重構前,先確保有一組可靠的測試。」