重構第二版的變更

重構第一版和第二版之間變更的簡要摘要

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: 我是否這麼做,取決於讀者是否有興趣,以及我如何將此優先順序排在未來幾個月想寫的其他主題之前。