UML软件工程组织

Design Pattern 新解
本文作者:蔡學鏞
什麼是 Design Pattern?許多人一講到 Design Pattern,就會扯到什麼建築設計,因為他們全都是看四人幫的「Design Patterns」經典本的解釋,沒消化就照單全收。 如果不能用更生活化的方式解釋 Design Pattern,我會懷疑他們是不是真的瞭解 Design Pattern 的真義。

什麼是 Pattern

Pattern 最簡單的定義是:只要是一再重複出現的事物,就是 Pattern。依照此定義,生活中就可以找到一堆 Pattern 的例子:

第四台廣告中的 Pattern

  1. 原價 ...,現在購買只要 ...,還送你一組 ...,請馬上來電 ...,如忙線中請稍後再撥。
  2. 利用分割畫面顯示出使用前使用後的差別,來加強說服力。例如:由 C 升級到 E(註:C E 不是指程式語言)。
  3. 找人現身說法:「傑瑞!感謝你介紹這套歐萊禮 Java 系列,讓我在短短的三個月內成為公司內首屈一指的 Java 專家,這實在是太神奇了!」

選舉時的 Pattern

1. 質疑對手 A 錢或搞婚外情
2. 把家人通通拉上台痛哭一場以示選情告急
3. 開口唱「愛拼才會贏」

其它像是金光黨的手法,刮刮樂詐財的技倆 ... 等,也都具有一再重複出現的特性,所以都可算是 Pattern

電影中的 Pattern

電影中也有大量的 Pattern,請看下面的例子。

提高追殺時緊張程度的 Pattern

  1. 壞人追殺好人時,好人躲進車子,卻發現車子發不動,引擎嘎嘎作響,一面努力地繼續發動,一面念念有詞「Come on, Come one」。
  2. 壞人追殺好人時,好人衝進電梯,死命地押著 close 按鈕,脫口而出「Come on, Come one」。
許多電影都會使用上述兩個 Pattern,雖然是老掉牙的 Pattern,但每次看到這裡,總是讓我緊張得心臟病差點發作,我不得不承認這兩個 Pattern 實在是挺有效的。

增加主角殺死壞人合理性的 Pattern

電影最後,壞人和好人大對決,最後好人勝利,但是好人如果直接把壞人宰了,那好人在觀眾心中的形象就會受損,所以好人先饒壞人一條生路,但是壞人卻壞到骨子裡了, 偷偷拿出一把槍瞄準好人,說時遲那時快,好人機警地察覺,為了自保於是將壞人一槍斃命。這個 Pattern 可以讓好人有人性,又讓壞人死有餘辜。

床戲的 Pattern

不管和劇情有沒有關係,編劇和導演總愛加上一段激情的床戲。這個 Pattern 相當困擾我和我的家人,因為每次看到這裡,我們保守的一家人往往覺得很尷尬,我們所反應出來的 Pattern 是:藉口倒茶水,上廁所,打電話 ... 而離座避風頭 ... 但眼睛仍不時偷瞄。

恐怖片的 Pattern

無須我舉例,電影驚聲尖叫(Scream)第一集就為我們剖析出恐怖片的一大堆 Pattern

公式化

好萊塢的電影比較多 Pattern,而歐洲的電影比較少 Pattern。至於昆丁塔倫提諾(Quentin Tarantino)編導的電影,完全是不按排理出牌,很難找到 Pattern。正因為好萊塢的電影很容易就可以找出 Pattern,所以常常會有似曾相似的感覺。許多人批評好萊塢的電影很「公式化」。

基本上,Pattern 就是一種公式化的表現。那麼,究竟公式化是不是好事?

以藝術來說,公式化的結果會造成僵化,所以負面效果居多。電影號稱是「第八藝術」,也是一種藝術創作,所以最好不要出現太多 Pattern,否則肯定被影評人痛批「了無新意」。

以工程來說,公式化是好事。這些公式都是「千錘百鍊」的結果,運用這些公式可以確保工程具備一定的品質,並加快工程的進行。而軟體開發也是一項工程,也需要盡量運用公式。 (軟體另有需要藝術的一面,這不在本文的討論範圍)。

什麼是 Design Pattern

所以,Pattern 就是一種「千錘百鍊」的智慧結晶。有經驗的專家和沒經驗的新手,差別就在於:有經驗的專家知道如何在適當的時機,套用某些公式(Pattern)以解決特定 的問題,這是專家經年累月所培養出來的 Know-How(請參見「軟體產業的知識經濟」一文)。

一般來說,物件導向軟體開發的程序可以粗略分成 OOA(物件導向分析)、OOD(物件導向設計)、OOP(物件導向實作)。在 OODObject-Oriented Design)階段所採用的 Pattern 就稱為 Design Pattern。運用良好的 Design Pattern,可以使得系統架構更優良(也更快完成),對於後續的 OOP、測試、維護,都會有很大的 幫助。Design Pattern 會告訴你,什麼情況下用 Delegation 而不要用繼承、什麼情況下用 Interface 而不要用 Class... 諸如此類的知識。這些都是軟體界前輩的智慧結晶。

我要強調 Design Pattern 專指 Design 時期的 Pattern。但是 Coding 時的 Pattern(例如程式碼內縮)最好不要稱為 Pattern,以免混淆。Coding 時期的 Pattern 最好稱為 Coding Style(或 Code Style)。

Design Pattern 這個名詞也可沿用到許多地方。我認為孫子兵法就是一本軍事領域 Design Pattern 的書,它告訴你什麼時候該採什麼樣的軍事動作。至於怎麼去砍人,則是屬於 implementation 的部分,不屬於孫子兵法的範圍。

什麼是 Anti-Pattern

並非所有的 Pattern 都是好的,不好的 Pattern 稱為 Anti-Pattern。如果你的系統中出現了 Anti-Pattern,就表示你犯了別人「常犯的典型錯誤」。簡言之,Anti-Pattern 就是錯誤的示範,要盡量避免。

Design Pattern 成為你的不時之需

許多人在設計階段才來喟嘆:「 Pattern 到用時方恨少。」其實你可以避免這樣的情況。現在市面上有許多本 Design Pattern Anti-Pattern 的書。只要好好把這些書讀過,體會每個 Pattern 的真正涵義,你可以在短短的時間內,功力激增一甲子。即使讀過的 Design Pattern,如果比較少用,一陣子之後也可能會忘記。 所以最好能隔一陣子就把 Design Pattern 的書拿出來複習。

 

版权所有:UML软件工程组织