Design Patterns Learning Notes1
設計守則(Design Principle)
淺白敘述
-
找出程式中可能需要更動之處,把它們獨立出來,不要和那些不需要更動的程式碼混在一起。(把會變動的部分取出並封裝起來,以便可以以後可以輕易地擴充此部分,而不影響不需要更動的其他部分)
-
寫程式是針對介面而寫,而不是針對實踐方法而寫。(寫程式是針對超型態(supertype)而寫)
-
多用合成,少用繼承
-
設計時,盡量讓需要的互動的物件之間關係鬆綁
-
類別應該開放,以便擴充;應該關閉,禁止修改
-
依賴抽象類別,不要依賴具象類別
-
認識極少化守則 : 只和你的密友談話
-
別呼叫我們,我們會呼叫你(好萊塢守則)
-
一個類別應該只具有一個改變的理由
實際定義
-
單一職責原則 (SRP:Single Responsibility Principle)
- 一個類別,應該只有一個引起它變化的原因
-
開放、封閉原則 (OCP:Open Closed Principle)
- 對於擴展是開放的 (open for extension)
- 對於修改是封閉的 (closed for modification)
-
里氏(Liskov)代換原則 (LSP:Liskov Substitution Principle)
- 子類別必須能替換父類別。
-
介面隔離原則 (ISP:Interface Segregation Principle)
-
依賴倒轉原則 (DIP:Dependency Inversion Principle)
- 抽象不應該依賴細節,細節應該依賴抽像。因為抽像相對較穩定
- 高層模組不應該依賴低層模組,兩個都應該依賴抽像
- 針對接口編寫程式,不要對具體實現的東西編寫程式
-
迪米特法則 (LoD:Law of Demeter)
- 最少知識原則 Principle of Least Knowledge
- 只和自己眼前的朋友交談 Only talk to your immediate friends
-
低耦合
-
[例如]
郵差送來掛號信,須要蓋收件人印章
一般人不會叫郵差自己進屋找印章,既浪費時間也不安全
正常都是自己進屋拿,或是請其他家人幫忙拿
因為不應該給郵差進屋找東西的權限、郵差也不須要知道印章放在屋內何處
-
合成/聚合重覆使用原則 (CARP)(Composite/Aggregate Reuse Principle)
-
多用合成/聚合,少用繼承。
-
在兩個物件有 has-a (has-parts、is-part-of)關係時 => 合成/聚合 (A has a B)
-
當兩個物件有 is-a (is-a-kind-of)關係時 => 繼承 (Superman is a kind of Person)
-
合成 (Composite)
A、B兩物件有合成關係時,表示其中一個物件消失(ex:書本),另一個物件也會消失(ex:章節)
-
聚合 (Aggregate)
A、B兩物件有聚合關係時,表示其中一個物件消失(ex:球隊),另一個物件不會消失(ex:球員)
-
列表
縮寫 | 英文全名 | 中譯 |
---|---|---|
SRP | Single Responsibility Principle | 單一職責原則 |
OCP | Open Closed Principle | 開放、封閉原則 |
LSP | Liskov Substitution Principle | 里氏(Liskov)代換原則 |
ISP | Interface Segregation Principle | 介面隔離原則 |
DIP | Dependency Inversion Principle | 依賴倒轉原則 |
LoD | Law of Demeter | 迪米特法則 |
CARP | Composite/Aggregate Reuse Principle | 合成/聚合重覆使用原則 |