重構:改善既有代碼的設計
[美] 馬丁·福勒(Martin Fowler)著 偉山育琪 譯
- 出版商: 清華大學
- 出版日期: 2025-10-01
- 售價: $894
- 語言: 簡體中文
- ISBN: 7302699798
- ISBN-13: 9787302699798
-
相關分類:
Refactoring
下單後立即進貨 (約4週~6週)
商品描述
"書中清晰揭示了重構的過程,解釋了重構的原理和實踐方式,並給出了何時以及何地應該開始挖掘代碼以求改善。書中給出了60多個可行的重構,每個重構都介紹了一種經過驗證的代碼變換手法的動機和技術。本書提出的重構準則將幫助開發人員一次一小步地修改代碼,從而減少了開發過程中的風險。 本書適合軟件開發人員、項目管理人員等閱讀,也可作為高等院校計算機及相關專業師生的參考讀物。依次解釋什麼是重構,為什麼要重構,如何通過“壞味道”識別出需要重構的代碼,以及如何在實踐中成功實施重構(無論用的是什麼編程語言)。 ● 理解重構的過程和重構的基本原則; ● 快速有效地應用各種重構手法,提升程序的表達力和可維護性; ● 識別代碼中能指示出需要重構的地方的“壞味道”; ● 深入了解各種重構手法,每個手法都包含解釋、動機、做法和範例4 個部分; ● 構建穩固的測試,以支持重構工作的開展; ● 理解重構過程的權衡取舍以及重構存在的挑戰等。 本書凝聚了軟件開發社區專家多年摸索而獲得的寶貴經驗,書中所蘊涵的思想和精華,值得反復咀嚼,而且往往能夠常讀常新。 "
作者簡介
馬丁·福勒,馬丁?福勒(Martin Fowler) 軟件開發大師,ThoughtWorks 科學家。他是一位作家、演說者、咨詢師。他致力於改善企業級的軟件設計,對設計以及支撐設計的工程實踐孜孜以求。他在重構、面向對象分析設計、模式、XP 和UML 等領域都有貢獻,著有《重構》《分析模式》《領域特定語言》等經典著作。 譯者簡介 熊節 在IT 行業已經打拼了18年,在金融、零售、政府、電信、制造業等行業的信息化建設方面有著豐富經驗,是中國IT業敏捷浪潮的領軍人物。熊節擁有利物浦大學MBA學位。 林從羽 ThoughtWorks軟件開發工程師,曾服務於國內外多家大型企業,致力於幫助團隊更快更好地交付可工作的軟件。擁抱敏捷精神,TDD愛好者,純鍵盤工作者。
目錄大綱
目錄
第 1 章 重構-入門示例 1
1.1 示例介紹 2
1.2 對示例代碼的評價 4
1.3 重構的前提:單元測試用例 5
1.4 分解statement函數 5
1.5 階段性展示:大量函數嵌套 18
1.6 模塊化拆分:計算模塊與輸出模塊 19
1.7 階段性展示:兩階段文件隔離 26
1.8 多態:按類型封裝計算邏輯 28
1.9 階段性展示:多態下的計算模塊 34
1.10 本章小結 35
第 2 章 重構的原則 37
2.1 什麼是重構 38
2.2 重構:身兼雙職 39
2.3 重構的意義 39
2.4 重構的時機 41
2.5 重構的挑戰 45
2.6 重構、架構和Yagni 49
2.7 重構與更廣泛的軟件開發過程 50
2.8 重構與性能 51
2.9 重構的起源 53
2.10 自動化重構 54
2.11 延伸閱讀 56
第 3 章 代碼中的“異味”(重構的信號) 57
3.1 神秘的命名 58
3.2 重復代碼 59
3.3 函數過長 59
3.4 參數列表過長 60
3.5 全局數據 60
3.6 可變數據 61
3.7 發散性變化 62
3.8 霰彈式修改 62
3.9 依戀情結 63
3.10 數據泥團 63
3.11 基本類型偏執 64
3.12 重復的switch語句 64
3.13 循環 65
3.14 冗贅的元素 65
3.15 誇誇其談通用性 65
3.16 臨時字段 65
3.17 過長的調用鏈 66
3.18 中間人 66
3.19 內幕交易 66
3.20 大類 67
3.21 異曲同工的類 67
3.22 數據類 67
3.23 被拒絕的饋贈 68
3.24 註釋 68
第 4 章 構建測試用例 69
4.1 測試用例的價值 70
4.2 待測試的示例代碼 71
4.3 第一個測試 74
4.4 繼續添加測試 76
4.5 修改測試數據 78
4.6 邊界用例(極端用例) 78
4.7 測試遠不止於此 81
第 5 章 重構手法清單 82
5.1 重構的講解格式 83
5.2 重構手法的選擇 84
第 6 章 第一組重構手法 85
6.1 提煉函數法(extract function) 86
6.2 內聯函數法(inline function) 93
6.3 提煉變量法(extract variable) 95
6.4 內聯變量法(inline variable) 98
6.5 修改函數聲明法(change function declaration) 99
6.6 封裝變量法(encapsulate variable) 105
6.7 修改變量名稱法(rename variable) 109
6.8 參數對象引入法(introduce parameter object) 110
6.9 函數組合成類法(combine functions into class) 114
6.10 函數組合成轉換法(combine functions into transform) 117
6.11 階段拆分法(split phase) 121
第 7 章 封裝 127
7.1 封裝記錄法(encapsulate record) 128
7.2 封裝集合法(encapsulate collection) 134
7.3 對象替代基本類型法(replace primitive with object) 138
7.4 函數替代臨時變量法(replace temp with query) 141
7.5 提煉新類法(extract class) 143
7.6 內聯類法(inline class) 146
7.7 隱藏委托法(hide delegate) 148
7.8 移除中間人(remove middle man) 150
7.9 算法替換法(substitute algorithm) 151
第 8 章 遷移特性 153
8.1 函數遷移法(move function) 154
8.2 字段遷移法(move field) 161
8.3 代碼遷移至函數法(move statements into function) 165
8.4 代碼遷移至調用者法(move statements to callers) 168
8.5 函數調用替換內聯代碼法(replace inline code with function call) 172
8.6 移動語句法(slide statements) 173
8.7 拆分循環法(split loop) 176
8.8 管道替代循環法(Replace Loop with Pipeline) 179
8.9 移除無用代碼(remove dead code) 183
第 9 章 組織數據 185
9.1 拆分變量法(split variable) 186
9.2 修改字段名稱(rename field) 188
9.3 查詢替代衍生變量法(replace nested conditional with guard clauses) 191
9.4 引用對象轉為值對象(change reference to value) 193
9.5 值對象轉為引用對象(change value to reference) 196
第 10 章 簡化條件邏輯 199
10.1 分解條件法(decompose conditional) 200
10.2 合並條件表達式法(consolidate conditional expression) 202
10.3 衛語句替代嵌套條件表達式法(replace nested conditional with guard clauses) 204
10.4 多態替代條件表達式法(replace conditional with polymorphism) 208
10.5 引入特例法(introduce special case) 220
10.6 引入斷言法(introduce assertion) 230
第 11 章 重構API 232
11.1 查詢函數—更新函數分離法(separate query from modifier) 233
11.2 函數參數化(parameterize function) 236
11.3 移除標誌參數法(remove flag argument) 238
11.4 保留完整對象法(preserve whole object) 242
11.5 查詢替代參數法(replace parameter with query) 245
11.6 參數替代查詢法(replace query with parameter) 248
11.7 移除賦值函數法(remove setting method) 251
11.8 工廠函數替代構造函數法(replace constructor with factory function) 252
11.9 命令替代函數法(replace function with command) 254
11.10 函數替代命令法(replace command with function) 259
第 12 章 處理繼承體系 263
12.1 函數上移法(pull up method) 264
12.2 字段上移法(pull up field) 266
12.3 構造函數本體上移法(pull up constructor body) 267
12.4 函數下移法(push down method) 270
12.5 字段下移法(push down field) 270
12.6 子類替代類型法(replace type code with subclasses) 271
12.7 移除子類法(remove subclass) 277
12.8 提煉父類法(extract superclass) 281
12.9 折疊繼承法(collapse hierarchy) 284
12.10 委托替代子類法(replace subclass with delegate) 285
12.11 委托替代父類法(replace superclass with delegate) 298



