l

2016年3月10日 星期四

然後不小心就重構成Strategy了…嗎?!

March 09 21:30~22:42

螢幕截圖 2016-03-09 22.43.28

▲雖然都是虎斑貓,但不是同一隻啊

 

先打個廣告,3月19、20 (六、日)舉辦的「Scrum敏捷方法實作班」已經確定開課,早鳥優惠到3/11(禮拜五),對敏捷開發有興趣的朋友們歡迎參加。

***

有朋友針對〈用Introduce Parameter Object移除Long Parameter List怪味道〉留言,提到:

然後不小心就重構成strategy了...算了,不重要,忘了那個名稱吧~ :-)」

原本想回覆這位朋友的留言,但他自己把留言刪了。既然這位朋友提出這種觀點,可能也有其他相民有類似的看法,剛好最近都在忙沒什麼料,就借用這位朋友的留言…的屍體(因為留言已刪除XD)…來寫一篇好了。

***

▼先回顧一下〈用Introduce Parameter Object移除Long Parameter List怪味道〉重構後的結果:

螢幕截圖 2016-03-09 10.04.30

螢幕截圖 2016-03-09 10.11.11

 

Range類別和Strategy有不小的差別,原因如下:

  • 目的不同
    • Range是參數物件,目的是把參數打包,減少傳入函數的「數量」,更進一步則可將屬於操作這些參數的行為搬移到它的身上。
    • Strategy定義並封裝一群可互相替代的演算法,通常會有多個Strategy的實作類別,而參數物件並沒有種特性。
  • 結構不同
    • Range包含了資料(data member)與操作(operation)。
    • Strategy主要包含操作(演算法),大部分的資料應該都存放在Ccontext身上。請參考下面的Strategy類別圖。

 

Strategy_Pattern_in_UML

▲圖片取自wikipedia

***

很多時候設計不需要拘泥在名稱上面,正所謂Quality Without A Name。但如果兩個觀念本身Quality不同,要把它們說成同一件事,感覺也有點怪。

***

友藏內心獨白:謝謝鄉民留言發表看法。

1 則留言: