主要內容
重構,一言以蔽之,就是在不改變外部行為的前提下,有條不紊地改善代碼。20多年前,正是《重構:改善既有代碼的設計》第1版的出版,使重構終於從編程高手們的小圈子走出,成為眾多普通程式設計師日常開發工作中不可或缺的一部分。如今,Martin Fowler 的《重構:改善既有代碼的設計》一書已經成為全球有經驗的程式設計師手中的利器,既可用來改善既有代碼的設計、提升軟體的可維護性,又可用於使既有代碼更易理解、煥發出新的活力。
第2版在第1版的基礎上做了全面修訂,反映了編程領域業已發生的許多變化。第2版中介紹的重構列表更加內聚,並用JavaScript 語言重寫了代碼範例。此外,第2版中還新增了與函式式編程相關的重構範例,旨在教會讀者如何在沒有類的環境下開展重構。新版沿襲了第1版的結構,依次解釋什麼是重構,為什麼要重構,如何通過“壞味道”識別出需要重構的代碼,以及如何在實踐中成功實施重構(無論用的是什麼程式語言)。
本書凝聚了軟體開發社區專家多年摸索而獲得的寶貴經驗,書中所蘊涵的思想和精華,值得反覆咀嚼,而且往往能夠常讀常新。
作者介紹
世界軟體開發大師,ThoughtWorks的首席科學家,他在重構、面向對象分析設計、模式、XP和UML等領域都有突出貢獻,經典著作包括《重構》《分析模式》《領域特定語言》等。
目錄
第1章重構,第一個示例 1
1.1 起點 1
1.2對此起始程式的評價 3
1.3重構的第一步 5
1.4分解statement函式 6
1.5進展:大量嵌套函式 22
1.6拆分計算階段與格式化階段 24
1.7進展:分離到兩個檔案(和兩個階段) 31
1.8按類型重組計算過程 34
1.9進展:使用多態計算器來提供數據 41
1.10 結語 43
第2章重構的原則 45
2.1 何謂重構 45
2.2兩頂帽子 46
2.3 為何重構 47
2.4何時重構 50
2.5 重構的挑戰 55
2.6重構、架構和YAGNI 62
2.7重構與軟體開發過程 63
2.8重構與性能 64
2.9重構起源何處 67
2.10 自動化重構 68
2.11 延展閱讀 70
第3章代碼的壞昧道 71
3.1 神秘命名(Mysterious Name) 72
3.2 重複代碼(Duplicated Code) 72
3.3 過長函式(Long Function) 73
3.4 過長參數列表(Long Parameter List) 74
3.5 全局數據(Global Data) 74
3.6 可變數據(Mutable Data) 75
3.7 發散式變化(Divergent Change) 76
3.8 霰彈式修改(Shotgun Surgery) 76
3.9 依戀情結(Feature Envy) 77
3.10 數據泥團(Data Clumps) 78
3.11 基本類型偏執(Primitive Obsession) 78
3.12 重複的switch(Repeated Switches) 79
3.13 循環語句(Loops) 79
3.14 冗贅的元素(Lazy Element) 80
3.15 誇誇其談通用性(Speculative Generality) 80
3.16 臨時欄位(Temporary Field) 80
3.17 過長的訊息鏈(Message Chains) 81
3.18 中間人(Middle Man) 81
3.19 內幕交易(Insider Trading) 82
3.20 過大的類(Large Class) 82
3.21 異曲同工的類(Alternative Classes with Different Interfaces) 83
3.22 純數據類(Data Class) 83
3.23 被拒絕的遺贈(Refused Bequest) 83
3.24 注釋(Comments) 84
第4章構築測試體系 85
4.1自測試代碼的價值 85
4.2待測試的示例代碼 87
4.3第一個測試 90
4.4 再添加一個測試 93
4.5修改測試夾具 95
4.6探測邊界條件 96
4.7測試遠不止如此 99
第5章介紹重構名錄 101
5.1 重構的記錄格式 101
5.2挑選重構的依據 102
第6章第一組重構 105
6.1 提煉函式(Extract Function) 106
6.2 內聯函式(Inline Function) 115
6.3 提煉變數(Extract Variable) 119
6.4 內聯變數(Inline Variable) 123
6.5 改變函式聲明(Change Function Declaration) 124
6.6 封裝變數(Encapsulate Variable) 132
6.7 變數改名(Rename Variable) 137
6.8 引入參數對象(Introduce Parameter Object) 140
6.9 函式組合成類(Combine Functions into Class) 144
6.10 函式組合成變換(Combine Functions into Transform) 149
6.11 拆分階段(Split Phase) 154
第7章封裝 161
7.1 封裝記錄(Encapsulate Record) 162
7.2 封裝集合(Encapsulate Collection) 170
7.3 以對象取代基本類型(Replace Primitive with Object) 174
7.4 以查詢取代臨時變數(Replace Temp with Query) 178
7.5 提煉類(Extract Class) 182
7.6 內聯類(Inline Class) 186
7.7 隱藏委託關係(Hide Delegate) 189
7.8 移除中間人(Remove Middle Man) 192
7.9 替換算法(Substitute Algorithm) 195
第8章搬移特性 197
8.1搬移函式 198
8.2 搬移欄位(Move Field) 207
8.3 搬移語句到函式(Move Statements into Function) 213
8.4 搬移語句到調用者(Move Statements to Callers) 217
8.5 以函式調用取代內聯代碼(Replace Inline Code with Function Call) 222
8.6 移動語句(Slide Statements) 223
8.7 拆分循環(Split Loop) 227
8.8 以管道取代循環(Replace Loop with Pipeline) 231
8.9 移除死代碼(Remove Dead Code) 237
第9章重新組織數據 239
9.1 拆分變數(Split Variable) 240
9.2 欄位改名(Rename Field) 244
9.3 以查詢取代派生變數(Replace Derived Variable with Query) 248
9.4 將引用對象改為值對象(Change Reference to Value) 252
9.5 將值對象改為引用對象(Change Value to Reference) 256
第10章簡化條件邏輯 259
10.1 分解條件表達式(Decompose Conditional) 260
10.2 合併條件表達式(Consolidate Conditional Expression) 263
10.3 以衛語句取代嵌套條件表達式(Replace Nested Conditional with
Guard Clauses) 266
10.4 以多態取代條件表達式(Replace Conditional with Polymorphism) 272
10.5 弓|入特例(Introduce Special Case) 289
10.6 弓|入斷言(Introduce Assertion) 302
第11章重構API 305
11.1 將查詢函式和修改函式分離(Separate Query from Modifier) 306
11.2 函式參數化(Parameterize Function) 310
11.3 移除標記參數(Remove Flag Argument) 314
11.4 保持對象完整(Preserve Whole Object) 319
11.5 以查詢取代參數(Replace Parameter with Query) 324
11.6 以參數取代查詢(Replace Query with Parameter) 327
11.7 移除設值函式(Remove Setting Method) 331
11.8 以工廠函式取代構造函式(Replace Constructor with Factory Function) 334
11.9 以命令取代函式(Replace Function with Command) 337
11.10 以函式取代命令(Replace Command with Function) 344
第12章處理繼承關係 349
12.1 函式上移(Pull Up Method) 350
12.2 欄位上移(Pull Up Field) 353
12.3 構造函式本體上移(Pull Up Constructor Body) 355
12.4 函式下移(Push Down Method) 359
12.5 欄位下移(Push Down Field) 361
12.6 以子類取代類型碼(Replace Type Code with Subclasses) 362
12.7 移除子類(Remove Subclass) 369
12.8 提煉超類(Extract Superclass) 375
12.9 摺疊繼承體系(Collapse Hierarchy) 380
12.10 以委託取代子類(Replace Subclass with Delegate) 381
12.11 以委託取代超類(Replace Superclass with Delegate) 399
參考文獻 405
索引 409