一高诺、單一職責(zé)
概念定義:一個(gè)類只存在一個(gè)使它發(fā)生修改的原因制圈。即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)掌挚。
問題由來:類T負(fù)責(zé)兩個(gè)不同的職責(zé):職責(zé)P1割疾,職責(zé)P2怯疤。當(dāng)由于職責(zé)P1需求發(fā)生改變而需要修改類T時(shí)暮蹂,有可能會(huì)導(dǎo)致原本運(yùn)行正常的職責(zé)P2功能發(fā)生故障甫题。
解決方案:遵循單一職責(zé)原則巧鸭。分別建立兩個(gè)類T1、T2凿宾,使T1完成職責(zé)P1功能矾屯,T2完成職責(zé)P2功能。這樣初厚,當(dāng)修改類T1時(shí)件蚕,不會(huì)使職責(zé)P2發(fā)生故障風(fēng)險(xiǎn);同理产禾,當(dāng)修改T2時(shí)排作,也不會(huì)使職責(zé)P1發(fā)生故障風(fēng)險(xiǎn)。
二亚情、里氏代換原則
概念定義:所有引用父類對(duì)象的地方用子類對(duì)象替換后妄痪,程序執(zhí)行不會(huì)發(fā)生變化。子類可以擴(kuò)展父類的功能楞件,但不能改變父類原有的功能
問題由來:有一功能P1衫生,由類A完成。現(xiàn)需要將功能P1進(jìn)行擴(kuò)展土浸,擴(kuò)展后的功能為P罪针,其中P由原有功能P1與新功能P2組成。新功能P由類A的子類B來完成黄伊,則子類B在完成新功能P2的同時(shí)泪酱,有可能會(huì)導(dǎo)致原有功能P1發(fā)生故障。
解決方案:當(dāng)使用繼承時(shí)毅舆,遵循里氏替換原則西篓。類B繼承類A時(shí),除添加新的方法完成新增功能P2外憋活,盡量不要重寫父類A的方法岂津,也盡量不要重載父類A的方法。
三悦即、依賴倒置原則
概念定義:高層模塊不應(yīng)該依賴低層模塊吮成,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié)辜梳;細(xì)節(jié)應(yīng)該依賴抽象粱甫。依賴倒置原則的核心就是要我們面向接口編程,理解了面向接口編程作瞄,也就理解了依賴倒置茶宵。
問題由來:類A直接依賴類B,假如要將類A改為依賴類C宗挥,則必須通過修改類A的代碼來達(dá)成乌庶。這種場(chǎng)景下种蝶,類A一般是高層模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯瞒大;類B和類C是低層模塊螃征,負(fù)責(zé)基本的原子操作;假如修改類A透敌,會(huì)給程序帶來不必要的風(fēng)險(xiǎn)盯滚。
解決方案:將類A修改為依賴接口I,類B和類C各自實(shí)現(xiàn)接口I酗电,類A通過接口I間接與類B或者類C發(fā)生聯(lián)系魄藕,則會(huì)大大降低修改類A的幾率。
舉例說明:媽媽給孩子讀書 傳遞給媽媽 應(yīng)該是 “讀物”這個(gè)抽象類而不是 具體的“故事書”實(shí)體顾瞻,要不然后續(xù)增加?jì)寢屪x報(bào)的功能 就需要修改媽媽這個(gè)類了顯然是不符合常理的泼疑。
四、接口隔離原則
概念定義:客戶端不應(yīng)該依賴它不需要的接口荷荤;一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上退渗。相當(dāng)于接口的單一職責(zé)
問題由來:類A通過接口I依賴類B,類C通過接口I依賴類D蕴纳,如果接口I對(duì)于類A和類B來說不是最小接口会油,則類B和類D必須去實(shí)現(xiàn)他們不需要的方法。
解決方案:將臃腫的接口I拆分為獨(dú)立的幾個(gè)接口古毛,類A和類C分別與他們需要的接口建立依賴關(guān)系翻翩。也就是采用接口隔離原則。
舉例來說明接口隔離原則:
五稻薇、迪米特法則
概念定義:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解嫂冻。
問題由來:類與類之間的關(guān)系越密切,耦合度越大塞椎,當(dāng)一個(gè)類發(fā)生改變時(shí)桨仿,對(duì)另一個(gè)類的影響也越大。
解決方案:盡量降低類與類之間的耦合案狠。
六服傍、開閉原則
概念定義:一個(gè)軟件實(shí)體如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放骂铁,對(duì)修改關(guān)閉吹零。
問題由來:在軟件的生命周期內(nèi),因?yàn)樽兓帧⑸?jí)和維護(hù)等原因需要對(duì)軟件原有代碼進(jìn)行修改時(shí)灿椅,可能會(huì)給舊代碼中引入錯(cuò)誤,也可能會(huì)使我們不得不對(duì)整個(gè)功能進(jìn)行重構(gòu),并且需要原有代碼經(jīng)過重新測(cè)試
解決方案:當(dāng)軟件需要變化時(shí)阱扬,盡量通過擴(kuò)展軟件實(shí)體的行為來實(shí)現(xiàn)變化泣懊,而不是通過修改已有的代碼來實(shí)現(xiàn)變化。