[RefactoringToPatterns] 8.2 Extract Composite

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

這系列文停擺了一陣子,一部分原因是之前放空玩耍去了,更大的原因是這章節難產,書中提到的程式碼太過片段,有很多程式碼必須自行看字面意思腦補。更慘的是書中的程式碼好像有一點點錯誤。有點怪怪的部份我也自行腦補了:

  1. FormTagtoHTML(),最末不是應該加個結尾 tag 比較合理些嗎?rawBuffer.append("</FORM>");
  2. LinkTagputLinkStarTagInto() 中,if ( i<parsed.size() - 1) ,應該是 if ( i<parsed.size() ) 比較正確。書中重構後自然 -1 就消失了,bug 修好了。XD
邊重構邊偷改 bug,這不是大忌嘛!!XD

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

先說在前,這章節的重構著重在將商業邏輯雷同的部份給提取出來,覺得重寫的意味很重。或許是我功力不足,重構起來的節奏不太舒坦,每步的節奏感都不太對。:(
  1. 產生 CompositeTag,並讓 FormTagLinkTag 繼承它。0:00
     
  2. 將性質一樣的 nodeVectorallNodeVector 統一為 children,並抽取至 CompositeTag (Pull Members Up)。1:03
     
  3. FormTagLinkTag toHTML() 中的步驟整理為三步:putStartTagInto()putChildrenTagInto()putEndTagInto()並抽取至 CompositeTag 成為 abstarct methods(template method)。4:12
     
  4. 此時發現 FormTagLinkTag putStartTagInto() 當中的邏輯雷同,重構後共用該 method。8:35
    1. LinkTagputStartTagInto() 抽取至 CompositeTag 並將使用到的變數、method 給抽象化,讓 FormTag 可以共用。
    2. 執行測試確認沒問題後,再刪除 FormTag 中原有的 putStartTagInto()

搞定!!

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