面向對象的六大設計原則
(1)單一職責原則——SRP
(2)開閉原則——OCP
(3)里式替換原則——LSP
(4)依賴倒置原則——DIP
(5)接口隔離原則——ISP
(6)迪米特原則——LOD
——————————————————————————————
單一職責原則
一個類,只有一個引起它變化的原因,只有一個職責。
如果一個類承擔的職責過多,就等于把這些職責耦合在一起了。一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當發生變化時,設計會遭受到意想不到的破壞。而如果想要避免這種現象的發生,就要盡可能的遵守單一職責原則。此原則的核心就是解耦和增強內聚性。
?
(1)可以降低類的復雜度(2)提高類的可讀性,和系統的維護性(3)當發生變化的時候,能將變化的影響降到最小,因為只會在這個類中做出修改。
?
開閉原則
開閉原則規定“軟件中的對象(類,模塊,函數等等)應該對于擴展是開放的,但是對于修改是封閉的,這意味著一個實體是允許在不改變它的源代碼的前提下變更它的行為。該特性在產品化的環境中是特別有價值的,在這種環境中,改變源代碼需要代碼審查,單元測試以及諸如此類的用以確保產品使用質量的過程。遵循這種原則的代碼在擴展時并不發生改變,因此無需上述的過程。
當需求發生改變的時候,我們需要對代碼進行修改,這個時候我們應該盡量去擴展原來的代碼,而不是去修改原來的代碼,用抽象去構建框架,用實現擴展細節。這樣當發生修改的時候,我們就直接用抽象了派生一個具體類去實現修改。
?
里氏替換原則
在面向對象的程序設計中,里氏替換原則是對子類型的特別定義。“派生類(子類)對象可以在程式中代替其基類(超類)對象。”子類可以去擴展父類的功能,但是不能改變父類原有的功能。【里氏替換原則和開閉原則往往是相互依存的。】
?
1)子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。
2)子類可以增加自己獨有的方法。
3)當子類的方法重載父類的方法時候,方法的形參要比父類的方法的輸入參數更加寬松。
4)當子類的方法實現父類的抽象方法時,方法的返回值要比父類更嚴格。
?
依賴倒置原則
是指一種特定的解耦(傳統的依賴關系創建在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴于低層次的模塊的實現細節,依賴關系被顛倒(反轉),從而使得低層次模塊依賴于高層次模塊的需求抽象。高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。依賴于抽象,不要依賴于具體。
?
?接口隔離原則
客戶端應該不依賴于它不使用的方法。使用多個隔離的接口,比使用單個接口要好。目的是系統解開耦合,從而容易重構,更改和重新部署。在面向對象設計中,接口(interface)提供了便于代碼在概念上解釋的抽象層,并創建了避免依賴的一個屏障。
建立單一接口,不要建立龐大臃腫的接口,盡量細化接口,接口中的方法盡量少。
?△接口隔離原則使用注意:
1)接口盡量小,但是要有限度。對接口進行細化可以提高程序設計靈活性是不掙的事實,但是如果過小,則會造成接口數量過多,使設計復雜化。所以一定要適度。
2)為依賴接口的類定制服務,只暴露給調用的類它需要的方法,它不需要的方法則隱藏起來。只有專注地為一個模塊提供定制服務,才能建立最小的依賴關系。
3)提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情。
?
迪米特原則
一個對象應該對其他對象保持最少的了解。因為類與類之間的關系越密切,耦合度越大,當一個類發生改變時,對另一個類的影響也越大,所以這也是我們提倡的軟件編程的總的原則:低耦合,高內聚。一個類對自己依賴的類知道的越少越好。也就是說,對于被依賴的類來說,無論邏輯多么復雜,都盡量地的將邏輯封裝在類的內部,對外除了提供的public方法,不對外泄漏任何信息。
?