重構(gòu) 改善既有代碼的設(shè)計(jì) 第2版 英文版
定 價(jià):128 元
叢書名:職場(chǎng)
- 作者:[美]馬丁·福勒(Martin Fowler)
- 出版時(shí)間:2019/5/1
- ISBN:9787115510082
- 出 版 社:人民郵電出版社
- 中圖法分類:TP311.11
- 頁(yè)碼:407
- 紙張:
- 版次:01
- 開本:16開
本書是經(jīng)典著作《重構(gòu)》出版20年后的新版。書中清晰揭示了重構(gòu)的過程,解釋了重構(gòu)的原理和最佳實(shí)踐方式,并給出了何時(shí)以及何地應(yīng)該開始挖掘代碼以求改善。書中給出了60多個(gè)可行的重構(gòu),每個(gè)重構(gòu)都介紹了一種經(jīng)過驗(yàn)證的代碼變換手法的動(dòng)機(jī)和技術(shù)。本書提出的重構(gòu)準(zhǔn)則將幫助開發(fā)人員一次一小步地修改代碼,從而減少了開發(fā)過程中的風(fēng)險(xiǎn)。
本書適合軟件開發(fā)人員、項(xiàng)目管理人員等閱讀,也可作為高等院校計(jì)算機(jī)及相關(guān)專業(yè)師生的參考讀物。
1. 軟件開發(fā)大師的不朽經(jīng)典
2. 生動(dòng)闡述重構(gòu)原理和具體做法
3. 普通程序員進(jìn)階到編程高手必須修煉的秘笈
重構(gòu),一言以蔽之,是在不改變外部行為的前提下,有條不紊地改善代碼。20 多年前,正是《重構(gòu):改善既有代碼的設(shè)計(jì)》第1 版的出版,使重構(gòu)終于從編程高手們的小圈子走出,成為眾多普通程序員日常開發(fā)工作中不可或缺的一部分。如今,Martin Fowler 的《重構(gòu):改善既有代碼的設(shè)計(jì)》一書已經(jīng)成為全球有經(jīng)驗(yàn)的程序員手中的利器,既可用來改善既有代碼的設(shè)計(jì)、提升軟件的可維護(hù)性,又可用于使既有代碼更易理解、煥發(fā)出新的活力。
這本備受關(guān)注的第2 版在第1 版的基礎(chǔ)上做了全面修訂,反映了編程領(lǐng)域業(yè)已發(fā)生的許多變化。第2 版中介紹的重構(gòu)列表更加內(nèi)聚,并用JavaScript 語(yǔ)言重寫了代碼范例。此外,第2 版中還新增了與函數(shù)式編程相關(guān)的重構(gòu)范例,旨在教會(huì)讀者如何在沒有類的環(huán)境下開展重構(gòu)。
新版沿襲了第1 版的結(jié)構(gòu),依次解釋什么是重構(gòu),為什么要重構(gòu),如何通過“壞味道”識(shí)別出需要重構(gòu)的代碼,以及如何在實(shí)踐中成功實(shí)施重構(gòu)(無(wú)論用的是什么編程語(yǔ)言)。
本書將幫助讀者:
● 理解重構(gòu)的過程和重構(gòu)的基本原則;
● 快速有效地應(yīng)用各種重構(gòu)手法,提升程序的表達(dá)力和可維護(hù)性;
● 識(shí)別代碼中能指示出需要重構(gòu)的地方的“壞味道”;
● 深入了解各種重構(gòu)手法,每個(gè)手法都包含解釋、動(dòng)機(jī)、做法和范例4 個(gè)部分;
● 構(gòu)建穩(wěn)固的測(cè)試,以支持重構(gòu)工作的開展;
● 理解重構(gòu)過程的權(quán)衡取舍以及重構(gòu)存在的挑戰(zhàn)等。
本書凝聚了軟件開發(fā)社區(qū)專家多年摸索而獲得的寶貴經(jīng)驗(yàn),書中所蘊(yùn)涵的思想和精華,值得反復(fù)咀嚼,而且往往能夠常讀常新。
馬丁?福勒(Martin Fowler) 軟件開發(fā)大師,ThoughtWorks的科學(xué)家。他是一位作家、演說者、咨詢師和泛軟件開發(fā)領(lǐng)域的意見ling袖。他致力于改善企業(yè)級(jí)的軟件設(shè)計(jì),對(duì)設(shè)計(jì)以及支撐設(shè)計(jì)的工程實(shí)踐孜孜以求。他在重構(gòu)、面向?qū)ο蠓治鲈O(shè)計(jì)、模式、XP和UML等領(lǐng)域都有貢獻(xiàn)。著有《重構(gòu):改善既有代碼的設(shè)計(jì)》《分析模式》《領(lǐng)域特定語(yǔ)言》等經(jīng)典著作。
Chapter 1: Refactoring: A First Example / 重構(gòu),第一個(gè)示例 1
The Starting Point / 起點(diǎn) 1
Comments on the Starting Program / 對(duì)此起始程序的評(píng)價(jià) 3
The First Step in Refactoring / 重構(gòu)的第一步 5
Decomposing the statement Function / 分解statement方法 6
Status: Lots of Nested Functions / 進(jìn)展:大量嵌套函數(shù) 22
Splitting the Phases of Calculation and Formatting /
拆分計(jì)算階段與格式化階段 24
Status: Separated into Two Files (and Phases) /
進(jìn)展:分離到兩個(gè)文件(和兩個(gè)階段) 31
Reorganizing the Calculations by Type / 按類型重組計(jì)算過程 34
Status: Creating the Data with the Polymorphic Calculator /
進(jìn)展:使用多態(tài)計(jì)算器來提供數(shù)據(jù) 41
Final Thoughts / 結(jié)語(yǔ) 43
Chapter 2: Principles in Refactoring / 重構(gòu)的原則 45
Defining Refactoring / 何謂重構(gòu) 45
The Two Hats / 兩頂帽子 46
Why Should We Refactor / 為何重構(gòu) 47
When Should We Refactor / 何時(shí)重構(gòu) 50
Problems with Refactoring / 重構(gòu)的挑戰(zhàn) 55
Refactoring, Architecture, and Yagni / 重構(gòu)、架構(gòu)和YAGNI 62
Refactoring and the Wider Software Development Process /
重構(gòu)與軟件開發(fā)過程 63
Refactoring and Performance / 重構(gòu)與性能 64
Where Did Refactoring Come From / 重構(gòu)起源何處 67
Automated Refactorings / 自動(dòng)化重構(gòu) 68
Going Further / 延展閱讀 70
Chapter 3: Bad Smells in Code / 代碼的壞味道 71
Mysterious Name / 神秘命名 72
Duplicated Code / 重復(fù)代碼 72
Long Function / 過長(zhǎng)函數(shù) 73
Long Parameter List / 過長(zhǎng)參數(shù)列表 74
Global Data / 全局?jǐn)?shù)據(jù) 74
Mutable Data / 可變數(shù)據(jù) 75
Divergent Change / 發(fā)散式變化 76
Shotgun Surgery / 霰彈式修改 76
Feature Envy / 依戀情結(jié) 77
Data Clumps / 數(shù)據(jù)泥團(tuán) 78
Primitive Obsession / 基本類型偏執(zhí) 78
Repeated Switches / 重復(fù)的switch 79
Loops / 循環(huán)語(yǔ)句 79
Lazy Element / 冗贅的元素 80
Speculative Generality / 夸夸其談通用性 80
Temporary Field / 臨時(shí)字段 80
Message Chains / 過長(zhǎng)的消息鏈 81
Middle Man / 中間人 81
Insider Trading / 內(nèi)幕交易 82
Large Class / 過大的類 82
Alternative Classes with Different Interfaces / 異曲同工的類 83
Data Class / 純數(shù)據(jù)類 83
Refused Bequest / 被拒絕的遺贈(zèng) 83
Comments / 注釋 84
Chapter 4: Building Tests / 構(gòu)筑測(cè)試體系 85
The Value of Self-Testing Code / 自測(cè)試代碼的價(jià)值 85
Sample Code to Test / 待測(cè)試的樣例代碼 87
A First Test / 第一個(gè)測(cè)試 90
Add Another Test / 再添加一個(gè)測(cè)試 93
Modifying the Fixture / 修改測(cè)試夾具 95
Probing the Boundaries / 探測(cè)邊界條件 96
Much More Than This / 測(cè)試遠(yuǎn)不止如此 99
Chapter 5: Introducing the Catalog / 介紹重構(gòu)名錄 101
Format of the Refactorings / 重構(gòu)的記錄格式 101
The Choice of Refactorings / 挑選重構(gòu)的依據(jù) 102
Chapter 6: A First Set of Refactorings / 第一組重構(gòu) 105
Extract Function / 提煉函數(shù) 106
Inline Function / 內(nèi)聯(lián)函數(shù) 115
Extract Variable / 提煉變量 119
Inline Variable / 內(nèi)聯(lián)變量 123
Change Function Declaration / 改變函數(shù)聲明 124
Encapsulate Variable / 封裝變量 132
Rename Variable / 變量改名 137
Introduce Parameter Object / 引入?yún)?shù)對(duì)象 140
Combine Functions into Class / 函數(shù)組合成類 144
Combine Functions into Transform / 函數(shù)組合成變換 149
Split Phase / 拆分階段 154
Chapter 7: Encapsulation / 封裝 161
Encapsulate Record / 封裝記錄 162
Encapsulate Collection / 封裝集合 170
Replace Primitive with Object / 以對(duì)象取代基本類型 174
Replace Temp with Query / 以查詢?nèi)〈R時(shí)變量 178
Extract Class / 提煉類 182
Inline Class / 內(nèi)聯(lián)類 186
Hide Delegate / 隱藏委托關(guān)系 189
Remove Middle Man / 移除中間人 192
Substitute Algorithm / 替換算法 195
Chapter 8: Moving Features / 搬移特性 197
Move Function / 搬移函數(shù) 198
Move Field / 搬移字段 207
Move Statements into Function / 搬移語(yǔ)句到函數(shù) 213
Move Statements to Callers / 搬移語(yǔ)句到調(diào)用者 217
Replace Inline Code with Function Call / 以函數(shù)調(diào)用取代內(nèi)聯(lián)代碼 222
Slide Statements / 移動(dòng)語(yǔ)句 223
Split Loop / 拆分循環(huán) 227
Replace Loop with Pipeline / 以管道取代循環(huán) 231
Remove Dead Code / 移除死代碼 237
Chapter 9: Organizing Data / 重新組織數(shù)據(jù) 239
Split Variable / 拆分變量 240
Rename Field / 字段改名 244
Replace Derived Variable with Query / 以查詢?nèi)〈缮兞俊?48
Change Reference to Value / 將引用對(duì)象改為值對(duì)象 252
Change Value to Reference / 將值對(duì)象改為引用對(duì)象 256
Chapter 10: Simplifying Conditional Logic / 簡(jiǎn)化條件邏輯 259
Decompose Conditional / 分解條件表達(dá)式 260
Consolidate Conditional Expression / 合并條件表達(dá)式 263
Replace Nested Conditional with Guard Clauses /
以衛(wèi)語(yǔ)句取代嵌套條件表達(dá)式 266
Replace Conditional with Polymorphism / 以多態(tài)取代條件表達(dá)式 272
Introduce Special Case / 引入特例 289
Introduce Assertion / 引入斷言 302
Chapter 11: Refactoring APIs / 重構(gòu)API 305
Separate Query from Modifier / 將查詢函數(shù)和修改函數(shù)分離 306
Parameterize Function / 函數(shù)參數(shù)化 310
Remove Flag Argument / 移除標(biāo)記參數(shù) 314
Preserve Whole Object / 保持對(duì)象完整 319
Replace Parameter with Query / 以查詢?nèi)〈鷧?shù) 324
Replace Query with Parameter / 以參數(shù)取代查詢 327
Remove Setting Method / 移除設(shè)值函數(shù) 331
Replace Constructor with Factory Function / 以工廠函數(shù)取代構(gòu)造函數(shù) 334
Replace Function with Command / 以命令取代函數(shù) 337
Replace Command with Function / 以函數(shù)取代命令 344
Chapter 12: Dealing with Inheritance / 處理繼承關(guān)系 349
Pull Up Method / 函數(shù)上移 350
Pull Up Field / 字段上移 353
Pull Up Constructor Body / 構(gòu)造函數(shù)本體上移 355
Push Down Method / 函數(shù)下移 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 / 參考文獻(xiàn) 405