重構第二版的變更
重構第一版和第二版之間變更的簡要摘要
2018 年 9 月 5 日
在最廣泛的層面上,第二版的結構遵循第一版。這並不令人意外,因為第一版非常成功,我可能會繼續沿用行之有效的方法。
第一版以四個敘述章節開頭,這些章節也出現在第二版中。所有這些都遵循原書的廣泛形式。
開頭範例改變了其領域,因為現在沒有很多人熟悉影音出租店了。重構的流程大致相同:分解為函式、將計算與格式化分開、使用多型依類型組織計算。
原則和異味章節都經過徹底修改。有很多內容保留下來,也有很多內容改變了。我猜測大約四分之三的內容發生了變化,但這是一種直覺,而不是基於實際測量。測試章節必須完全重新編寫,特別是因為從 Java 變更為 JavaScript。
在這些引言章節之後,我繼續編寫目錄,我一直認為這是本書的核心。我稍後會更詳細地說明目錄變更,但一個顯著的結構變更是我編寫了一章初始重構,其中包含我認為首先學習的一組好的重構。
我刪除了後面的章節,這些章節探討了一些更切題的問題。我認為它們在第一版中很有效,但現在我認為在網站上發布這樣的文章會更好。這就是我從目錄中刪除四個「大型重構」的原因。大型重構總是與大多數重構有點不同,我確實認為這些範例更適合在我的網站上以文章形式呈現。
目錄變更
那麼目錄發生了什麼事?以下表格顯示了原始 68 個重構的命運。 [1]
名稱 | 頁碼 | 命運 | 替換 |
---|---|---|---|
新增參數 | 275 | 替換 | ➜ 變更函數宣告 |
將雙向關聯變更為單向 | 200 | 不存在 | |
將參考變更為值 | 183 | 保留 | |
將單向關聯變更為雙向 | 197 | 不存在 | |
將值變更為參考 | 179 | 保留 | |
壓縮階層 | 344 | 保留 | |
合併條件式 | 240 | 保留 | |
合併重複的條件片段 | 243 | 替換 | ➜ 滑動陳述式 |
分解條件 | 238 | 保留 | |
複製觀察到的資料 | 189 | 不存在 | |
封裝集合 | 208 | 保留 | |
封裝向下轉型 | 308 | 不存在 | |
封裝欄位 | 206 | 替換 | ➜ 封裝變數 |
萃取類別 | 149 | 保留 | |
萃取介面 | 341 | 不存在 | |
萃取方法 | 110 | 替換 | ➜ 萃取函數 |
萃取子類別 | 330 | 替換 | ➜ 使用子類別取代類型碼 |
萃取超類別 | 336 | 保留 | |
萃取變數 | 124 | 保留 | |
建立範本方法 | 345 | 不存在 | |
隱藏委派 | 157 | 保留 | |
隱藏方法 | 303 | 不存在 | |
內嵌類別 | 154 | 保留 | |
內嵌方法 | 117 | 替換 | ➜ 內嵌函數 |
內嵌暫存 | 119 | 替換 | ➜ 內嵌變數 |
引入斷言 | 267 | 保留 | |
引入外部方法 | 162 | 不存在 | |
引入區域延伸 | 164 | 不存在 | |
引入空物件 | 260 | 替換 | ➜ 引入特殊案例 |
引入參數物件 | 295 | 保留 | |
移動欄位 | 146 | 保留 | |
移動方法 | 142 | 替換 | ➜ 移動函數 |
參數化方法 | 283 | 替換 | ➜ 參數化函數 |
保留完整物件 | 288 | 保留 | |
上拉建構函數主體 | 325 | 保留 | |
上拉欄位 | 320 | 保留 | |
上拉方法 | 322 | 保留 | |
下推欄位 | 329 | 保留 | |
下推方法 | 328 | 保留 | |
移除參數指派 | 131 | 替換 | ➜ 分割變數 |
移除控制旗標 | 245 | 替換† | ➜ 使用中斷取代控制旗標 |
移除中間人 | 160 | 保留 | |
移除參數 | 277 | 替換 | ➜ 變更函數宣告 |
移除設定方法 | 300 | 保留 | |
重新命名方法 | 273 | 替換 | ➜ 變更函數宣告 |
使用物件取代陣列 | 186 | 不存在 | |
使用多型取代條件式 | 255 | 保留 | |
使用工廠方法取代建構函數 | 304 | 替換 | ➜ 使用工廠函數取代建構函數 |
使用物件取代資料值 | 175 | 替換 | ➜ 使用物件取代基本型別 |
使用繼承取代委派 | 355 | 不存在 | |
使用例外狀況取代錯誤碼 | 310 | 保留† | |
使用測試取代例外狀況 | 315 | 替換† | ➜ 使用前置檢查取代例外狀況 |
使用委派取代繼承 | 352 | 替換 | ➜ 以委派取代超類別 |
以符號常數取代魔術數字 | 204 | 替換† | ➜ 以文字取代魔術數字 |
以方法物件取代方法 | 135 | 替換 | ➜ 以命令取代函式 |
以防護子句取代巢狀條件式 | 250 | 保留 | |
以明確方法取代參數 | 285 | 替換 | ➜ 移出旗標參數 |
以方法取代參數 | 292 | 替換 | ➜ 以查詢取代參數 |
以資料類別取代記錄 | 217 | 替換 | ➜ 封裝記錄 |
以欄位取代子類別 | 232 | 替換 | ➜ 移出子類別 |
以查詢取代暫存 | 120 | 保留 | |
以類別取代類型碼 | 218 | 替換 | ➜ 使用物件取代基本型別 |
以狀態/策略取代類型碼 | 227 | 替換 | ➜ 使用子類別取代類型碼 |
以子類別取代類型碼 | 223 | 保留 | |
自行封裝欄位 | 171 | 替換 | ➜ 封裝變數 |
將查詢與修改器分開 | 279 | 保留 | |
分割暫存變數 | 128 | 替換 | ➜ 分割變數 |
替換演算法 | 139 | 保留 |
† 僅網路版本
標記為保留的重構出現在第二版中,名稱相同。標記為不存在的,則不在新版本中。我從新版本中刪除重構的原因有很多,我可能會在未來擴充本文,討論其中一些原因。標記為已取代的,在新版本中有一個名稱不同的重構。其中一些只是一個重新命名,例如我將「分割暫存變數」更改為「分割變數」。大多數是次要的概括,例如將「萃取方法」更改為「萃取函式」。這些概括中的許多反映了重寫較不以物件為中心的性質。在某些情況下,會結合一些第一版重構:例如,新增參數、移除參數和重新命名方法都由變更函式宣告取代。與我遺漏的那些一樣,我可能會在未來擴充本文,討論一些個別案例。[2]
新版本包含十五個完全新的重構,因為它們不是現有重構的概括或重新命名。這些是
將函式組合成類別 |
將函式組合成轉換 |
將陳述式移至函式 |
將陳述式移至呼叫者 |
移除死程式碼 |
重新命名欄位 |
重新命名變數 |
以函式取代命令 |
以查詢取代衍生變數 |
以函式呼叫取代內嵌程式碼 |
以管線取代迴圈 |
以參數取代查詢 |
以委派取代子類別 |
傳回修改後的數值 |
分割階段 |
我了解,單看名稱並無法傳達太多這些新的重構功能,或是概括性重構與第一版中的重構有何不同。我將適時更新線上目錄,提供更多相關資訊。
腳註
1: 這 68 個重構不包含原書中的四個「大型重構」。正如我先前所述,我認為這類主題最適合以網路文章的形式呈現。
2: 我是否這麼做,取決於讀者是否有興趣,以及我如何將此優先順序排在未來幾個月想寫的其他主題之前。