6大設(shè)計(jì)原則之單一職責(zé)原則
單一職責(zé)原則的英文名稱(chēng)是:Single Responsibility Principle, 簡(jiǎn)稱(chēng)SRP叹谁。
單一職責(zé)原則定義是:應(yīng)該有且僅有一個(gè)原因引起類(lèi)的變更拥坛。原話(huà):There should never be more than one reason for a class to change。
接口读处,類(lèi)糊治,和方法都可以應(yīng)用單一職責(zé)原則。
例:
用戶(hù)需求罚舱,要修改用戶(hù)密碼井辜,修改用戶(hù)地址,修改用戶(hù)證件號(hào)碼管闷,要怎么做呢粥脚?
方法適用單一職責(zé)原則:
方法一:
function changeUserInfo($Key, $value)
{
xxxxx;
}
方法二:
function changePassWord($oldPassWord, $newPassWord)
{
xxx;
}
function changeAddress($address)
{
xxxx;
}
function changeCard($cardType, $cardNum)
{
xxxx;
}
類(lèi)似這樣的方法包个,如果某人寫(xiě)了方法一刷允,那么對(duì)不起,不管你需要改動(dòng)多少代碼量碧囊,必須改回去树灶。
對(duì)于單一職責(zé)原則,我的建議是接口一定要做到單一職責(zé)糯而,類(lèi)的設(shè)計(jì)盡量做到只有一個(gè)原因引起變化天通。
6大設(shè)計(jì)原則之里氏替換原則
里氏替換原則的英文名稱(chēng)是:Liskov Substitution Principle,簡(jiǎn)稱(chēng)LSP
里氏替換原則定義是:所有引用基類(lèi)的地方必須能透明地使用其子類(lèi)的對(duì)象。
英文定義:Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it熄驼。
通俗點(diǎn)說(shuō):所有父類(lèi)能出現(xiàn)的地方子類(lèi)就可以出現(xiàn)像寒,并且替換為子類(lèi)也不會(huì)產(chǎn)生任何錯(cuò)誤或異常烘豹。反之則不可以。
里氏替換原則可以讓繼承的“優(yōu)點(diǎn)”發(fā)揮最大作用诺祸,同時(shí)減少“缺點(diǎn)”帶來(lái)的麻煩携悯。
繼承的優(yōu)點(diǎn):代碼共享,減少創(chuàng)建類(lèi)的工作量筷笨,每個(gè)子類(lèi)都擁有父類(lèi)的方法和屬性憔鬼。
提高代碼的重用性:“龍生龍,鳳生鳳”;
提高代碼的可擴(kuò)展性:實(shí)現(xiàn)父類(lèi)方法就可以“為所欲為”;
提高產(chǎn)品或項(xiàng)目的開(kāi)放性奥秆。
繼承的缺點(diǎn):
繼承是入侵性的逊彭。只要繼承咸灿,就必須擁有父類(lèi)的所有屬性和方法;
降低代碼的靈活性构订,子類(lèi)必須擁有父類(lèi)的屬性和方法,讓子類(lèi)自由的世界中多了些約束避矢;
增強(qiáng)了耦合性悼瘾。當(dāng)父類(lèi)的常量、變量和方法修改時(shí)审胸,必須要考慮子類(lèi)的修改亥宿,而且在缺乏規(guī)范的環(huán)境下,這種修改可能帶來(lái)非常糟糕的結(jié)果砂沛,大片的代碼需要重構(gòu)烫扼。
例子(待補(bǔ)充)
如果子類(lèi)不能完整地實(shí)現(xiàn)父類(lèi)的方法,或者父類(lèi)的某些方法在子類(lèi)中已經(jīng)發(fā)生“畸變”碍庵,則建議斷開(kāi)父子繼承關(guān)系映企,采用依賴(lài),聚集静浴,組合等關(guān)系代替繼承堰氓。
子類(lèi)中方法的前置條件必須與超類(lèi)中被覆寫(xiě)的方法的前置條件相同或者更寬松。
6大設(shè)計(jì)原則之依賴(lài)倒置原則
依賴(lài)倒置原則英文名稱(chēng)是:Dependence Inversion Principle,簡(jiǎn)稱(chēng)DIP
依賴(lài)倒置原則:(1)高層模塊不應(yīng)該依賴(lài)低層模塊苹享,兩者都應(yīng)該依賴(lài)其抽象; ? (2)抽象不應(yīng)該依賴(lài)細(xì)節(jié) ?(3)細(xì)節(jié)應(yīng)該依賴(lài)抽象
英文定義:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details . Details should depend upon abstractions.
什么是低層模塊双絮?什么是高層模塊?每一個(gè)邏輯實(shí)現(xiàn)都是由原子邏輯組成的得问,不可分割的原子邏輯就是低層模塊囤攀,原子邏輯的再組裝就是高層模塊。
什么是抽象宫纬?什么是細(xì)節(jié)焚挠?抽象就是指接口或抽象類(lèi),兩者都不能被實(shí)例化哪怔。細(xì)節(jié)就是實(shí)現(xiàn)類(lèi)宣蔚,實(shí)現(xiàn)接口或集成抽象類(lèi)而產(chǎn)生的類(lèi)就是細(xì)節(jié)向抢,可以直接實(shí)例化。
依賴(lài)倒置原則的表現(xiàn):
(1)模塊間的依賴(lài)通過(guò)抽象發(fā)生胚委,實(shí)現(xiàn)類(lèi)之間不發(fā)生直接的依賴(lài)關(guān)系挟鸠,其依賴(lài)關(guān)系是通過(guò)接口或抽象類(lèi)產(chǎn)生的。
(2)接口或抽象類(lèi)不依賴(lài)于實(shí)現(xiàn)類(lèi)亩冬。
(3)實(shí)現(xiàn)類(lèi)依賴(lài)接口或抽象類(lèi)艘希。
采用依賴(lài)倒置原則優(yōu)點(diǎn):可以減少類(lèi)間的耦合性,提高系統(tǒng)的穩(wěn)定性硅急,降低并行開(kāi)發(fā)引起的風(fēng)險(xiǎn)覆享,提高代碼的可讀性和可維護(hù)性。
證明可以減少類(lèi)間耦合性营袜。
例子:(待補(bǔ)充)
結(jié)論:設(shè)計(jì)是否具備穩(wěn)定性撒顿,只要適當(dāng)“松松土”,觀(guān)察我們的設(shè)計(jì)荚板,是否還可以茁壯成長(zhǎng)就可以得出結(jié)論凤壁。穩(wěn)定性高的設(shè)計(jì),在周?chē)h(huán)境頻繁變化時(shí)跪另,依然可以做到“我自巋然不動(dòng)”拧抖;
證明減少并行開(kāi)發(fā)引起的風(fēng)險(xiǎn),并行開(kāi)發(fā)最大的風(fēng)險(xiǎn)是風(fēng)險(xiǎn)擴(kuò)散
4.接口隔離原則
5.迪米特法則(最少知識(shí)原則)
要求只和朋友交流,并且我只知道你提供這么多public方法 其他不管
6.開(kāi)閉原則
對(duì)于擴(kuò)展規(guī)則是開(kāi)的免绿。修改源碼是閉的