設計模式 (DesignPattern) 與典範 (Pardiams)

在閱讀 致 JavaScript 開發者的 Functional Programming 指南 文章時發現這部分知識快被忘光了,需要複習一下 設計模式 (Design pattern)典範 (Paradigm) 的定義。

什麼是設計模式(Design Pattern)

軟體工程中,設計模式(design pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。這個術語是由埃里希·伽瑪(Erich Gamma)等人在1990年代從建築設計領域引入到計算機科學的。

設計模式並不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。物件導向設計模式通常以類別物件來描述其中的關係和相互作用,但不涉及用來完成應用程式的特定類別或物件。設計模式能使不穩定依賴於相對穩定、具體依賴於相對抽象,避免會引起麻煩的緊耦合,以增強軟體設計面對並適應變化的能力。

並非所有的軟體模式都是設計模式,設計模式特指軟體「設計」層次上的問題。還有其他非設計模式的模式,如架構模式。同時,演算法不能算是一種設計模式,因為演算法主要是用來解決計算上的問題,而非設計上的問題。

From Wiki

狹義而言是指 Gof 的 23 個設計模式,廣義而言就是指一些程式元件實作時的模式。

Gof 的 23 個設計模式有些使用時機並不多,有些因為太常用了,已經變成許多程式或框架內建的一部分,像是

  • Javascript 語言的 Proxy、Observer
  • Laravel 框架的 Builder、Factory

這些都已經是內建的功能。

其實有點像是程式語言的歷史,你可以不懂 Observer 怎麼出現的,只要懂的怎麼用也可以寫出你想要的功能,只是學習了設計模式,就可以了解他設計的來源與想法,或許哪天你也可以開發出屬於你自己的設計模式

什麼是典範(Paradigm)

典範 (Paradigm) 意指的是:特定的程式設計風格。

常見的典範有:物件導向程式設計 (Object-oriented Programming,簡稱 OOP)、函式程式設計 (Functional Programming,簡稱 FP),兩者最大差別在於,OOP 是以實作物件為基礎,而 FP 是以函式來解決所有的問題。

目前主流還是 OOP,如果你有機會實作 FP 的話,要注意到在實作 FP 時會犧牲效能與記憶體,但是他的優點是:

  • 讓邏輯變小更容易測試
  • 減少達成目的所需要的程式狀態數量
  • 更動程式狀態要用簡單且容易察覺的方式來做
  • 減少不必要的程式的執行順序以及調用次數和細節的思考
  • 減低程式碼的閱讀成本,快速的讓 Reviewer 知道你要做什麼,而且不用擔心有問題

設計模式與典範可否混用?

設計模式與規範混用是常態

一個專案可能出現各種設計模式與典範,像是常見的 Laravel 框架,內建就包含了很多設計模式,如:

  • Builder Pattern
  • Factory pattern
  • Strategy pattern
  • Provider pattern
  • Repository pattern
  • Facade pattern

參考