天天看點

面向對象設計原則

  設計原則是設計模式的理論基礎,設計模式就是它們的實踐。七大設計原則簡單歸納如下表所示:

設計原則

概括

目的

開閉原則

對擴充開放,對修改關閉

降低維護帶來的新風險

裡氏替換原則

不要破壞繼承體系,子類重寫方法功能發生改變,不應該影響父類方法的含義

防止繼承泛濫

依賴倒置原則

高層不應該依賴低層,要面向接口程式設計

更利于代碼結構的更新擴充

單一職責原則

一個類隻幹一件事,實作類要單一

便于了解,提高代碼的可讀性

接口隔離原則

一個接口隻幹一件事,接口要精簡單一

功能解耦,高聚合、低耦合

迪米特原則

不該知道的不要知道,一個類應該保持對其它對象最少的了解,降低耦合度

減少代碼臃腫

合成複用原則

盡量使用組合或者聚合關系實作代碼複用,少使用繼承

降低代碼耦合

     原則思想: 軟體實體應當對擴充開放,對修改關。

     描述:一個軟體産品在生命周期内,都會發生變化,既然變化是一個既定的事實,當應用的需求改變時,在不修改軟體實體的源代碼或者二進制代碼的前提下,可以擴充子產品的功能,使其滿足新的需求。

     優點:提高代碼的可複用性,提高軟體的可擴充性和可維護性。

     思想: 繼承必須確定超類所擁有的性質在子類中仍然成。

     描述:子類可以擴充父類的功能,但不能改變父類原有的功能。子類可以實作父類的抽象方法,但不能覆寫父類的非抽象方法,子類中可以增加自己特有的方法。 反映了基類與子類之間的關系,是對開閉原則的補充,是對實作抽象化的具體步驟的規範。

     優點:增加程式的健壯性, 類的擴充不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性。

     思想:高層次的子產品不應該依賴于低層次的子產品,它們都應該依賴于抽象,抽象不應該依賴于具體實作,具體實作應該依賴于抽象。

     描述: 在軟體設計中,細節具有多變性,而抽象層則相對穩定,是以以抽象為基礎搭建起來的架構要比以細節為基礎搭建起來的架構要穩定得多。  使用接口或者抽象類的目的是制定好規範和契約,而不去涉及任何具體的操作,把展現細節的任務交給它們的實作類去完成。依賴倒置原則是實作開閉原則的重要途徑之一,它降低了客戶與實作子產品之間的耦合。

     優點: 降低類間的耦合性; 提高代碼的可讀性和可維護性; 減少并行開發引起的風險。

     思想:一個類(或方法www.jqmms.com)隻負責一件事情。 就是控制類的粒度大小、将對象解耦、提高其内聚性。

     描述: 又稱單一功能原則,這裡的職責是指類變化的原因,單一職責原則規定一個類應該有且僅有一個引起它變化的原因,否則類應該被拆分。 如果一個對象承擔了太多的職責,至少存在兩個缺點:1、一個職責的變化可能會削弱或者抑制這個類實作其他職責的能力;2、當用戶端需要該對象的某一個職責時,不得不将其他不需要的職責全都包含進來,進而造成備援代碼或代碼的浪費。

    優點:降低類和類的耦合, 降低類的複雜度, 提高可讀性,增加可維護性和可拓展性,降低可變性的風險。

     原則思想:類和類之間應該建立在最小接口的上。

     描述: 要求程式員盡量将臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中隻包含客戶感興趣的方法。 要為各個類建立它們需要的專用接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調用。

     優點:提高程式的靈活度,提高内聚,減少對外互動,使得最小的接口做最多的事情。

     注意: 接口的粒度需要合理定義,如果 定義過小,則會造成接口數量過多,使設計複雜化;如果定義太大,靈活性降低,無法提供定制服務,給整體項目帶來無法預料的風險。

     接口隔離原則和單一職責都是為了提高類的内聚性、降低它們之間的耦合性,展現了封裝的思想,但兩者是不同的:

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

        # 單一職責原則主要是限制類,它針對的是程式中的實作和細節;接口隔離原則主要限制接口,主要針對抽象和程式整體架構的建構。

     原則思想:一個對象應當對其他對象有盡可能少地了解,簡稱類間解耦

     描述:一個類盡量減少自己對其他對象的依賴,原則是低耦合,高内聚,隻有使各個子產品之間的耦合盡量的低,才能提高代碼的複用率。

     優點:低耦合,高内聚,提高類的可複用性和系統的可擴充性。

     注意: 過度使用迪米特法則會使系統産生大量的中介類,進而增加系統的複雜性,使子產品之間的通信效率降低。是以,在釆用迪米特法則時需要反複權衡,確定高内聚和低耦合的同時,保證系統的結構清晰。

     原則思想:由于合成或聚合可以将已有對象納入到新對象中,使之成為新對象的一部分,是以新對象可以調用已有對象的功能。

     描述: 它要求在軟體複用時,要盡量先使用組合或者聚合等關聯關系來實作,其次才考慮使用繼承關系來實作。 一般而言,如果一個角色得到了更多的責任,那麼可以使用合成/聚合關系将新的責任委派到合适的對象。當然,這種複用也有缺點。最主要的缺點就是通過這種複用建造的系統會有較多的對象需要管理。

     優點: 維持了類的封裝性,成分對象的内部細節是新對象看不見的,是以這種複用又稱為“黑箱”複用。新舊類之間的耦合度低,這種複用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。複用的靈活性高,這種複用可以在運作時動态進行,新對象可以動态地引用與成分對象類型相同的對象。

    實際上,這些原則的目的隻有一個:降低對象之間的耦合,增加程式的可複用性、可擴充性和可維護性。 在實際開發過程中,并不是一定要求所有代碼都遵循設計原則,而是要綜合考慮人力、時間、成本、品質,不刻意追求完美,要在适當的場景遵循設計原則。這展現的是一種平衡取舍,可以幫助我們設計出更加優雅的代碼結構。