[GoF] 物件導向程式設計邏輯
此篇為各筆記之整理,非原創內容,資料來源主要為《JavaScript 設計模式與開發實踐》。
TL;DR
- 單一職責原則(SRP):一個方法只做一件事
- 最少知識原則(LKP):只暴露出必要的介面,盡可能減少軟體實體間的關聯性
- 開放封閉原則:如果使用擴展的方式就能夠簡單的解決問題,根本沒有必要耗時耗力的改變原本即有的程式。
單一職責原則(Single Responsibility Principle, SRP)
概念
「就一個類別而言,應該僅有一個引起它變化的原因《JavaScript 設計模式與開發實踐》」。
在單一職責原則中的職責,指的就是「引起變化的原因」。因為,簡單來說,單一職責原則指的就是「一個方法只做一件事」。
實務考量
「並不是所有的職責都該一一分離,如果有兩個職責總是同時變化,那就不必分離他們」,在單一職責原則中,困難的會是「可是該分離職責」。
另外,違反原則的情況並不少見,有時候我們會為了提供使用者更好的 DX 而違反原則,讓同一個方法帶有更多的功能。重要的不是一層不變的遵循原則,而是要知道「自己為什麼這樣做?以及這樣做是的取捨是什麼?」
優缺點
遵守 SRP 的原則有助於測試的撰寫,並降低單一方法、物件的複雜度,並且減少改變一個方法時,需要連動修改很多不同的地方。
雖然我們減少了單一方法或物件的複雜度,但過度或過多的切分卻有可能增加程的維護的複雜度,除了可能會增加 trace 程式的時間成本外,各個方法之間的聯繫和關聯也容易讓開發者迷失其中。
相關的設計模式
- 代理模式:不直接改變本體,而是在 proxy 中額外增添本體的功能
- 迭代器模式:不直接在函式內中物件或陣列的操作,而是透過迭代器來對物件或陣列進行操作
- 單例模式:把多個具有不同職責的單例拼裝起來使用
- 裝飾者模式:把多個具有不同職責的函式拼裝起來使用
最少知識原則(Least Knowledge Principle, LKP)
又被稱作迪米特法則(Law of Demeter, LoD),指的是「一個『軟體實體』應當盡可能少地與其他實體發生『交互作用』」。這裡的軟體實體,泛指「系統、類別、模組、函式、變數、...等」都是。
實作的方式
只暴露特定的介面/功能給使用者,讓物件之間的聯繫限制在最小範圍。
更簡單來說,不要把所有的變數都定義在全域(global),而是在需要用到的 function scope 中定義各自使用到的變數,廣義來說也符合最少知識原則的概念。