[RefactoringToPatterns] 7.6 Replace Conditional Dispatcher with Command

此系列文章是我閱讀《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

以下,請搭配影片閱讀(數字表示影片時間、藍色表示重構技法、紫色表示我的困擾):

  1. Extract Method,分別將兩個判斷條件中程式片段抽取為 method。0:00
    分別為 getNetworkshopResponse()getAllWorkshopResponse()

  2. getNetworkshopResponse() 抽取至 NetworkshopHandler class 中(Extract class)。1:25
    抽取之後就是一番整理,基本上就是透過 Extract Method,封裝細節、提高可讀性。
     
  3. getAllWorkshopResponse() 抽取至 AllWorkshopHandler class 中(Extract class)。5:08
    這段如同上一點,也是透過 Extract Method 的方式整理程式碼,但為了和書中更為一致。
    使用了一些技巧:
    1. Introduce VariableExtract Method7:21
    2. Introduce Parameter8:37
  4. 使 NetworkshopHandler 繼承於 abstract 的 Handler9:38
    1. getNetworkshopResponse() 重新命名為 execute()
    2. execute() 提取至 interface(Extract Interface)- Handler。再將 Handler 改為 abstract class。
      這邊不知道有沒有更好的方式,不那麼迂迴,還得先提取為 Interface 再改為 abstract class?直接 Extarct Superclass 會把 method 內容一併給提取出去,不合用。
    3. 修改一下 execute() 的簽章,使其可以順利編譯、測試。
  5. 同第四步,使 AllWorkshopHandler 繼承於 abstract 的 Handler11:35
     
  6. 將呼叫端的 NetwokshopHandlerAllWorkshopHandler 裝載進 Dictionary<string,Handler>,再依需求取用。13:35
    搞定!如此一來就有 command 的感覺了。
     

 

其他 Refacotirng To Patterns 影片請見:Refactoring To Patterns
不堪入目的練功過程:Refactoring To Patterns (exercise)