l

2015年6月3日 星期三

什麼是Pattern(8):兩種命名方式

May 19 17:45~18:10

螢幕截圖 2015-05-19 18.01.48

 

前情提要:

***

螢幕截圖 2015-05-19 17.35.13

改了這麼多回,範例8看起來總算長的比較像pattern的樣子。今天是這系列最後一集,pattern的六大元素只剩Name還沒有介紹。範例8這個pattern的名字就留給鄉民們幫它命名,本集Teddy想談pattern命名的兩種方法:

  • 名詞片語 (Noun-phrase):描述模式所建立或產生的結果,例如Singleton、Command、Model-View-Controller。
  • 動詞片語 (Verb-phrase):給定一個指令,描述如何達到模式解決方案所要求的狀態,例如Don’t Talk to Strangers、Separate Material Preparation from Integration。

這不是上英文課學習英文文法,名詞片語與動詞片語和pattern密切相關。這又要回到Alexander書中對於pattern的描述,請參考圖4:

螢幕截圖 2015-05-19 17.54.54

 

Pattern是一個雙面人,它的一面表示套用pattern的過程(流程),另一面表示套用pattern的結果(套用後所造出來的東西)。幫pattern取名字的時候,如果我們想表達套用pattern之後所完成的東西,就用名詞片語;如果想表示套用pattern的過程,就用動詞片語。

Pattern社群有一個習慣,盡量使用名詞片語來命名。確切的原因Teddy猜想可能是Alexander在《A Pattern Language》書中的253個pattern全部都是名詞,而GoF書中的23個pattern也都是名詞。仔細一想也很合理,原本Alexander就是採用pattern來描述建築領域所建造出來的「東西」,所以以名詞作為pattern名稱也是理所當然的事。例如半隱蔽花園(Half-Hidden Garden)、入口的過渡空間(Entrance Transition)、六英呎深的陽台(Six-Foot Balcony)、禪宗景觀(Zen View)等。

***

Teddy:考考你。

鄉民甲:儘管考!

Teddy:Martin Fowler的重構(Refactoring)是不是一種pattern?

鄉民甲:(又是陷阱題嗎?)我覺得不是,因為它不但是動詞片語,而且完全沒有符合pattern的寫作格式。

Teddy認為refactoring也是一種pattern。雖然refactoring全部都是動詞片語,例如提煉類別(Extract Class)、搬移欄位(Move Field)、重新命名函數(Rename Method)等,但每一個refactoring的內容至少滿足Pattern定義4,只不過Fowler在他的書中沒有採用Teddy所介紹的pattern格式來撰寫。只要細細體會Fowler書中每一則refactoring的內容,也可以將其改寫成符合本系列文章所介紹的pattern六大元素的格式。不信?請看範例9。

螢幕截圖 2015-05-19 17.58.22

 

如果要將範例9寫成更完整的pattern格式需要更多的細節與精煉的過程,但Teddy相信現有內容已足夠展示refactoring可以被改寫成pattern格式。

***

鄉民甲:你不是說大部份的pattern都採用名詞片語,為什麼refactoring要特立獨行採用動詞片語?

Teddy:這個問題很好,還記得我之前提到「A pattern is a process and a thing」這個觀念嗎?因為refactoring的定義就是「在不修改軟體系統外部行為的前提之下改善其內部結構」,透過一連串的小修改步驟以確保這樣的改善行動不會破壞原有的行為。既然refactoring本質上就是一連串的修改動作,所以強調「process」面向也是理所當然。

鄉民甲:原此如此。

Teddy:除此之外我認為還有另一個原因,就是refactoring根本沒辦法強調「thing」。以Rename Method為例,重新命名之後的函數可能性太多,根本無法用名詞片語來描述。如果真的要用名詞片語,會變成Intention-Revealing Name這個pattern,就沒有辦法強調refactoring原本要強調的「process」(修改動作)的面向。

鄉民甲:想不到光是名詞片語與動詞片語的差別,居然有這麼多名堂啊。

***

友藏內心獨白:這就是層次。

沒有留言:

張貼留言