面向?qū)ο笤O(shè)計的六大基本原則:
1)開閉原則
2)里氏代換原則
3)依賴倒轉(zhuǎn)原則
4)接口隔離原則
5)迪米特法則
6)合成/聚合復用原則
依次解釋六大基本原則:
1) 開閉原則:?
?即面向擴展開放,面向修改封閉,也就是說系統(tǒng)支持擴展,但是不支持修改。
?為什么這么做?
在開發(fā)階段,我們都知道,如果對一個功能進行擴展,如果只是一味地對方法進行修改,可能會造成一些問題,諸如 可 能會引入新的bug,或者增加代碼的復雜度,對代碼結(jié)構(gòu)造成破壞、冗余,還需要重新進行全面的測試。那么該怎么解決這些問題?很簡單,這就需要系統(tǒng)能夠支持擴展,只有擴展性良好的系統(tǒng),才能在不進行修改已有實現(xiàn)代碼的基礎(chǔ)上,引進新的功能。
?我們應該怎么做?
要做到開閉原則,就需要多使用抽象類或者接口,將相似的類進行抽象,將公有的功能引入到抽象類中,這樣在進行擴展時,只需要依據(jù)抽象類,生成新的子類即可。
2) 里氏代換原則:
?即任何使用基類的地方,都能夠使用子類替換,而且在替換子類后,系統(tǒng)能夠正常工作。
?為什么這么做?
采用里氏替代原則可以增強程序的健壯性,版本升級的時候可以保持非常好的兼容性,即使增加子類,原有的子類也可以繼續(xù)運行。
?我們應該怎么做?
在引用基類的地方就能引用子類實現(xiàn)
3) 依賴倒轉(zhuǎn)原則:
?即我們的client類要依賴于抽象,而不是依賴于具體,也就是我們經(jīng)常聽到的“要面向接口編程”。
?為什么這么做?
減少類間的耦合性,提高代碼的可讀性和可維護性。
?我們應該怎么做?
a、每個類盡量都有接口和抽象類,或者抽象類和接口都有。
b、變量的表面類型盡量是接口或者是抽象類。
c、任何類都不應該從具體類派生。(但是在做二次開發(fā)的時候,我們無法獲得高層代碼的時候例外),規(guī)則不是絕對的。
d、盡量不要覆寫基類已經(jīng)實現(xiàn)好的方法。
4) 接口隔離原則:
??即應該將接口粒度最小化,將功能劃分到每一個不能再分的子角色,為每一個子角色創(chuàng)建接口,通過這樣,才不會讓接口的實現(xiàn)類實現(xiàn)一些不必要的功能。
?為什么這么做?
避免讓接口的實現(xiàn)類實現(xiàn)一些不必要的功能
?我們應該怎么做?
建立單一的接口,不要建立臃腫的龐大的接口,也就是說接口的方法盡量少。
5) 迪米特法則:
?即盡量減少類之間的依賴關(guān)系.
?為什么這么做?
? ? ? ?降低類之間的耦合。
?我們應該怎么做?
? ? ? ?在應用中最直接的實現(xiàn)就是在兩個類中間建一個中介類。但是這樣可能會造成中介類的澎爆。
6) 合成/聚合復用原則:
?即少用繼承,多用組合。
?為什么這么做?
優(yōu)先使用對象的合成/聚合將有助于你保持每個類被封裝,并被集中在單個任務(wù)上。這樣類和類繼承層次會保持較小規(guī)模,并且不太可能增長為不可控制的龐然大物。
?我們應該怎么做?
使用組合也就是將兩個類之間建立關(guān)聯(lián)關(guān)系,將一個類做為另一個類的屬性。
繼承與組合主要是區(qū)分兩個角色之間是"is a"還是"has a"的關(guān)系,如果是"is a"就需要使用繼承,而如果是"has a"就需要使用組合。
例如筆可以分為鋼筆和油筆,這就是is a的關(guān)系,但是油筆與筆芯就是has a的關(guān)系。