此系列文章是我閱讀《Refactoring To Patterns》過程中實際演練的筆記。閱讀過程中發現若沒有相當的 Design Patterns、Refactoring 底子,此書真的不易閱讀,必須伴隨實際操作才能更理解每個步驟具體的方式,故在這記錄之餘也跟各位分享。
書中是使用 Java 的程式碼作為範例,而我比較熟稔 C#,所使用的演練環境為:Visual Studio 2017、ReSharper、VsVim。過程中會因應 ReSharper 的功能,所以有些許的調整以便更「優雅」的進行重構。
此篇是關於 7.6 Replace Conditional Dispatcher with Command 的具體演練。
此次的 smaple code 是我建立的,若有錯誤還請多包涵,詳細程式碼請見:https://github.com/mystic01/refactoringtopatterns。
以下,請搭配影片閱讀(數字表示影片時間、藍色表示重構技法、紫色表示我的困擾):
- Extract Method,分別將兩個判斷條件中程式片段抽取為 method。0:00
分別為getNetworkshopResponse()
及getAllWorkshopResponse()
。
- 將
getNetworkshopResponse()
抽取至NetworkshopHandler
class 中(Extract class)。1:25
抽取之後就是一番整理,基本上就是透過 Extract Method,封裝細節、提高可讀性。
- 將
getAllWorkshopResponse()
抽取至AllWorkshopHandler
class 中(Extract class)。5:08
這段如同上一點,也是透過 Extract Method 的方式整理程式碼,但為了和書中更為一致。
使用了一些技巧:- 先 Introduce Variable 再 Extract Method。7:21
- Introduce Parameter。8:37
- 使
NetworkshopHandler
繼承於 abstract 的Handler
。9:38- 將
getNetworkshopResponse()
重新命名為execute()
。 - 將
execute()
提取至 interface(Extract Interface)-Handler
。再將Handler
改為 abstract class。
※ 這邊不知道有沒有更好的方式,不那麼迂迴,還得先提取為 Interface 再改為 abstract class?若直接 Extarct Superclass 會把 method 內容一併給提取出去,不合用。 - 修改一下 execute() 的簽章,使其可以順利編譯、測試。
- 將
- 同第四步,使
AllWorkshopHandler
繼承於 abstract 的Handler
。11:35
- 將呼叫端的
NetwokshopHandler
及AllWorkshopHandler
裝載進Dictionary<string,Handler>
,再依需求取用。13:35
搞定!如此一來就有 command 的感覺了。
其他 Refacotirng To Patterns 影片請見:Refactoring To Patterns
不堪入目的練功過程:Refactoring To Patterns (exercise)