此系列文章是我閱讀《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 的具體演練。
以下,請搭配影片閱讀(數字表示影片時間):
- 將
Capital
method 抽取至新的CapitalStrategy
class。- 先將
Capital()
的內容抽取為capital()
,以便在Loan
中保留Capital()
。0:00 - 將
capital()
及相關的兩個 method 抽取並同時產生新的CapitalStrategy
class。利用 ReSharper 的 Extarct Class 功能半步到位。在抽取過程中可以保留兩邊的相互參照,美中不足的是CapitalStartegy
對於Loan
的參照會在建構子中傳入,而非於capital()
中傳入,所以這邊必須再用 Change Singnature 修改一下capital()
,改為capital(Loan loan)
,ReSharper 這個功能強大之處在於可以同時「自動」判斷 client 端要傳什麼值進來!0:20
- 先將
- 將
Duration
method 仿照 capital 的方式抽至CapitalStrategy
。BUT!! 問題就在於這個 BUT,CapitalStrategy
這個 class 已經被建立,沒辦法再漂亮的用 Extract Class 的方式抽取 duration,這樣會產出兩個CapitalStrategy
。但小弟才疏學淺,不知道有沒有更好的方式可以將這些 method 一次搬移過去並且保有 reference 的關係。所以還是用這樣的方式抽取,再將兩個CapitalStrategy
合併為一個。3:09
- 修改
Loan
的建構子,使 Strategy 改由外部傳入。這時候就一樣要用到 ReSharper 的 Change Singnature 功能,這次無法直接判斷呼叫端要傳入什麼引數,但可以自己設定為「new CapitalStrategy()
」,超強的!!6:04
- 將創建
Loan
的幾個 Method 傳入的 CapitalStrategy 依序改為CapitalStartegyTermLoan
、CapitalStrategyRevolver
、CapitalStrategyAdvisedLine
,當然這三個 class 必須要繼承CapitalStrategy
。關於這個步驟,老實說這邊我覺得不是很優雅,頂多用了一個 Push Members Down,說穿了其實多還是用剪下、貼上的方式在建立這三個 class。7:37
- 將 CapitalStrategy 改為 abstract class。打完收工!13:00
以上是這個章節的分享,過程中有幾個步驟不是很優雅,如果有更好的方式請告訴我,萬分感激!!
其他 Refacotirng To Patterns 影片請見:Refactoring To Patterns
不堪入目的練功過程:Refactoring To Patterns (exercise)