[RefactoringToPatterns] 7.2 Replace Conditional Logic with Strategy

​此系列文章是我閱讀《Refactoring To Patterns》過程中實際演練的筆記。閱讀過程中發現若沒有相當的 Design Patterns、Refactoring 底子,此書真的不易閱讀,必須伴隨實際操作才能更理解每個步驟具體的方式,故在這記錄之餘也跟各位分享。

書中是使用 Java 的程式碼作為範例,而我比較熟稔 C#,在 GitHub 上找到了相當完整的 Refactoring To Pattern C# Sample Code ,可直接作為演練程式碼。而我的演練環境為:Visual Studio 2017、ReSharper、VsVim。過程中會因應 ReSharper 的功能,所以有些許的調整以便更「優雅」的進行重構。

此篇是關於 7.2 Replace Conditional Logic with Strategy 的具體演練。

以下,請搭配影片閱讀(數字表示影片時間):

  1. 將 Capital method 抽取至新的 CapitalStrategy class。
    1. 先將 Capital() 的內容抽取為 capital(),以便在 Loan 中保留 Capital()0:00
    2. capital() 及相關的兩個 method 抽取並同時產生新的 CapitalStrategy class。利用 ReSharper 的 Extarct Class 功能步到位。在抽取過程中可以保留兩邊的相互參照,美中不足的是 CapitalStartegy 對於 Loan 的參照會在建構子中傳入,而非於 capital() 中傳入,所以這邊必須再用 Change Singnature 修改一下 capital(),改為 capital(Loan loan),ReSharper 這個功能強大之處在於可以同時「自動」判斷 client 端要傳什麼值進來!0:20
       
  2. Duration method 仿照 capital 的方式抽至 CapitalStrategy。BUT!! 問題就在於這個 BUT,CapitalStrategy 這個 class 已經被建立,沒辦法再漂亮的用 Extract Class 的方式抽取 duration,這樣會產出兩個 CapitalStrategy。但小弟才疏學淺,不知道有沒有更好的方式可以將這些 method 一次搬移過去並且保有 reference 的關係。所以還是用這樣的方式抽取,再將兩個 CapitalStrategy 合併為一個。3:09
     
  3. 修改 Loan 的建構子,使 Strategy 改由外部傳入。這時候就一樣要用到 ReSharper 的 Change Singnature 功能,這次無法直接判斷呼叫端要傳入什麼引數,但可以自己設定為「new CapitalStrategy()」,超強的!!6:04
     
  4. 將創建 Loan 的幾個 Method 傳入的 CapitalStrategy 依序改為 CapitalStartegyTermLoanCapitalStrategyRevolverCapitalStrategyAdvisedLine,當然這三個 class 必須要繼承 CapitalStrategy。關於這個步驟,老實說這邊我覺得不是很優雅,頂多用了一個 Push Members Down,說穿了其實多還是用剪下、貼上的方式在建立這三個 class。7:37
     
  5. 將 CapitalStrategy 改為 abstract class。打完收工!13:00

 

以上是這個章節的分享,過程中有幾個步驟不是很優雅,如果有更好的方式請告訴我,萬分感激!!

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