物件導向設計的五個基本原則 SOLID


Posted by LYH on 2022-07-15

物件導向設計的五個基本原則 SOLID:

  • S - 單一職責原則 ( Single-responsibility principle;SRP )
  • O - 開放封閉原則 ( Open–closed principle;OCP )
  • L - 里氏替換原則 ( Liskov substitution principle;LSP )
  • I - 介面隔離原則 ( Interface segregation principle;ISP )
  • D - 依賴反向原則 ( Dependency inversion principle;DIP )

單一職責原則 SRP

一個模組應只對唯一的一個角色負責,當該角色的需求改變時,程式碼才會改變。

模組:類別 ( Class )
角色:特定群體的使用者。

若一個模組同時負責角色 A 和角色 B,當角色 A 的需求改變時,該模組就會改變,此時角色 B 就會受到影響,為避免這樣的狀況,可以將模組分別獨立,變成模組 A 負責角色 A,模組 B 負責角色 B,各自對自己的角色負責。可以發現,SRP 是一種根據不同角色進行分類的方法。

雖然這樣會使程式碼重複,但複製程式碼的成本絕對是比多個角色的調整、驗證,沒弄好還會跑出一堆 Bug 的成本低多了。

SRP 的好處:

  • 降低類別的複雜度
  • 提高類別的可讀性、可維護性
  • 降低因修改所造成其他功能的影響

開放封閉原則 OCP

一個軟體製品在面對擴展時是開放的,且擴充時不應修改到原有的程式。

開放擴展、關閉修改。

當系統一旦完成,若要新增或修改需求時,應該寫新的程式碼擴展出來 ( 相依性注入等方式 ),而不是修改原有的程式碼,可避免原本穩定的系統不小心被改壞。

開放封閉原則的關鍵在於程式的抽象化。

OCP 的好處:

  • 增加靈活性、穩定性
  • 降低修改而影響原本穩定系統的風險

里氏替換原則 LSP

若對於型態 S 每個物件 o1,都存在一個型態為 T 的物件 o2,使得在所有針對 T 編寫的程式 P 中用 o1 替代 o2 後,程式 P 的行為功能不變,則 S 是 T 的子型態。

換句話說:

子型態物件必須要能取代父型態物件,且要能夠做到取代而不改變功能。

子型態:物件導向的繼承關係
替代:繼承關係的一種使用方式

依照里氏替換原則,程式 P 不依賴於子型態類別的任何一個物件,且由於子型態類別實作了父型態介面的功能,因此子型態物件都會擁有與父型態介面同署名的方法,所以子型態物件能夠替換掉父型態物件而不改變功能。

父型態介面的目的是為了驗證實做出來的東西是否符合規格需求,可以幫助系統在擴展功能時,確保子型態模組的可靠性。

LSP 的好處:

  • 增加擴展性、可靠性

介面隔離原則 ISP

不應強迫客戶端依賴它不使用的方法。

客戶端也可以是高低層次模組之間的使用關係。

當某個類別變得過於肥大難以修改時,可以利用抽象介面將該類別分割成小的且具體的接口,每個接口都只有各自客戶端會使用到的方法,如此一來,工程師可以清楚的知道客戶端 ( 或模組 ) 需要哪些方法,且當未來如果有更好的類別可以替換掉過於肥大的類別時,直接替換即可,其他都不需要修改,不會違反開放封閉原則。

ISP 的好處:

  • 增加可讀性、可維護性

依賴反向原則 DIP

高層次的模組不應該依賴於低層次的模組,兩者都應該依賴於抽象介面。

當模組 A 在內部使用模組 B 時,稱模組 A 為高層次模組,模組 B 為低層次模組。

可以確保高層次模組在正常運作下,更換低層次模組。

DIP 的好處:

  • 增加擴展性

學習資源:
1.物件導向程式設計 - SOLID 設計原則 : SRP、OCP、LSP、ISP、DIP | 程式 x 概念 | 程式設計的武功心法 【Gamma Ray 軟體工作室】
2.使人瘋狂的 SOLID 原則
3.看到 code 寫成這樣我也是醉了,不如試試重構?
4.设计模式4 面向对象设计之单一职责原则SRP
5.物件導向設計原則—SOLID


#Design pattern #SOLID







Related Posts

binding in fragment

binding in fragment

[FE302] React 基礎 - hooks 版本:state

[FE302] React 基礎 - hooks 版本:state

重新看 Bandura(1977)的「Self-efficacy」這篇文章

重新看 Bandura(1977)的「Self-efficacy」這篇文章


Comments