一、單一職責(zé)
概念定義:一個(gè)類(lèi)只存在一個(gè)使它發(fā)生修改的原因。即一個(gè)類(lèi)只負(fù)責(zé)一項(xiàng)職責(zé)。
問(wèn)題由來(lái):類(lèi)T負(fù)責(zé)兩個(gè)不同的職責(zé):職責(zé)P1,職責(zé)P2。當(dāng)由于職責(zé)P1需求發(fā)生改變而需要修改類(lèi)T時(shí),有可能會(huì)導(dǎo)致原本運(yùn)行正常的職責(zé)P2功能發(fā)生故障。
解決方案:遵循單一職責(zé)原則。分別建立兩個(gè)類(lèi)T1、T2,使T1完成職責(zé)P1功能,T2完成職責(zé)P2功能。這樣,當(dāng)修改類(lèi)T1時(shí),不會(huì)使職責(zé)P2發(fā)生故障風(fēng)險(xiǎn);同理,當(dāng)修改T2時(shí),也不會(huì)使職責(zé)P1發(fā)生故障風(fēng)險(xiǎn)。
二、里氏代換原則
概念定義:所有引用父類(lèi)對(duì)象的地方用子類(lèi)對(duì)象替換后,程序執(zhí)行不會(huì)發(fā)生變化。子類(lèi)可以擴(kuò)展父類(lèi)的功能,但不能改變父類(lèi)原有的功能
問(wèn)題由來(lái):有一功能P1,由類(lèi)A完成?,F(xiàn)需要將功能P1進(jìn)行擴(kuò)展,擴(kuò)展后的功能為P,其中P由原有功能P1與新功能P2組成。新功能P由類(lèi)A的子類(lèi)B來(lái)完成,則子類(lèi)B在完成新功能P2的同時(shí),有可能會(huì)導(dǎo)致原有功能P1發(fā)生故障。
解決方案:當(dāng)使用繼承時(shí),遵循里氏替換原則。類(lèi)B繼承類(lèi)A時(shí),除添加新的方法完成新增功能P2外,盡量不要重寫(xiě)父類(lèi)A的方法,也盡量不要重載父類(lèi)A的方法。
三、依賴(lài)倒置原則
概念定義:高層模塊不應(yīng)該依賴(lài)低層模塊,二者都應(yīng)該依賴(lài)其抽象;抽象不應(yīng)該依賴(lài)細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴(lài)抽象。依賴(lài)倒置原則的核心就是要我們面向接口編程,理解了面向接口編程,也就理解了依賴(lài)倒置。
問(wèn)題由來(lái):類(lèi)A直接依賴(lài)類(lèi)B,假如要將類(lèi)A改為依賴(lài)類(lèi)C,則必須通過(guò)修改類(lèi)A的代碼來(lái)達(dá)成。這種場(chǎng)景下,類(lèi)A一般是高層模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯;類(lèi)B和類(lèi)C是低層模塊,負(fù)責(zé)基本的原子操作;假如修改類(lèi)A,會(huì)給程序帶來(lái)不必要的風(fēng)險(xiǎn)。
解決方案:將類(lèi)A修改為依賴(lài)接口I,類(lèi)B和類(lèi)C各自實(shí)現(xiàn)接口I,類(lèi)A通過(guò)接口I間接與類(lèi)B或者類(lèi)C發(fā)生聯(lián)系,則會(huì)大大降低修改類(lèi)A的幾率。
舉例說(shuō)明:媽媽給孩子讀書(shū) 傳遞給媽媽 應(yīng)該是 “讀物”這個(gè)抽象類(lèi)而不是 具體的“故事書(shū)”實(shí)體,要不然后續(xù)增加?jì)寢屪x報(bào)的功能 就需要修改媽媽這個(gè)類(lèi)了顯然是不符合常理的。
四、接口隔離原則
概念定義:客戶(hù)端不應(yīng)該依賴(lài)它不需要的接口;一個(gè)類(lèi)對(duì)另一個(gè)類(lèi)的依賴(lài)應(yīng)該建立在最小的接口上。相當(dāng)于接口的單一職責(zé)
問(wèn)題由來(lái):類(lèi)A通過(guò)接口I依賴(lài)類(lèi)B,類(lèi)C通過(guò)接口I依賴(lài)類(lèi)D,如果接口I對(duì)于類(lèi)A和類(lèi)B來(lái)說(shuō)不是最小接口,則類(lèi)B和類(lèi)D必須去實(shí)現(xiàn)他們不需要的方法。
解決方案:將臃腫的接口I拆分為獨(dú)立的幾個(gè)接口,類(lèi)A和類(lèi)C分別與他們需要的接口建立依賴(lài)關(guān)系。也就是采用接口隔離原則。
舉例來(lái)說(shuō)明接口隔離原則:
五、迪米特法則
概念定義:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解。
問(wèn)題由來(lái):類(lèi)與類(lèi)之間的關(guān)系越密切,耦合度越大,當(dāng)一個(gè)類(lèi)發(fā)生改變時(shí),對(duì)另一個(gè)類(lèi)的影響也越大。
解決方案:盡量降低類(lèi)與類(lèi)之間的耦合。
六、開(kāi)閉原則
概念定義:一個(gè)軟件實(shí)體如類(lèi)、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
問(wèn)題由來(lái):在軟件的生命周期內(nèi),因?yàn)樽兓?、升?jí)和維護(hù)等原因需要對(duì)軟件原有代碼進(jìn)行修改時(shí),可能會(huì)給舊代碼中引入錯(cuò)誤,也可能會(huì)使我們不得不對(duì)整個(gè)功能進(jìn)行重構(gòu),并且需要原有代碼經(jīng)過(guò)重新測(cè)試
解決方案:當(dāng)軟件需要變化時(shí),盡量通過(guò)擴(kuò)展軟件實(shí)體的行為來(lái)實(shí)現(xiàn)變化,而不是通過(guò)修改已有的代碼來(lái)實(shí)現(xiàn)變化。