iT邦幫忙

2021 iThome 鐵人賽

DAY 3
1
Software Development

也該是時候學學 Design Pattern 了系列 第 3

Day 03: 面對 Design Pattern 該有的知識

Design Patterns(設計模式)的起點

一切都源自於 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 啟發,想要捕抓既有系統運用的模式,將其抽絲剝繭後,將每個情境下需要的模式記錄下來。透過學習這些模式,人們可以更容易地在設計複雜的程式時,避免讓系統走向不容易維護、擴充的局面,畢竟,在軟體的世界裡「變動」才是常態,不易擴充將耗費更多的時間好同時滿足新、舊需求。

我個人的理解,學習模式後理解在不同情境下,如何設計出具有著優點的程式,同時,能夠縮小缺點的影響,換句話說,試著從大局觀思考程式在完成時的「樣貌」,什麼才是好的結果?試著將這套想法運用在建築學,那冷氣發明前,各地區的房子因為氣候的不同在設計上有不同的巧思,就是因應不同情境下完成的樣貌。

Design Patterns 出版的時空背景

書中的範例主要使用 C++,部分段落使用 Smalltalk。這時我產生了一個疑惑,為什麼要使用 Smalltalk?以現在的眼光來看,使用 Java 或是 C# 來學習物件導向會是更舒服的選擇。

所以有必要了解書本出版時,目前主流語言的情況。

  • C++
    • 誕生於1985年。
    • 1994年到2021年之間,推出六個穩定版,分別在 1998(C++98)、2003(C++03)、2011(C++11)、2014(C++14)、2017(C++17) 以及 2020(C++20)。
  • Java
    • 抱歉,還沒出生,Java 誕生於1995年5月23日。
  • C#
    • 抱歉,還沒出生,C# 誕生於2000年。
  • JavaScript
    • 抱歉,還沒出生,Java 誕生於1995年12月4日。
  • Python
    • 誕生於1991年。
  • Ruby
    • 抱歉,還沒出生,Ruby 誕生於1995年12月。

從上面的清單,可以明白當時最穩定、具有生產力的物件導向語言,非 C++ 莫屬。

相較於現代,該書可能有的不適?

隨著時代演進,部分模式的概念、實作將會出現在語言的新標準內,當人們需要使用相關模式時,不用自己製作輪子,直接使用內建的函式或類別即可。最經典的便是 Iterator 模式,Java 已經有相似概念的內建類別(CollectionIterator)。

另一點是語言會發佈新的標準,修補當下語言的缺陷。 C++ 已經經歷六次的改版,與 1994 年的 C++ 差很多,有些作法肯定與當時 C++ 的缺陷有關。最新版本的語言是否要完全運用呢?個人持保留態度。

所以,語言有缺陷囉?

啟發自一篇優文:設計模式其實是程式語言的缺陷?

不要僵化地使用 Design Patterns 固有的解法,而是理解需求,在使用設計模式時,一併考慮程式語言的特性因事制宜。

對於這段深感認同,1994 年出版的書籍,肯定有一些語言限制導致開發上必須要使用特定的解來避開。假如使用不同的語言,一定要好好理解語言的特性,了解差異後,再試著將 Design Patterns 的精神表現出來。

拿網路遊戲的經驗,不同的武器有專屬的熟練度,該武器熟練度不夠的話,攻擊、使用招式時可能出現失誤。唯有提高熟練度才能百分之百地使用該招式。

後續的影響

對於特定的系統,開發出應對各種情況的處理手段。例如 Concurrency pattern 便是用來處理多執行緒的各種情況。

書中的組成

三大類、共 23 種模式:

  • Creational patterns - 攸關物件的生成程序
    • Abstract factory
    • Builder
    • Factory method
    • Prototype
    • Singleton
  • Structural patterns - 處理類別或物件的合成問題
    • Adapter
    • Bridge
    • Composite
    • Decorator
    • Facade
    • Flyweight
    • Proxy
  • Behavioural patterns - 處理類別或物件之間的互動方式及責任分配
    • Chain of responsibility
    • Command
    • Interpreter
    • Iterator
    • Mediator
    • Memento
    • Observer
    • State
    • Strategy
    • Template method
    • Visitor

之後將依序介紹各種模式。


上一篇
Day 02: JavaScript 與 物件導向程式設計
下一篇
Day 04: 進入主題前的補充:SOLID
系列文
也該是時候學學 Design Pattern 了31
0
TD
iT邦新手 4 級 ‧ 2021-09-18 22:56:28

短短幾行到盡 Design Patterns 的功能

道盡 Design Patterns 的功能 :)

TD iT邦新手 4 級 ‧ 2021-09-18 22:57:51 檢舉

JavaScript
抱歉,還沒出生,Java 誕生於1995年12月4日。

這裡應該是 JavaScipt :)

0
TD
iT邦新手 4 級 ‧ 2021-09-18 23:13:37

所以,語言有缺陷囉?
啟發自一篇優文:設計模式其實是程式語言的缺陷?

我覺得這是一個很好的問題!這裡提供另外的觀點:

我要留言

立即登入留言