May 30 23:18~May 31 00:20
如果有人問你:「什麼是pattern?」,你會怎麼回答。
鄉民甲:(跳、跳)選我,選我。
Teddy:請作答。
鄉民甲:A pattern is a proven solution to a recurring problem in a specific context。
Teddy:還有沒有其他的解釋嗎?
鄉民甲:糟糕,只背到這一句。ㄟ,沒有,等你教。
***
關於pattern,除了上面那一句常見的解釋,還有另外一句鄉民們可能比較少聽到,但卻也是很重要的觀念,那就是Alexander在《The Timeless Way of Building》書中提到的:A pattern is a process and a thing。
蝦米?Pattern是「流程」也是「東西」?此話何解?
一個pattern本身表達一件「東西」,這個東西,以建築領域來說,可能是一張代表該pattern意境的照片;如果是軟體的pattern,可能是高階的設計圖或是程式實作的邏輯描述。
如果鄉民們手邊剛好有《A Pattern Language》這本書(應該是沒有人會有…XD),翻開書中的每一個pattern,第一眼看到的就是一張代表該pattern的照片。看一下這本書第548頁代表Entrance Transition(入口的過度空間)這個pattern的圖,再接著看這個pattern的目的。
Buildings, and especially house, with a graceful transition between the street and the inside, are more tranquil than those which open directly off the street.
看完圖之後再讀這個pattern的意圖就比較容易理解。
很可惜GoF的Design Patterns並沒有像Alexander一樣在每個patter開始之前先給張圖瞧瞧。不過Design Patterns裡面的Structure某種程度也扮演著類似的角色。畢竟軟體設計的patterns有時候不是那麼容易可以用一張圖或是照片來表達它的意涵。但是,如果鄉民們patterns的書看得夠多的話,就會發現有些人所寫的patterns是會參考Alexander原本的風格,在開始用文字描述pattern之前先提供一張照片。例如,《Patterns For Fault Tolerant Software》這本書的patterns寫作方式就是採用Alexander在《A Pattern Language》書中的寫作方式。
總之,pattern的第一個面向就是:要能夠讓人讀了之後知道這個pattern所代表的「東西」是個什麼樣的玩藝兒(請捲舌)。
***
Pattern的第二個面向就是:它是一個流程。鄉民們心中可能會想:「拜託,pattern是一個東西我勉強還能夠接受,pattern是一個流程這又是那招?」流程,是waterfall還是RUP這種流程嗎?還是Scrum?
都不是,這裡說的流程是指「讀了pattern的解決方案之後,鄉民們應該有能力能夠把這個pattern給實做出來」。如果做不到,就表示這個pattern可能寫得不夠好(迷之音:當然也有可能是讀pattern的人太笨…Orz)。
總之,pattern的這兩個面向,是在學習撰寫pattern時很重要的觀念。以Teddy自己的經驗,要同時把「東西」跟「流程」都描述得很好其實並不容易(寫作本來就是一件很難的事情)。姑且先不管寫作pattern,畢竟大部分的鄉民都屬於「pattern使用者」,而非「pattern產生者」。請鄉民們思考一下,「A pattern is a process and a thing」這個事實對於「學習pattern」這件事有何幫助?
下集待續。
***
友藏內心獨白:難不成patterns是黑白郎君嗎?