重構(gòu)的時機和方法
鏈接:https://pan.baidu.com/s/1ab8z7OMoaCNl21jcccAIdw?pwd=a363?
提取碼:a363

每個代碼庫都包含一些錯誤和低效之處,你需要將其找出并完成修正。以正確的方式進行重構(gòu),代碼就會變得優(yōu)雅、易讀和易維護。在本書中,你將學習一種獨特的重構(gòu)方式,可以在5行或更少的代碼中實現(xiàn)任何方法。你還會發(fā)現(xiàn)大多數(shù)資深開發(fā)人員都知道的一個秘密::有時敲定代碼并在稍后進行修復會更快。
對所有技術(shù)水平的開發(fā)人員來說,本書是以全新視角審視重構(gòu)。在本書中,你將掌握作者的創(chuàng)新方法,學習一些具體的規(guī)則,將任何方法簡化為5行或更少。你將了解重構(gòu)的時機、適用于大多數(shù)常見問題的特定重構(gòu)模式,以及應該完全刪除的代碼特征。
● 壞代碼的標志
● 在甚至不理解代碼的情況下安全地改進它
● 平衡優(yōu)化和代碼通用性
● 正確的編譯器實踐
作者簡介
Christian Clausen是一名技術(shù)敏捷教練,主要教團隊如何重構(gòu)代碼。
目錄
第Ⅰ部分
通過重構(gòu)電腦游戲來學習
第1章 重構(gòu) 3
1.1 什么是重構(gòu) 4
1.2 技能:重構(gòu)什么 5
1.2.1 代碼異味示例 5
1.2.2 規(guī)則示例 6
1.3 文化:什么時候重構(gòu) 6
1.3.1 在遺留系統(tǒng)中重構(gòu) 7
1.3.2 什么時候不應該重構(gòu) 8
1.4 工具:如何(安全地)重構(gòu) 8
1.5 入門所需的工具 9
1.5.1 編程語言:TypeScript 9
1.5.2 編輯器:Visual Studio Code 9
1.5.3 版本控制:Git 10
1.6 總體示例:一款2D益智游戲 10
1.7 關于實際軟件的說明 12
1.8 本章小結(jié) 12
第2章 重構(gòu)的內(nèi)部原理 13
2.1 提高可讀性和可維護性 13
2.1.1 使代碼更好 13
2.1.2 維護代碼而不改變代碼作用 15
2.2 獲得速度、靈活性和穩(wěn)定性 16
2.2.1 優(yōu)先選擇組合而非繼承 16
2.2.2 通過添加而非修改來更改代碼 17
2.3 重構(gòu)與你的日常工作 18
2.4 在軟件上下文中定義“域” 18
2.5 本章小結(jié) 19
第3章 拆分長函數(shù) 21
3.1 建立第一條規(guī)則:為什么是5行 22
3.2 引入重構(gòu)模式來分解函數(shù) 24
3.3 分解函數(shù)以平衡抽象 32
3.3.1 規(guī)則:EITHER CALL OR PASS 32
3.3.2 應用規(guī)則 33
3.4 好的函數(shù)名稱的屬性 33
3.5 分解任務太多的函數(shù) 36
3.5.1 規(guī)則:IF ONLY AT THE START 36
3.5.2 應用規(guī)則 37
3.6 本章小結(jié) 39
第4章 讓類型代碼發(fā)揮作用 41
4.1 重構(gòu)一個簡單的if語句 41
4.1.1 規(guī)則:NEVER USE IF WITH ELSE 42
4.1.2 應用規(guī)則 43
4.1.3 重構(gòu)模式:REPLACE TYPE CODE WITH CLASSES 45
4.1.4 將代碼推入類 48
4.1.5 重構(gòu)模式:PUSH CODE
INTO CLASSES 51
4.1.6 內(nèi)聯(lián)一個多余的方法 55
4.1.7 重構(gòu)模式:INLINE METHOD 55
4.2 重構(gòu)一個大的if語句 57
4.2.1 去除泛化 61
4.2.2 重構(gòu)模式:SPECIALIZE METHOD 63
4.2.3 唯一允許的switch 65
4.2.4 規(guī)則:NEVER USE SWITCH 66
4.2.5 消除if 67
4.3 解決代碼重復問題 69
4.3.1 不能用抽象類代替接口嗎 71
4.3.2 規(guī)則:ONLY INHERIT FROM INTERFACES 71
4.3.3 所有這些代碼重復是怎么回事 72
4.4 重構(gòu)一對復雜的if語句 73
4.5 刪除無用代碼 76
4.6 本章小結(jié) 77
第5章 將類似的代碼融合在一起 79
5.1 統(tǒng)一相似的類 80
5.2 統(tǒng)一簡單條件 93
5.3 統(tǒng)一復雜條件 96
5.3.1 對條件使用算術(shù)規(guī)則 97
5.3.2 規(guī)則:USE PURE CONDITIONS 98
5.3.3 應用條件算術(shù) 100
5.4 跨類統(tǒng)一代碼 101
5.4.1 引入UML類圖描繪類關系 106
5.4.2 重構(gòu)模式:INTRODUCE STRATEGY PATTERN 108
5.4.3 規(guī)則:NO INTERFACE WITH ONLY ONE IMPLEMENTATION 114
5.4.4 重構(gòu)模式:EXTRACT INTERFACE FROM
IMPLEMENTATION 115
5.5 統(tǒng)一類似函數(shù) 118
5.6 統(tǒng)一類似代碼 121
5.7 本章小結(jié) 125
第6章 保護數(shù)據(jù) 127
6.1 無getter封裝 127
6.1.1 規(guī)則:DO NOT USE GETTERS OR SETTERS 127
6.1.2 應用規(guī)則 129
6.1.3 重構(gòu)模式:ELIMINATE GETTER OR SETTER 131
6.1.4 消除最后的getter 133
6.2 封裝簡單數(shù)據(jù) 136
6.2.1 規(guī)則:NEVER HAVE COMMON AFFIXES 136
6.2.2 應用規(guī)則 138
6.2.3 重構(gòu)模式:ENCAPSULATE DATA 143
6.3 封裝復雜數(shù)據(jù) 145
6.4 消除序列不變量 152
6.5 以另一種方式消除枚舉 155
6.5.1 通過私有構(gòu)造函數(shù)進行枚舉 155
6.5.2 將數(shù)字重新映射到類 157
6.6 本章小結(jié) 159
第Ⅱ部分 學以致用
第7章 與編譯器協(xié)作 163
7.1 了解編譯器 163
7.1.1 缺點:停機問題限制了編譯時知識 164
7.1.2 優(yōu)點:可達性確保方法返回 164
7.1.3 優(yōu)點:明確賦值防止訪問未初始化的變量 165
7.1.4 優(yōu)點:訪問控制有助于封裝數(shù)據(jù) 166
7.1.5 優(yōu)點:類型檢查證明屬性 166
7.1.6 缺點:取消引用null會使應用程序崩潰 167
7.1.7 缺點:算術(shù)錯誤導致溢出或崩潰 167
7.1.8 缺點:越界錯誤使應用程序崩潰 168
7.1.9 缺點:無限循環(huán)使應用程序停滯 168
7.1.10 缺點:死鎖和競爭條件導致意外行為 169
7.2 使用編譯器 170
7.2.1 使編譯器運行 171
7.2.2 不要對抗編譯器 173
7.3 信任編譯器 178
7.3.1 教編譯器不變量 178
7.3.2 注意警告 180
7.4 完全信任編譯器 180
7.5 本章小結(jié) 181
第8章 遠離注釋 183
8.1 刪除過時的注釋 184
8.2 刪除注釋掉的代碼 185
8.3 刪除不重要的注釋 186
8.4 將注釋轉(zhuǎn)換為方法名稱 186
8.5 保留記錄不變量的注釋 187
8.6 本章小結(jié) 188
第9章 喜歡刪除代碼 189
9.1 刪除代碼可能是下一個前沿 190
9.2 刪除代碼以消除偶然復雜性 190
9.2.1 缺乏經(jīng)驗導致的技術(shù)無知 191
9.2.2 時間壓力造成的技術(shù)浪費 192
9.2.3 環(huán)境造成的技術(shù)債務 192
9.2.4 增長帶來的技術(shù)拖累 192
9.3 根據(jù)親密程度對代碼進行分類 193
9.4 刪除遺留系統(tǒng)中的代碼 194
9.4.1 使用絞殺者模式進行了解 194
9.4.2 使用絞殺者模式改進代碼 196
9.5 從凍結(jié)項目中刪除代碼 196
9.5.1 將期望的結(jié)果設為默認 197
9.5.2 通過“探針并穩(wěn)定”模式最大
限度減少浪費 197
9.6 在版本控制中刪除分支 198
9.7 刪除代碼文檔 199
9.8 刪除測試代碼 200
9.8.1 刪除樂觀測試 200
9.8.2 刪除悲觀測試 200
9.8.3 修復或刪除不穩(wěn)定測試 201
9.8.4 重構(gòu)代碼以消除復雜的測試 201
9.8.5 專門化測試以加快速度 201
9.9 刪除配置代碼 202
9.10 刪除代碼以消除庫 203
9.11 從工作功能中刪除代碼 205
9.12 本章小結(jié) 206
第10章 永遠不要害怕添加代碼 207
10.1 接受不確定性:進入危險 207
10.2 使用探針實驗克服對構(gòu)建錯誤事物的恐懼 208
10.3 以固定比例克服對浪費或風險的恐懼 209
10.4 通過逐步改進克服對不完美的恐懼 210
10.5 復制和粘貼效果如何改變速度 211
10.6 通過可擴展性進行添加修改 211
10.7 通過添加修改可實現(xiàn)向后兼容 212
10.8 通過功能切換進行添加修改 213
10.9 通過抽象分支進行添加修改 216
10.10 本章小結(jié) 218
第11章 遵循代碼中的結(jié)構(gòu) 221
11.1 根據(jù)范圍和來源分類結(jié)構(gòu) 221
11.2 代碼反映行為的3種
方式 222
11.2.1 在控制流中表達行為 223
11.2.2 在數(shù)據(jù)結(jié)構(gòu)中表達行為 224
11.2.3 在數(shù)據(jù)中表達行為 227
11.3 添加代碼以暴露結(jié)構(gòu) 229
11.4 觀察而不是預測且使用經(jīng)驗技術(shù) 229
11.5 在不理解代碼的情況下獲得安全性 230
11.5.1 通過測試獲得安全性 230
11.5.2 通過掌握獲得安全性 230
11.5.3 通過工具輔助獲得安全性 230
11.5.4 通過正式驗證獲得安全性 231
11.5.5 通過容錯獲得安全性 231
11.6 識別未利用的結(jié)構(gòu) 231
11.6.1 通過提取和封裝來利用空白 231
11.6.2 通過統(tǒng)一來利用重復 233
11.6.3 通過封裝來利用共同詞綴 235
11.6.4 通過動態(tài)調(diào)度來利用運行時類型 236
11.7 本章小結(jié) 237
第12章 避免優(yōu)化和通用性 239
12.1 力求簡單 240
12.2 何時以及如何通用 241
12.2.1 最小化構(gòu)建以避免通用性 242
12.2.2 統(tǒng)一穩(wěn)定性相似的事物 242
12.2.3 消除不必要的通用性 242
12.3 何時以及如何優(yōu)化 243
12.3.1 優(yōu)化前重構(gòu) 243
12.3.2 根據(jù)約束理論進行優(yōu)化 245
12.3.3 使用指標指導優(yōu)化 247
12.3.4 選擇好的算法和數(shù)據(jù)結(jié)構(gòu) 248
12.3.5 使用緩存 249
12.3.6 隔離優(yōu)化代碼 250
12.4 本章小結(jié) 251
查看全部↓
前言/序言
在我很小的時候,父親就教我編程,因此自記事起我就一直在思考結(jié)構(gòu)。我總是以幫助他人為動力;這就是我生命的意義。因此,教學很自然地吸引著我。當我在大學有機會獲得助教職位時,我就立即接受了。
出于創(chuàng)業(yè)精神,我決定創(chuàng)辦一個學生組織,它有助于學生互相輔導。這個組織歡迎任何人參加或發(fā)言,且主題范圍廣泛,包括從輔修課程中學到的知識到課程未包含的高級主題。我相信這樣我就有機會講授知識。但事實證明,計算機科學工作者都很羞怯,因此我不得不連續(xù)主持近60周才讓組織運作起來。在此期間,我學到了很多,不僅有關我所教的課題,還包括有關教學方面的知識。這些討論也吸引了一群求知欲很強的人,使我遇到了我最好的朋友。
大學畢業(yè)后的一段時間內(nèi),我和一位朋友一起出去玩。我們很無聊,朋友就問我是否可以即興演講,因為我已經(jīng)做了很多這樣的演講。我回答說“讓我試試” 。我們打開了一臺筆記本計算機,一鼓作氣輸入了本書第Ⅰ部分的總體示例。
當我的手指離開鍵盤時,朋友十分震驚。他認為那是演示文檔,但我有不同的想法:我想教他重構(gòu)。