l

2016年5月19日 星期四

無關實作難易

May 17 17:24~18:48

螢幕截圖 2016-05-17 18.29.06

▲簡單又雋永的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》書中的例子:

以上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弄清楚,再來討論也不遲。

***

友藏內心獨白:不然會吵不完啊。

沒有留言:

張貼留言