一切都源自於 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides("Gang of Four", GOF, 四人幫)於 1994 年出版的書:「Design Patterns: Elements of Reusable Object-Oriented Software」,書中討論:
描述對特定問題精簡優雅的解決方案,關於追求更高的軟體再利用性與彈性,以簡明易用的形式表達。
短短幾行到盡 Design Patterns 的功能。
在書中,作者提及受到建築家 Christopher Alexander 的 A Pattern Language 啟發,想要捕抓既有系統運用的模式,將其抽絲剝繭後,將每個情境下需要的模式記錄下來。透過學習這些模式,人們可以更容易地在設計複雜的程式時,避免讓系統走向不容易維護、擴充的局面,畢竟,在軟體的世界裡「變動」才是常態,不易擴充將耗費更多的時間好同時滿足新、舊需求。
我個人的理解,學習模式後理解在不同情境下,如何設計出具有著優點的程式,同時,能夠縮小缺點的影響,換句話說,試著從大局觀思考程式在完成時的「樣貌」,什麼才是好的結果?試著將這套想法運用在建築學,那冷氣發明前,各地區的房子因為氣候的不同在設計上有不同的巧思,就是因應不同情境下完成的樣貌。
書中的範例主要使用 C++
,部分段落使用 Smalltalk
。這時我產生了一個疑惑,為什麼要使用 Smalltalk
?以現在的眼光來看,使用 Java
或是 C#
來學習物件導向會是更舒服的選擇。
所以有必要了解書本出版時,目前主流語言的情況。
C++
Java
Java
誕生於1995年5月23日。C#
C#
誕生於2000年。JavaScript
Java
誕生於1995年12月4日。Python
Ruby
Ruby
誕生於1995年12月。從上面的清單,可以明白當時最穩定、具有生產力的物件導向語言,非 C++
莫屬。
隨著時代演進,部分模式的概念、實作將會出現在語言的新標準內,當人們需要使用相關模式時,不用自己製作輪子,直接使用內建的函式或類別即可。最經典的便是 Iterator 模式,Java
已經有相似概念的內建類別(Collection
與 Iterator
)。
另一點是語言會發佈新的標準,修補當下語言的缺陷。 C++
已經經歷六次的改版,與 1994 年的 C++
差很多,有些作法肯定與當時 C++
的缺陷有關。最新版本的語言是否要完全運用呢?個人持保留態度。
啟發自一篇優文:設計模式其實是程式語言的缺陷?。
不要僵化地使用 Design Patterns 固有的解法,而是理解需求,在使用設計模式時,一併考慮程式語言的特性因事制宜。
對於這段深感認同,1994 年出版的書籍,肯定有一些語言限制導致開發上必須要使用特定的解來避開。假如使用不同的語言,一定要好好理解語言的特性,了解差異後,再試著將 Design Patterns 的精神表現出來。
拿網路遊戲的經驗,不同的武器有專屬的熟練度,該武器熟練度不夠的話,攻擊、使用招式時可能出現失誤。唯有提高熟練度才能百分之百地使用該招式。
對於特定的系統,開發出應對各種情況的處理手段。例如 Concurrency pattern 便是用來處理多執行緒的各種情況。
三大類、共 23 種模式:
之後將依序介紹各種模式。
短短幾行到盡 Design Patterns 的功能
道盡 Design Patterns 的功能 :)
JavaScript
抱歉,還沒出生,Java
誕生於1995年12月4日。
這裡應該是 JavaScipt
:)