面向對象 - 設計原則總結(OOD)

 1)單一責任原則
  單一性原則主要是針對類的設計約束,一個類應該儘量完成單一的功能,即只能因爲一個因素的改變而改變,反之,如果一個類完成了多件事情,那麼完成這幾件事情中的任意一個因素髮生改變,該類就可能要重新設計,牽一髮而動全身,有失美感。也會增加維護系統的成本和風險。
 
 2)里氏替換原則
 里氏替換原則主要是針對類的繼承而言,一個子類是否能繼承父類的標準應該是該子類是否能夠替換父類的任意一個應用場景。但並不是所有的父類應用場景子類都能替換,比如子類不能訪問父類的私有信息。
 
 3)接口隔離原則
 接口隔離原則主要是針對在創造接口的時候儘量小而專,一個接口儘量是針對某個特定的功能而設計,避免出現“臃腫”的接口,一個類的對另外一個類的依賴應該儘量限制在最小的接口上,而不要強迫一個類依賴它不需要的方法。
 接口隔離強調接口功能的單一性,而“臃腫”的接口存在明顯的弊端,會導致實現該接口的類完全依賴於該接口的所有方法和屬性,而這些多餘的屬性和方法對類的實現來說是一種浪費,且當接口需要改變的將導致被依賴的程序進行一連串的修改,這種修改將是災難性的。所以在設計接口的時候應該保證接口是定製化的,使得實現該接口的程序只依賴實際使用的方法。
 
 4)開放閉合原則
 開放閉合原則是針對增加擴展軟件的功能而言,其核心思想是:軟件的實體應該是可擴展的而不是可修改的。開放是指對擴展開發,封閉是指對原有程序的修改封閉。開放閉合原則主要體現在兩個方面,一是:對擴展開發,對遇到新的軟件功能需求應該通過擴展已有代碼以滿足新的需求,二是:對修改封閉,當一個類一旦設計完成,已經被衆多程序使用時,就不應該對其進行任何嘗試性的修改。
 實現開放閉合原則的方法就是面向對象編程,而不是面向過程編程,讓類依賴於固定的抽象,所以修改是封閉的;而通過面向對象的多態和繼承機制,繼承、複寫其原有的方法來滿足擴展的需要。
 軟件需求總是變化的,開放封閉原則就是封閉軟件變化對已有程序的影響,保證已有程序內部封裝的穩定性,又能滿足新的需求,這應該是所有大型項目的福音。

PS:進行抽象的時候應該是針對代碼中變動比較大的部分,對代碼中每一個部分都進行抽象也不是好事,另外拒絕不成熟的抽象與抽象本身一樣重要。
 
 5)依賴倒置原則
 依賴倒置主要用來解決傳統軟件結構出現的高層依賴於底層的依賴關係,所謂“倒置”就是打破傳統軟件結構中出現的高低層依賴關係。
 如果定義一個接口,此接口用於說明高層需要用到的功能,而底層只是根據這個接口來做具體實現,那麼這個高層就能在任何符合這個接口規範的底層軟件上運行,保證了高層的獨立性,解決高層軟件的複用問題。由於這個接口是抽象的,而高層依賴於這個接口,而不是底層具體的實現,所以叫做高層依賴於抽象而不是具體的底層實現。

PS:說白了就是 高層針對接口進行編程,底層也針對接口編程。

6)迪米特法則

迪米特法則也叫最少知識原則,當兩個對象不必直接通行的時候,那麼這兩個類就不必發生直接的相互作用。如果其中一個對象實在需要臨時調用另外一個對象的某些特定,可以通過第三者轉發這個調用。

PS: 這其實是模塊化設計的一個基本要求,當你需要調用一個模塊的某個功能的時候,你只需要知道這個模塊向外的接口就好,而不需要熟悉具體的實現。

7)合成(composition)/聚合(aggregation)原則
 合成和聚合都是特殊的關聯種類,聚合表示一種弱的擁有關係,體現的是A對象包含B對象,但是B對象並不是A對象的一部分,而合成表示的是一種強的擁有關係,體現了嚴格的部分與整體的關係,部分與整體擁有相同的聲明週期
 由於類的繼承是一種強耦合的關係,如果父類改變,那麼子類也必須跟着改變,所以要避免濫用繼承,繼承時要滿足里氏替換原則。

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