內容簡介
本書是經典著作《重構》出版20年後的新版。書中清晰揭示了重構的過程,解釋了重構的原理和最佳實踐方式,並給出了何時以及何地應該開始挖掘代碼以求改善。書中給出了60多個可行的重構,每個重構都介紹了一種經過驗證的代碼變換手法的動機和技術。本書提出的重構準則將幫助開發人員一次一小步地修改代碼,從而減少了開發過程中的風險。
本書適合軟體開發人員、項目管理人員等閱讀,也可作為高等院校計算機及相關專業師生的參考讀物。
圖書目錄
Chapter 1: Refactoring: A First Example / 重構,第一個示例 1
The Starting Point / 起點 1
Comments on the Starting Program / 對此起始程式的評價 3
The First Step in Refactoring / 重構的第一步 5
Decomposing the statement Function / 分解statement方法 6
Status: Lots of Nested Functions / 進展:大量嵌套函式 22
Splitting the Phases of Calculation and Formatting /
拆分計算階段與格式化階段 24
Status: Separated into Two Files (and Phases) /
進展:分離到兩個檔案(和兩個階段) 31
Reorganizing the Calculations by Type / 按類型重組計算過程 34
Status: Creating the Data with the Polymorphic Calculator /
進展:使用多態計算器來提供數據 41
Final Thoughts / 結語 43
Chapter 2: Principles in Refactoring / 重構的原則 45
Defining Refactoring / 何謂重構 45
The Two Hats / 兩頂帽子 46
Why Should We Refactor / 為何重構 47
When Should We Refactor / 何時重構 50
Problems with Refactoring / 重構的挑戰 55
Refactoring, Architecture, and Yagni / 重構、架構和YAGNI 62
Refactoring and the Wider Software Development Process /
重構與軟體開發過程 63
Refactoring and Performance / 重構與性能 64
Where Did Refactoring Come From / 重構起源何處 67
Automated Refactorings / 自動化重構 68
Going Further / 延展閱讀 70
Chapter 3: Bad Smells in Code / 代碼的壞味道 71
Mysterious Name / 神秘命名 72
Duplicated Code / 重複代碼 72
Long Function / 過長函式 73
Long Parameter List / 過長參數列表 74
Global Data / 全局數據 74
Mutable Data / 可變數據 75
Divergent Change / 發散式變化 76
Shotgun Surgery / 霰彈式修改 76
Feature Envy / 依戀情結 77
Data Clumps / 數據泥團 78
Primitive Obsession / 基本類型偏執 78
Repeated Switches / 重複的switch 79
Loops / 循環語句 79
Lazy Element / 冗贅的元素 80
Speculative Generality / 誇誇其談通用性 80
Temporary Field / 臨時欄位 80
Message Chains / 過長的訊息鏈 81
Middle Man / 中間人 81
Insider Trading / 內幕交易 82
Large Class / 過大的類 82
Alternative Classes with Different Interfaces / 異曲同工的類 83
Data Class / 純數據類 83
Refused Bequest / 被拒絕的遺贈 83
Comments / 注釋 84
Chapter 4: Building Tests / 構築測試體系 85
The Value of Self-Testing Code / 自測試代碼的價值 85
Sample Code to Test / 待測試的樣例代碼 87
A First Test / 第一個測試 90
Add Another Test / 再添加一個測試 93
Modifying the Fixture / 修改測試夾具 95
Probing the Boundaries / 探測邊界條件 96
Much More Than This / 測試遠不止如此 99
Chapter 5: Introducing the Catalog / 介紹重構名錄 101
Format of the Refactorings / 重構的記錄格式 101
The Choice of Refactorings / 挑選重構的依據 102
Chapter 6: A First Set of Refactorings / 第一組重構 105
Extract Function / 提煉函式 106
Inline Function / 內聯函式 115
Extract Variable / 提煉變數 119
Inline Variable / 內聯變數 123
Change Function Declaration / 改變函式聲明 124
Encapsulate Variable / 封裝變數 132
Rename Variable / 變數改名 137
Introduce Parameter Object / 引入參數對象 140
Combine Functions into Class / 函式組合成類 144
Combine Functions into Transform / 函式組合成變換 149
Split Phase / 拆分階段 154
Chapter 7: Encapsulation / 封裝 161
Encapsulate Record / 封裝記錄 162
Encapsulate Collection / 封裝集合 170
Replace Primitive with Object / 以對象取代基本類型 174
Replace Temp with Query / 以查詢取代臨時變數 178
Extract Class / 提煉類 182
Inline Class / 內聯類 186
Hide Delegate / 隱藏委託關係 189
Remove Middle Man / 移除中間人 192
Substitute Algorithm / 替換算法 195
Chapter 8: Moving Features / 搬移特性 197
Move Function / 搬移函式 198
Move Field / 搬移欄位 207
Move Statements into Function / 搬移語句到函式 213
Move Statements to Callers / 搬移語句到調用者 217
Replace Inline Code with Function Call / 以函式調用取代內聯代碼 222
Slide Statements / 移動語句 223
Split Loop / 拆分循環 227
Replace Loop with Pipeline / 以管道取代循環 231
Remove Dead Code / 移除死代碼 237
Chapter 9: Organizing Data / 重新組織數據 239
Split Variable / 拆分變數 240
Rename Field / 欄位改名 244
Replace Derived Variable with Query / 以查詢取代派生變數 248
Change Reference to Value / 將引用對象改為值對象 252
Change Value to Reference / 將值對象改為引用對象 256
Chapter 10: Simplifying Conditional Logic / 簡化條件邏輯 259
Decompose Conditional / 分解條件表達式 260
Consolidate Conditional Expression / 合併條件表達式 263
Replace Nested Conditional with Guard Clauses /
以衛語句取代嵌套條件表達式 266
Replace Conditional with Polymorphism / 以多態取代條件表達式 272
Introduce Special Case / 引入特例 289
Introduce Assertion / 引入斷言 302
Chapter 11: Refactoring APIs / 重構API 305
Separate Query from Modifier / 將查詢函式和修改函式分離 306
Parameterize Function / 函式參數化 310
Remove Flag Argument / 移除標記參數 314
Preserve Whole Object / 保持對象完整 319
Replace Parameter with Query / 以查詢取代參數 324
Replace Query with Parameter / 以參數取代查詢 327
Remove Setting Method / 移除設值函式 331
Replace Constructor with Factory Function / 以工廠函式取代構造函式 334
Replace Function with Command / 以命令取代函式 337
Replace Command with Function / 以函式取代命令 344
Chapter 12: Dealing with Inheritance / 處理繼承關係 349
Pull Up Method / 函式上移 350
Pull Up Field / 欄位上移 353
Pull Up Constructor Body / 構造函式本體上移 355
Push Down Method / 函式下移 359
Push Down Field / 欄位下移 361
Replace Type Code with Subclasses / 以子類取代類型碼 362
Remove Subclass / 移除子類 369
Extract Superclass / 提煉超類 375
Collapse Hierarchy / 摺疊繼承體系 380
Replace Subclass with Delegate / 以委託取代子類 381
Replace Superclass with Delegate / 以委託取代超類 399
Bibliography / 參考文獻 405