May 17 17:24~18:48
▲簡單又雋永的pattern(翻拍自《A Pattern Language》)
關於pattern,尤其是GoF的design patterns,有時候會在網路上看到這樣的說法:
- 只要物件導向技術夠熟,其實不需要特別去學習GoF design patterns。
- GoF design patterns問世至今已經超過20年,書中所提到的許多pattern在新的程式語言裡面實作起來變得非常簡單,不需要特別學習,甚至沒有存在的必要。
要討論上述兩個觀點,先回顧「pattern之父」Christopher Alexander對於pattern的幾點看法:
- 一個模式(pattern)是在特定情境(context)之下,對於重複出現問題所提出的有效解決方案。
- 模式可以做為溝通的共同基礎(A common ground for communication)。
- 一個模式解決一個特定問題,一組相關的模式成為一個pattern language,可以解決一個大問題。
- 透過模式與模式語言做為追求「無名特質(quality without a name)」的方法。
***
只要物件導向技術夠熟,其實不需要特別去學習GoF design patterns
熟悉物件導向技術與學習GoF design patterns從來都不是互斥的事情,也沒有絕對的先後順序之分。Teddy認為最好的學習方法是採用「迭代與增量」的方式,了解基礎物件導向知識有助於學習GoF design patterns。反之亦然,學習GoF design patterns有助於更深入了解物件導向知識。
舉個例子,一個物件導向技術很熟練的人,遇到「因為介面不同而無法直接使用某個現存的元件(物件)」的問題,他們最後的解法是否會演化成「Adaptor pattern」的樣子?也許會,也許不會,但以Teddy所接觸到的經驗,就算對物件導向技術有一定程度理解的人,遇到這個問題的第一個反應大多是「直接把現有元件copy一份,然後把它的介面改掉」,而非產生Adaptor這個設計。
***
GoF design patterns問世至今已經超過20年,書中所提到的許多pattern在新的程式語言裡面實作起來變得非常簡單,不需要特別學習,甚至沒有存在的必要。
Pattern無關難易,所以用「某個pattern實作起來很簡單所以不需要成為一個pattern」這個論點本身就和pattern的定義沒有直接相關。每個人都可以當「事後諸葛亮」,但能夠成為「事前諸葛亮」的人卻總是少數。撇開天賦不談,想成為「事前諸葛亮」,超乎常人的努力與付出總是免不了的。
舉個例子,Observer實作難不難?很簡單啊,很多程式語言都內建對於Observer的支援。但實作Observer很簡單是否代表Observer這個pattern就可以從此消失在地球表面?當然不是,因為實作只是解決方案(solution)的一部分,而解決方案又只是pattern六大元素之一,其他五個部分還有context、problem、force、resulting context和name。
再隨便舉幾個《A Pattern Language》書中的例子:
- Entrance Transition(入口的過度空間)
- Zen View(禪宗景觀)
- Six-Foot Balcony(六英呎深的陽台)
- Fruit Trees(果樹林)
- Tree Places(樹蔭空間)
- Trellised Walk(棚下小徑)
- Alcoves(凹室)
以上7個建築領域的pattern,鄉民們不用建築系畢業,稍微花點時間讀一下也可以讀懂。簡不簡單?很簡單。是不是pattern?是pattern。
***
跳脫pattern的格式與難易度,pattern還有一個重要的目的,就是做為溝通的共同基礎(A common ground for communication)。Observer表達了「Subject與Observer之間一對多的狀態異動主動通知」這件事,有了這些以pattern為代表的詞彙,團隊成員之間便存在著共同的溝通語彙,有助於解決軟體開發中最大的問題之一:
To Build Shared Understanding
***
以上所說,並不表示GoF的23個pattern神聖不可侵犯。的確有不少人對這23個pattern提出改善甚至是「少用某些pattern」的建議,但Teddy相信這些建議的原因,絕對不是「實作好簡單所以這個pattern可以廢棄」。要引用別人的看法之前,請先把別人建議的原因,也就是背後的force弄清楚,再來討論也不遲。
***
友藏內心獨白:不然會吵不完啊。
沒有留言:
張貼留言