此系列文章是我閱讀《Refactoring To Patterns》過程中實際演練的筆記。閱讀過程中發現若沒有相當的 Design Patterns、Refactoring 底子,此書真的不易閱讀,必須伴隨實際操作才能更理解每個步驟具體的方式,故在這記錄之餘也跟各位分享。
書中是使用 Java 的程式碼作為範例,而我比較熟稔 C#,所使用的演練環境為:Visual Studio 2017、ReSharper、VsVim。過程中會因應 ReSharper 的功能,所以有些許的調整以便更「優雅」的進行重構。
此篇是關於 8.2 Extract Composite 的具體演練。
此次的 smaple code 是我建立的,若有錯誤還請多包涵,詳細程式碼請見:https://github.com/mystic01/refactoringtopatterns。
這系列文停擺了一陣子,一部分原因是之前放空玩耍去了,更大的原因是這章節難產,書中提到的程式碼太過片段,有很多程式碼必須自行看字面意思腦補。更慘的是書中的程式碼好像有一點點錯誤。有點怪怪的部份我也自行腦補了:
FormTag
的toHTML()
,最末不是應該加個結尾 tag 比較合理些嗎?rawBuffer.append("</FORM>");
LinkTag
的putLinkStarTagInto()
中,if ( i<parsed.size() - 1)
,應該是if ( i<parsed.size() )
比較正確。書中重構後自然-1
就消失了,bug 修好了。XD
邊重構邊偷改 bug,這不是大忌嘛!!XD
以下,請搭配影片閱讀(數字表示影片時間、藍色表示重構技法、紫色表示我的困擾):
先說在前,這章節的重構著重在將商業邏輯雷同的部份給提取出來,覺得重寫的意味很重。或許是我功力不足,重構起來的節奏不太舒坦,每步的節奏感都不太對。:(
- 產生
CompositeTag
,並讓FormTag
與LinkTag
繼承它。0:00
- 將性質一樣的
nodeVector
、allNodeVector
統一為children
,並抽取至CompositeTag
(Pull Members Up)。1:03
- 將
FormTag
與LinkTag
toHTML()
中的步驟整理為三步:putStartTagInto()
、putChildrenTagInto()
、putEndTagInto()
並抽取至CompositeTag
成為 abstarct methods(template method)。4:12
- 此時發現
FormTag
與LinkTag
putStartTagInto()
當中的邏輯雷同,重構後共用該 method。8:35- 將
LinkTag
的putStartTagInto()
抽取至CompositeTag
並將使用到的變數、method 給抽象化,讓FormTag
可以共用。 - 執行測試確認沒問題後,再刪除
FormTag
中原有的putStartTagInto()
。
- 將
搞定!!
其他 Refacotirng To Patterns 影片請見:Refactoring To Patterns
不堪入目的練功過程:Refactoring To Patterns (exercise)