Design Pattern 的價值#

作者在結語坦承,這本書並沒有提出全新的演算法或程式技巧,也沒有建立新的設計理論——它只是記錄既有的設計經驗。然而,將 design pattern 系統化地編目具有深遠意義:它提供了標準化的名稱與定義,讓我們得以研究、改進、並發展新的 pattern。

Design Pattern 對軟體設計的影響#

共同的設計詞彙(Common Design Vocabulary)#

  • 專家程式設計師的知識不只是語法,更包含**演算法、資料結構、慣用語(idiom)**等高層概念結構
  • Design pattern 提供設計師之間的共同語言,能在比設計符號或程式語言更高的抽象層次上討論系統
  • 當你吸收了這些 pattern,你的設計詞彙會改變——你會直接說「這裡用 Observer」或「把這些 class 做成 Strategy」

文件化與學習輔助(Documentation and Learning Aid)#

  • 理解 design pattern 能幫助你讀懂既有的大型物件導向系統——大多數大型 OO 系統都使用了這些 pattern
  • 初學者常抱怨繼承結構複雜、控制流難以追蹤,很大程度是因為不認識系統中的 pattern
  • 用 design pattern 來描述系統,讀者只需知道 pattern 名稱就能理解設計意圖,不必逆向工程整個設計

現有方法的補充(Adjunct to Existing Methods)#

  • OO 設計方法論定義了符號系統與規則,但未能捕捉專家設計師的經驗
  • Design pattern 展示了如何使用 object、inheritance、polymorphism 等基礎技術
  • Pattern 描述了設計中的 “why”,而不只是記錄決策結果
  • 從分析模型到實作模型的轉換並不如宣稱般順暢——彈性且可重用的設計往往包含分析模型中不存在的物件

Design pattern 是 OO 設計方法論中一直缺失的重要拼圖。完整的設計方法論還需要 analysis pattern、UI design pattern、performance-tuning pattern 等其他類型。

重構的目標(Target for Refactoring)#

物件導向軟體的生命週期經歷三個階段:

  • Prototyping 階段:快速原型開發,class 階層直接對映問題領域,以 white-box reuse(繼承)為主
  • Expansionary 階段:為滿足新需求而擴展,新增 class 與操作,軟體逐漸變得僵硬
  • Consolidating 階段:重構浮現——拆解 class、移動操作、合理化介面。Black-box reuse(物件組合)逐漸取代 white-box reuse

Design pattern 捕捉了許多重構後產生的結構。在設計初期就套用 pattern 可以預防日後的重構;即使在系統建構完成後才發現可用的 pattern,它仍能指引你如何改變設計。Pattern 為重構提供了明確的目標。

簡史#

  • 書的起源可追溯至 Erich Gamma 的博士論文(1991),當時約有一半的 pattern
  • OOPSLA ‘91 成為獨立的 catalog,Richard Helm 加入;John Vlissides 隨後加入;Ralph Johnson 在 OOPSLA ‘92 加入
  • 一些 pattern 名稱經歷了演變:Wrapper 變成 Decorator、Glue 變成 Facade、Solitaire 變成 Singleton、Walker 變成 Visitor
  • 作者發現:發現 pattern 容易,描述 pattern 困難——只有已經用過的人才能理解早期版本

Pattern 社群與 Alexander 的影響#

與 Christopher Alexander 的比較#

建築師 Christopher Alexander 首先研究建築與社區中的 pattern,並發展出 pattern language 來生成它們。GoF 的工作與 Alexander 有許多相似之處,也有重要差異:

面向軟體 Design PatternAlexander Pattern Language
方法論基礎基於觀察既有系統來尋找 pattern同樣基於觀察既有系統來尋找 pattern
描述格式使用模板描述 pattern同樣使用模板描述 pattern
表達方式依賴自然語言與大量範例而非形式語言同樣依賴自然語言與大量範例而非形式語言
領域歷史軟體歷史短暫建築有數千年歷史與經典案例
Pattern 排序沒有定義 pattern 的使用順序為 pattern 定義了使用順序
描述重點更詳細地描述解決方案強調 pattern 解決的問題
生成性宣稱不宣稱能生成完整程式宣稱 pattern 能生成完整建築

從 Alexander 的角度看,本書的 pattern 不構成 pattern language。作者認為不太可能存在完整的軟體 pattern language,但一定可以讓它更完整——需要加入 framework、UI design pattern、analysis pattern 等面向。

軟體中的 Pattern 運動#

  • OOPSLA ‘91 Bruce Anderson 主持的 workshop 是集體研究軟體架構的起點
  • 1994 年舉辦了第一屆 Pattern Languages of Programs 會議
  • 相關先驅包括 Donald Knuth 的《The Art of Computer Programming》、Graphics Gems 系列
  • James Coplien 的《Advanced C++: Programming Styles and Idioms》也有影響——其 pattern 較偏 C++ 特定且更低層

給讀者的邀請#

作者對讀者的三個建議:

  1. 使用 pattern:發展自己的 pattern 詞彙,在討論和記錄設計時使用它
  2. 成為批判性的消費者:給 pattern 作者回饋,pattern 的好處之一是讓設計決策從模糊直覺走向明確表達
  3. 記錄你發現的 pattern:不需要在研究機構才能找到 pattern,但要確保有人幫你審閱與打磨

結語#

最好的設計會使用許多彼此交織(dovetail and intertwine)的 design pattern 來產生更大的整體。如同 Christopher Alexander 所說:把 pattern 鬆散地串在一起,建築只是 pattern 的組裝品,不夠深邃。但若讓多個 pattern 在同一物理空間中重疊,建築就變得密集而深刻——在小空間中捕捉了豐富的意義。