此系列文章是我閱讀《Refactoring To Patterns》過程中實際演練的筆記。閱讀過程中發現若沒有相當的 Design Patterns、Refactoring 底子,此書真的不易閱讀,必須伴隨實際操作才能更理解每個步驟具體的方式,故在這記錄之餘也跟各位分享。
書中是使用 Java 的程式碼作為範例,而我比較熟稔 C#,所使用的演練環境為:Visual Studio 2017、ReSharper、VsVim。過程中會因應 ReSharper 的功能,所以有些許的調整以便更「優雅」的進行重構。
此篇是關於 8.1 Form Template Method 的具體演練。
此次的 smaple code 是從 https://github.com/corywheeler/refactoringtopatterns 而來,整理後的詳細程式碼請見:https://github.com/mystic01/refactoringtopatterns。
以下,請搭配影片閱讀(數字表示影片時間、藍色表示重構技法、紫色表示我的困擾):
這篇只有兩個小步驟,或許更多的意義在於體悟什麼是「Template Method」吧。
- 將所有 class 的
Captial()
盡可能整理為RiskAmountFor() * Duration() * RiskFactorFor()
的樣式。0:00
※ 並將RiskAmountFor()
於 base class 定義為 abstract method,這我一直沒找到比較優雅的方式,只能傻傻的複製貼上...。0:17CaptialStrategyTermLoan
:將loan.GetCommmitment()
抽取為RiskAmountFor()
,搞定。- 在
CaptialStrategy
定義 abstract 的RiskAmountFor()
。 CapitalStrategyRevolver
:將loan.OutstandingRiskAmount()
抽取為RiskAmountFor()
,搞定。CapitalStrategyAdvisedLine
:將loan.GetCommmitment()
抽取為RiskAmountFor()
,搞定。
- 接著將
Capital()
抽取至CapitalStrategy
(Pull Members Up),使其成為 Template Method。2:08- 因
CapitalStrategyTermLoan
、CapitalStrategyAdvisedLine
的Capital()
與 Template Method 均相同,可刪除。 - 將
CapitalStrategyRevolver
的Capital()
整理為base.Capital() + UnusedCapital()
。
- 因
搞定~!!
其他 Refacotirng To Patterns 影片請見:Refactoring To Patterns
不堪入目的練功過程:Refactoring To Patterns (exercise)