面向對象設計原則

  設計原則是設計模式的理論基礎,設計模式就是它們的實踐。七大設計原則簡單概括以下表所示:程序員

設計原則 歸納 目的
開閉原則 對擴展開放,對修改關閉 下降維護帶來的新風險
里氏替換原則 不要破壞繼承體系,子類重寫方法功能發生改變,不該該影響父類方法的含義 防止繼承氾濫
依賴倒置原則 高層不該該依賴低層,要面向接口編程 更利於代碼結構的升級擴展
單一職責原則 一個類只幹一件事,實現類要單一 便於理解,提升代碼的可讀性
接口隔離原則 一個接口只幹一件事,接口要精簡單一 功能解耦,高聚合、低耦合
迪米特原則 不應知道的不要知道,一個類應該保持對其它對象最少的瞭解,下降耦合度 減小代碼臃腫
合成複用原則 儘可能使用組合或者聚合關係實現代碼複用,少使用繼承 下降代碼耦合

一、開閉原則

     原則思想: 軟件實體應當對擴展開放,對修改關。
     描述:一個軟件產品在生命週期內,都會發生變化,既然變化是一個既定的事實,當應用的需求改變時,在不修改軟件實體的源代碼或者二進制代碼的前提下,能夠擴展模塊的功能,使其知足新的需求。
     優勢:提升代碼的可複用性,提升軟件的可擴展性和可維護性。編程

二、里氏替換原則

     思想: 繼承必須確保超類所擁有的性質在子類中仍然成。
     描述:子類能夠擴展父類的功能,但不能改變父類原有的功能。子類能夠實現父類的抽象方法,但不能覆蓋父類的非抽象方法,子類中能夠增長本身特有的方法。 反映了基類與子類之間的關係,是對開閉原則的補充,是對實現抽象化的具體步驟的規範。
     優勢:增長程序的健壯性, 類的擴展不會給已有的系統引入新的錯誤,下降了代碼出錯的可能性。設計模式

三、依賴倒置原則

     思想:高層次的模塊不該該依賴於低層次的模塊,它們都應該依賴於抽象,抽象不該該依賴於具體實現,具體實現應該依賴於抽象。
     描述:
 在軟件設計中,細節具備多變性,而抽象層則相對穩定,所以以抽象爲基礎搭建起來的架構要比以細節爲基礎搭建起來的架構要穩定得多。  使用接口或者抽象類的目的是制定好規範和契約,而不去涉及任何具體的操做,把展示細節的任務交給它們的實現類去完成。依賴倒置原則是實現開閉原則的重要途徑之一,它下降了客戶與實現模塊之間的耦合。
     優勢: 下降類間的耦合性; 提升代碼的可讀性和可維護性; 減小並行開發引發的風險。架構

四、單一職責原則

     思想:一個類(或方法www.ingxxx4.com)只負責一件事情。 就是控制類的粒度大小、將對象解耦、提升其內聚性。
     描述: 又稱單一功能原則,這裏的職責是指類變化的緣由,單一職責原則規定一個類應該有且僅有一個引發它變化的緣由,不然類應該被拆分。 若是一個對象承擔了太多的職責,至少存在兩個缺點:一、一個職責的變化可能會削弱或者抑制這個類實現其餘職責的能力;二、當客戶端須要該對象的某一個職責時,不得不將其餘不須要的職責全都包含進來,從而形成冗餘代碼或代碼的浪費。
    優勢:下降類和類的耦合, 下降類的複雜度, 提升可讀性,增長可維護性和可拓展性,下降可變性的風險。app

五、接口隔離原則

     原則思想:類和類之間應該創建在最小接口的上。
     描述:
 要求程序員儘可能將臃腫龐大的接口拆分紅更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。 要爲各個類創建它們須要的專用接口,而不要試圖去創建一個很龐大的接口供全部依賴它的類去調用。
     優勢:提升程序的靈活度,提升內聚,減小對外交互,使得最小的接口作最多的事情。框架

     注意: 接口的粒度須要合理定義,若是 定義太小,則會形成接口數量過多,使設計複雜化;若是定義太大,靈活性下降,沒法提供定製服務,給總體項目帶來沒法預料的風險。ide

 

     接口隔離原則和單一職責都是爲了提升類的內聚性、下降它們之間的耦合性,體現了封裝的思想,但二者是不一樣的:spa

        # 單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離。設計

        # 單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序總體框架的構建。orm

六、迪米特原則(最少知道)

     原則思想:一個對象應當對其餘對象有儘量少地瞭解,簡稱類間解耦
     描述:一個類儘可能減小本身對其餘對象的依賴,原則是低耦合,高內聚,只有使各個模塊之間的耦合儘可能的低,才能提升代碼的複用率。
     優勢:低耦合,高內聚,提升類的可複用性和系統的可擴展性。

     注意: 過分使用迪米特法則會使系統產生大量的中介類,從而增長系統的複雜性,使模塊之間的通訊效率下降。因此,在釆用迪米特法則時須要反覆權衡,確保高內聚和低耦合的同時,保證系統的結構清晰。

七、合成複用原則

     原則思想:因爲合成或聚合能夠將已有對象歸入到新對象中,使之成爲新對象的一部分,所以新對象能夠調用已有對象的功能。

     描述: 它要求在軟件複用時,要儘可能先使用組合或者聚合等關聯關係來實現,其次才考慮使用繼承關係來實現。 通常而言,若是一個角色獲得了更多的責任,那麼可使用合成/聚合關係將新的責任委派到合適的對象。固然,這種複用也有缺點。最主要的缺點就是經過這種複用建造的系統會有較多的對象須要管理。

     優勢: 維持了類的封裝性,成分對象的內部細節是新對象看不見的,因此這種複用又稱爲「黑箱」複用。新舊類之間的耦合度低,這種複用所需的依賴較少,新對象存取成分對象的惟一方法是經過成分對象的接口。複用的靈活性高,這種複用能夠在運行時動態進行,新對象能夠動態地引用與成分對象類型相同的對象。

 

總結

    實際上,這些原則的目的只有一個:下降對象之間的耦合,增長程序的可複用性、可擴展性和可維護性。 在實際開發過程當中,並非必定要求全部代碼都遵循設計原則,而是要綜合考慮人力、時間、成本、質量,不刻意追求完美,要在適當的場景遵循設計原則。這體現的是一種平衡取捨,能夠幫助咱們設計出更加優雅的代碼結構。

相關文章
相關標籤/搜索