軟件設計 六大原則

前言:所有的原則縮寫都是英文的首字母,如開閉原則(Open Closed Principle)是OCP。

總結場景:

先總結一一各個原則的作用。

  • 開閉原則:六大原則裏的一個基礎。其他原則都是他的實現或更嚴格的規範約束。
  • 接口隔離原則:類只服務於一個單一的模塊(模塊這個概念是一個虛的,需要具體項目具體分析)。
  • 單一職責原則:每個類只有一種作用。
  • 里氏替換原則:父類與子類實現繼承關係時,減少(繼承的)負面影響。
  • 依賴倒置原則:設計類與類之間的關係時,減少調用方與被調用方實體之間的關聯關係。
  • 迪米特原則:從函數的維度,規則調用方與被調用方的職責與聯繫。

 

開閉原則(Open Closed Principle)

核心

Software entities like classes, modules and functions should be open for extension but closed for modifications.

對擴展開放,對修改關閉。

作用

定義了新增和修改代碼時的理想方案。

優缺點

優點:對舊代碼無影響,修改或新增功能時,只需要開發和測試的時候新增部分。

缺點:對於只需要改原來代碼一兩行的情況,需要做重構或新增函數做修改,量比較大。開閉原則使用場景受限,一般只應用於對代碼要求很嚴格的項目。

 

接口隔離原則 (Interface Segregation Principle)

核心

  • 客戶端不應該依賴它不需要的接口。
  • 類間的依賴關係應該建立在最小的接口上。

簡而言之,理想情況接口只服務於一個模塊,不可以被多個模塊使用。

作用

給出了接口劃分的方法論。

優缺點

優點:

  • 將臃腫龐大的接口分解爲多個粒度小的接口,可以預防外來變更的擴散,提高系統的靈活性和可維護性。
  • 接口隔離提高了系統的內聚性,減少了對外交互,降低了系統的耦合性。
  • 使用多個專門的接口還能夠體現對象的層次,因爲可以通過接口的繼承,實現對總接口的定義。
  • 能減少項目工程中的代碼冗餘。過大的大接口裏面通常放置許多不用的方法,當實現這個接口的時候,被迫設計冗餘的代碼。

缺點:不適用於小型項目;接口劃分後,數量會增加,提升開發複雜度。

 

單一職責原則(Single Responsibility Principle)

核心

每一個類的職責唯一。

上面那句話看起來就是一句廢話,我舉例:現在有一個用戶類,有屬性(姓名,年齡)和動作(上班、回家)。但是類中的方法就包括了【維護屬性的函數】(我們叫BO)和【維護動作的函數】(BIZ)。這種情況下用戶類的職責就不是唯一的。所以需要拆成兩個類。一個只維護用戶信息,一個只維護用戶動作。

作用

明確一個類所負責的範圍,用於定義類。

優缺點

優點:

  • 類的複雜性降低,實現什麼職責都有清晰明確的定義;

  • 可讀性提高,複雜性減低,可讀性當然提高;

  • 可維護性提高,可讀性提高,可維護性當然提高;

  • 變更引起的風險減低,變更是必不可少的,如果接口的單一職責做得好,一個接口修改只對相應的類有影響,對其他接口無影響,這對系統的擴展性、維護性都有非常大的幫助。

缺點:類拆分後類的數量會增加。

單一職責與接口隔離的區別:

  • 根據接口隔離原則拆分接口時,類必須滿足單一職責原則。
  • 單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離。
  • 單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構建。

里氏替換原則(Liskov Substitution Principel

核心

  • 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。
  • 子類可以有個性化方法。
  • 當子類的方法重載父類的方法時,子類方法形參比父類形參更寬鬆,即子類的參數是父類參數的父類型(大於等於的關係)。
  • 當子類的方法實現父類的抽象方法時,子類方法返回是父類方法的子類型(小於等於的關係)。

概括:父類出現的地方子類都可以出現,子類出現的地方父類不一定可以(繼承的本質)。

作用

  • 克服了繼承中重寫父類造成的可複用性變差的缺點。
  • 保證類的擴展不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性。
  • 實現開閉原則的重要方式。

優缺點

繼承的優點:

  • 代碼共享,減少創建類的工作量,每個子類都擁有父類的方法和屬性;
  • 提高代碼的重用性;
  • 子類可以形似父類,但又異於父類;
  • 提高代碼的可擴展性;
  • 提高產品或項目的開放性。

繼承的缺點:

  • 繼承是侵入性的,只要繼承就必須擁有父類的所有屬性和方法;
  • 降低代碼的靈活性,子類必須擁有父類的屬性和方法,讓子類增加了約束;
  • 增強了耦合性,當父類的常量、變量和方法被修改時,必須考慮子類的修改。

 

依賴倒置原則 (Dependence Inversion Principle)

核心

High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions.
  • 高層模塊實現不依賴於低層模塊。
  • 實現模塊依賴於抽象模塊,抽象模塊不依賴於實現模塊。

作用

通過要面向接口的編程來降低類間的耦合性,要求我們在程序代碼中傳遞參數時或在關聯關係中,儘量引用層次高的抽象層類。

優缺點

優點:抽象類(對外暴露的類)更通用。

缺點:抽象類與實現類耦合太緊密。

 

迪米特原則(Law of Demeter)(Least Knowledge Principle)

核心

Talk only to your immediate friends and not to strangers.

只關注friend。出現在成員變量、方法的輸入輸出參數中的類稱爲friend類,而出現在方法體內部的類不屬於friend類。

作用

限制軟件實體之間通信的寬度和深度。

如果兩個類無須直接通信,那麼就不應當發生直接的相互調用,可以通過第三個類轉發該調用。(老公,老婆,老婆的公司)

從迪米特法則的定義和特點可知,它強調以下兩點:

  1. 從依賴者的角度來說,只依賴應該依賴的對象。
  2. 從被依賴者的角度說,只暴露應該暴露的方法。

優缺點

優點:解耦 ,增加類的可複用率和系統的擴展性。

缺點:過度使用迪米特法則會使系統產生大量的中介類,從而增加系統的複雜性,使模塊之間的通信效率降低。

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