What have you found for these years?

2008-04-18

忘掉 design patterns

我也真的是在寫了一些架構比較龐大的程式後,才漸漸有了這樣的感覺。
如果要形容的話,那就像是《倚天屠龍記》中張無忌學習太極拳那樣,
招式是死的,運用是活的,死招學完之後,就應該全部忘掉。那時候
其實也不太懂為什麼要把招式忘掉,就跟旁邊的眾人一樣,無法理解
以為他們腦袋壞掉了。沒想到,在後來寫程式的時候,居然會聯想到
這一段。當時小學生的我,恐怕完全無法想像吧...

接著,腦中就會浮現 reader 的那句話:「當人們把僅僅是模式字典的
Design Patterns, 當作是唯一的經典時,在你翻開書之前,你已經誤讀了。」

那時候我也真的是不懂為什麼會這樣說。為什麼不是經典?
這本書有什麼錯?

其實這本書一點錯都沒有。不過如果沒有看到一堆人在吹捧
design patterns, 我大概也不會覺得為什麼需要這樣說吧?

design patterns, design patterns, design patterns....
碰到問題就是 design patterns, 真的讓我有點傻眼。
一個新手有個問題,回答是去讀某個 design pattern.
基本上我認為,design pattern 是經驗下的產物,
對於沒有經驗的 programmer, 我不覺得 design patterns
是能夠被讀懂的。大概會有這樣的感覺:每一個字都看得懂,
組成句子也看得懂,組成文章就不知所云了。為什麼?
喔。所以呢?想必腦中會不斷浮現這些問題。

我剛讀 design patterns 其實也是。是看得懂,但是不明白
為什麼要這樣做?也不明白這樣做究竟有什麼好處。漸漸地,
才能慢慢理解這樣做的原因。這就是由需求去決定 pattern,
而不是這個 problem fit 這個 pattern, 所以把這個 pattern
填進去。

有些人體會到 pattern 的好處,開始宣揚 pattern, 這邊是
pattern, 那邊是 pattern, 這樣是這個 pattern, 那樣是那個
pattern, 這樣就是反因為果了。pattern 不應該是無中生有,
他應該要從 problem 中誕生,而不是 pattern 去填 problem.

pattern 濫用下去就會發現其實程式是不能這樣寫的。pattern
不是萬靈丹,他是死的,他不能 fit 所有的 problem. 當你
不斷想去套用 pattern 時,認定某個寫法/問題不是某個 pattern 時,
就已經陷入 pattern 迷思了。我覺得可以從兩個角度去看:

1. 所有的程式寫法都能歸納到某些 pattern 上。所有的寫法都是
這幾個基本 pattern 的變形。那麼我會說 state 和 strategy 是一樣的。
factory 和 factory method, 也是相近的。其他不舉例了,能夠縮減到
只有少數幾個基本 pattern.

2. 其實所有的 pattern 都完全不一樣。這就是招式是死的,真的用上的
東西,肯定會跟原始 pattern 不一樣,因為要解決的問題,通常是不會
相同的。相同的話請不要重新造輪 XD 如果是要改善輪子,那 pattern
當然更是不會一樣。

為什麼 constructor 不能綁行為?如果我的 problem domain 這兩件事
是等價的,那為什麼不就把他們放在一起?不然要處處多寫一行嗎?
然後決定改變行為時,又要 find & replace.

我覺得,很多人寫程式都忘記寫程式的原因是什麼了。如果只會照著
規則去寫,完全不去考量這樣做到底有什麼好有什麼壞,那無怪會被
稱作是「程式工人」,無怪會把 coding/programming 當成下品了。

你要做畫匠你自己去做。方法論本來就有很多面向,沒什麼絕對的。

我覺得很多寫 java 的人都變成這種樣子了,這也是我不喜歡 java 的原因之一。
合不來啊。

不過不可否認的是,我也很常把 pattern 放在嘴上。我是覺得那只是一種概念,
一種表達「類似」這樣的方法,而不是真的要這個方法。
程式是活的,不要寫成死的。去針對每個問題寫,需要重複利用時
再把他們全部提出來。那是實作問題,不是設計問題。
pattern 會從中誕生,而不是把 pattern 丟進去。

2008-04-18

1 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0