July 06 22:10~23:54
打個廣告,7月份【Design Patterns這樣學就會了入門實作班】招生中,早鳥優惠到7月10日。歡迎有興趣的朋友一起來進入Alexander的pattern世界與實作GoF的設計模式。
***
今天想聊一下pattern的起源。這裡的pattern不是指GoF的23個design patterns,而是建築師Alexander所提出的pattern方法。GoF的design patterns是參考Alexander在建築業應用pattern的作法,借用到軟體設計領域而發光發熱。更深入了解pattern的起源,有助於處理 所有的 大部分設計問題。
在1980年之前,建築師Alexander一共寫了以下四本書:
- Notes on the Synthesis of Form, 1964.
- The Oregon Experiment, 1975.
- A Pattern Language: Towns, Buildings, Construction, 1977.
- The Timeless Way of Building, 1979.
一般人對於pattern的定義,大多參考《A Pattern Language》或《The Timeless Way of Building》的說法。簡單地說,pattern就是在一個特定情境(context)中,針對重複出現問題所提出有效地解決方法。
今天要從《Notes on the Synthesis of Form》(形式綜合論)這本書來討論pattern。雖然在這本書中Alexander並沒有使用pattern這個字,但是用圖解(diagram)代表相同的意義。Alexander在思考設計問題,特別是如何設計出「完整產品」的這個問題,最後提出採用pattern方法。要了解pattern就要先理解Alexander對於設計的看法。
任何一個設計都必須考慮很多因素,以手機為例,設計者必須考慮成本、可靠性、易組裝性、零件可得性、耗電量、效能、尺寸、重量、耐用性、防水性等因素。Alexander將這些影響設計結果的因素稱為作用力(force)。這些作用力彼此互相影響,而且經常是互相牴觸。例如,耐用性高的手機(軍規)重量通常就不會太輕。便宜的零件其效能、可靠性通常較低。要減輕重量,可能需要許多特殊規格的零件,因此降低了零件可得性以及增加組裝困難度。
▼如下圖所示,將每一個作用力用一個黑點來表示,並且將這些交互影響的作用力之間用線連起來。如果同時考慮所有的作用力,設計將會變得極其複雜,超出設計師所能掌控的範圍。
▼Alexander的想法很簡單,他相信如果可以只考慮一組彼此互動較緊密的作用力,將其他作用力先排除其外,則可以簡化設計的困難。
▼以下圖為例,只考慮一小組作用力。針對這一小組作用力,可以得到一個實體關係(physical relationship)(也就是解決方案)滿足這些作用力。而pattern就是這個實體關係的抽像描述而以。換句話說,form(解決方案)是一組作用力的圖解(diagram),而pattern就是這個圖解的抽像描述。 所以pattern至少包含解決方案與作用力。
***
看到這裡,如果鄉民們可以理解上述說法,可能會想:「這又沒什麼,這只不過是『分而擊之』的解題方法而已啊。被切割出來的作用力小集合,具有較高的內聚力。和其他作用力之間,則具有較低的偶合度。」
沒錯,的確是如此。但Alexander進一步宣稱,他認為設計可以藉由一次套用一個pattern,而獲得具有整體性的設計(請參考《整體的感覺》)。至於這個宣稱的論述,就要參考在《Notes on the Synthesis of Form》問世之後15年所出版的《The Timeless Way of Building》書中尋找完整解答。
在《Notes on the Synthesis of Form》書中,Alexander還提到關於設計的定義。這個定義Teddy談過很多次:「設計就是決定form和context的界線。」Form就是問題的解決方案這個鄉民們應該可以理解,但怎麼又跑出個context出來?
▼Context中文可以翻譯成情境、環境、場合、上下文,也就是應用解決方案的地方。在真實世界中,存在一個問題,設計就是針對這個問題提出解決方案。但設計不能只考慮解決方案本身,還必須考慮這個解決方案應用於真實世界的環境(context)。根據Alexander的說法,context對於解決方案施加需求因而塑造出解決方案的樣子。
***
最後整理一下,為了解決一個設計問題(problem),找出一小組彼此緊密互動且衝突的作用力(forces),以及可以平衡這些作用力的解決方案(solution),這個解決方案必須發生在一個特定的環境(context)。將以上四個元素記錄下來,幫它一個名字,就成為pattern了(對照Teddy之前提過的pattern六大元素還少一個resulting context,可以先忽略它)。
經過一番討論,不知道鄉民們有沒有發現一件事,就是GoF的《Design Patterns》並沒有特別探討每一個pattern所要處理的作用力到底是什麼?甚至連每一個pattern要解決的問題都交代不清。弱化問題與作用力,很容易讓人只看到解決方案,發生誤用pattern的情況。就好像工具箱擺了一堆工具,如果不知道每一樣工具的用途(在什麼情境中用來解決什麼問題),很可能發生拿螺絲起子敲打釘子的情況。
***
友藏內心獨白:頭暈了。
***
延伸閱讀:
沒有留言:
張貼留言