重構的三大支柱:技能、文化、工具#
本書將重構拆解為三個面向:Skills(技能)、Culture(文化)、Tools(工具)。每個面向都有對應的傳統做法,而本書提出更易學、更實用的替代方案。

Figure 1.1: Skills, culture, and tools
技能:用規則取代 Code Smells#
傳統做法仰賴辨識 code smells——程式碼中「聞起來不對」的跡象。然而 code smells 抽象且依賴經驗,初學者難以掌握。本書改用具體的 rules(規則),提供明確的判斷標準,讓重構決策更可操作。

Figure 1.2: Rules and code smells
文化:六步驟工作流程#
傳統的 red-green-refactor 循環與測試驅動開發綁定。本書提出更通用的六步驟 workflow:
| 步驟 | 名稱 | 說明 |
|---|---|---|
| 1 | 探索 | 理解現有程式碼 |
| 2 | 規格化 | 確認預期行為 |
| 3 | 實作 | 完成功能 |
| 4 | 測試 | 驗證正確性 |
| 5 | 重構 | 改善程式碼結構 |
| 6 | 交付 | 提交變更 |

Figure 1.3: Workflow
其中「重構」步驟本身又包含更細緻的操作:先辨識需要改善的地方,再以安全的方式逐步改寫。

Figure 1.4: Detailed view of the refactoring step
工具:編譯器與版本控制#
傳統做法依賴 automated testing(自動化測試)來確保重構安全。本書則強調善用 compiler(編譯器)和 version control(版本控制):
- 編譯器——型別檢查能在編譯階段攔截許多錯誤
- 版本控制——隨時可以安全回退,降低重構的風險
什麼是重構#
重構的定義:在不改變程式碼外部行為的前提下,改善其內部結構。目標是讓程式碼更易讀、更易維護。
好的程式碼具備三個特質:
| 特質 | 說明 |
|---|---|
| Human-readable | 人類容易閱讀理解 |
| Easy to maintain | 容易修改與擴充 |
| Correctly performs | 正確執行預期功能 |
何時該重構#
重構不是獨立的大工程,而應融入日常開發流程。每次修改程式碼時,順手改善經手的部分。
對於 legacy system(遺留系統),建議先重構相關區域,再進行功能修改——這能降低修改的風險並提升效率。
何時不該重構#
並非所有程式碼都值得重構:
| 情境 | 說明 |
|---|---|
| 一次性程式碼 | 用完即丟,投入重構沒有回報 |
| 即將退役的程式碼 | 生命週期將盡,改善沒有意義 |
| 嚴格效能要求的程式碼 | 重構可能影響效能,需要審慎評估 |
安全重構的保障#
本書提倡 step-by-step 的重構模式,每一步都是小幅度的安全改動。搭配以下工具確保安全:
- 版本控制——任何一步出錯都能立即回退
- 編譯器——每一步改動後編譯,及早發現錯誤
每次重構只做一小步,確認編譯通過後再進行下一步。頻繁 commit 能提供額外的安全網。
範例專案:2D 推箱子遊戲#
本書使用一個 TypeScript 實作的 2D 推箱子遊戲作為貫穿全書的範例。透過逐步重構這個遊戲的程式碼,示範各種規則與技巧的實際應用。

Figure 1.5: A screenshot of the game out of the box
規則的學習方式#
本書的規則有一套循序漸進的學習路徑:
| 階段 | 名稱 | 說明 |
|---|---|---|
| 1 | 學習名稱 | 先記住規則的名稱,建立共同語言 |
| 2 | 學習例外 | 了解何時不適用,避免機械式套用 |
| 3 | 理解意圖 | 深入規則背後對應的 code smell,掌握「為什麼」 |

Figure 1.6: How to use the rules
規則是入門的捷徑,但最終目標是理解背後的設計意圖。當你能直接辨識 code smells 時,規則就成了輔助而非必需。