軟件設計6大設計原則:SOLID

軟件設計有 6 大設計原則,合稱 SOLID

1、單一職責原則(Single Responsibility Principle,簡稱SRP )

  • 核心思想: 應該有且僅有一個原因引起類的變更
  • 問題描述: 假如有類Class1完成職責T1,T2,當職責T1或T2有變更需要修改時,有可能影響到該類的另外一個職責正常工作。
  • 好處: 類的複雜度降低、可讀性提高、可維護性提高、擴展性提高、降低了變更引起的風險。
  • 需注意: 單一職責原則提出了一個編寫程序的標準,用“職責”或“變化原因”來衡量接口或類設計得是否優良,但是“職責”和“變化原因”都是不可以度量的,因項目和環境而異。

2、里氏替換原則(Liskov Substitution Principle,簡稱LSP)

  • 核心思想: 在使用基類的的地方可以任意使用其子類,能保證子類完美替換基類。
  • 通俗來講: 只要父類能出現的地方子類就能出現。反之,父類則未必能勝任。
  • 好處: 增強程序的健壯性,即使增加了子類,原有的子類還可以繼續運行。
  • 需注意: 如果子類不能完整地實現父類的方法,或者父類的某些方法在子類中已經發生“畸變”,則建議斷開父子繼承關係 採用依賴、聚合、組合等關係代替繼承。

3、依賴倒置原則(Dependence Inversion Principle,簡稱DIP)

  • 核心思想:高層模塊不應該依賴底層模塊,二者都該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象;
  • 說明:高層模塊就是調用端,低層模塊就是具體實現類。抽象就是指接口或抽象類。細節就是實現類。
  • 通俗來講: 依賴倒置原則的本質就是通過抽象(接口或抽象類)使個各類或模塊的實現彼此獨立,互不影響,實現模塊間的鬆耦合。
  • 問題描述: 類A直接依賴類B,假如要將類A改爲依賴類C,則必須通過修改類A的代碼來達成。這種場景下,類A一般是高層模塊,負責複雜的業務邏輯;類B和類C是低層模塊,負責基本的原子操作;假如修改類A,會給程序帶來不必要的風險。
  • 解決方案: 將類A修改爲依賴接口interface,類B和類C各自實現接口interface,類A通過接口interface間接與類B或者類C發生聯繫,則會大大降低修改類A的機率。
  • 好處:依賴倒置的好處在小型項目中很難體現出來。但在大中型項目中可以減少需求變化引起的工作量。使並行開發更友好。

4、接口隔離原則(Interface Segregation Principle,簡稱ISP)

  • 核心思想:類間的依賴關係應該建立在最小的接口上
  • 通俗來講: 建立單一接口,不要建立龐大臃腫的接口,儘量細化接口,接口中的方法儘量少。也就是說,我們要爲各個類建立專用的接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調用。
  • 問題描述: 類A通過接口interface依賴類B,類C通過接口interface依賴類D,如果接口interface對於類A和類B來說不是最小接口,則類B和類D必須去實現他們不需要的方法。
  • 需注意:
  • 接口儘量小,但是要有限度。對接口進行細化可以提高程序設計靈活性,但是如果過小,則會造成接口數量過多,使設計複雜化。所以一定要適度
  • 提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情
  • 爲依賴接口的類定製服務。只暴露給調用的類它需要的方法,它不需要的方法則隱藏起來。只有專注地爲一個模塊提供定製服務,才能建立最小的依賴關係。

5、迪米特法則(Law of Demeter,簡稱LoD)

  • 核心思想: 類間解耦。
  • 通俗來講: 一個類對自己依賴的類知道的越少越好。自從我們接觸編程開始,就知道了軟件編程的總的原則:低耦合,高內聚。無論是面向過程編程還是面向對象編程,只有使各個模塊之間的耦合儘量的低,才能提高代碼的複用率。低耦合的優點不言而喻,但是怎麼樣編程才能做到低耦合呢?那正是迪米特法則要去完成的。

6、開放封閉原則(Open Close Principle,簡稱OCP)

  • 核心思想: 儘量通過擴展軟件實體來解決需求變化,而不是通過修改已有的代碼來完成變化
  • 通俗來講: 一個軟件產品在生命週期內,都會發生變化,既然變化是一個既定的事實,我們就應該在設計的時候儘量適應這些變化,以提高項目的穩定性和靈活性。

7、合成複用原則(Composite/Aggregate Reuse Principle,CARP)

  • 核心思想:是指儘量使用對象組合(has-a)/聚合(contanis-a),而不是繼承關係達到軟件複用的目的。可以使系統更加靈活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少
  • 通俗來講:繼承我們叫做白箱複用,相當於把所有的實現細節暴露給子類。組合/聚合也稱之爲黑箱複用,對類以外的對象是無法獲取到實現細節的(其實我們的注入也就是符合了合成複用原則)。


總結

  • 單一職責原則告訴我們實現類要職責單一
  • 里氏替換原則告訴我們不要破壞繼承體系
  • 依賴倒置原則告訴我們要面向接口編程
  • 接口隔離原則告訴我們在設計接口的時候要精簡單一
  • 迪米特法則告訴我們要降低耦合
  • 合成複用告訴我們根據具體業務增加組合對象
  • 而開閉原則是總綱,他告訴我們要對擴展開放,對修改關閉

設計模式從來都是組合來使用的,做到你中有我,我中有你,一個好的程序不是一個設計模式能搞定的。理解設計模式的思想纔是最重要的。

 


原文鏈接:https://blog.csdn.net/yakax/article/details/104398329

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章