筆記01—設(shè)計(jì)原則

SOLID 五大設(shè)計(jì)原則,+ 迪米特法則,組成編程設(shè)計(jì)的六大原則。

1:?jiǎn)我宦氊?zé)原則 SRP

比較容易誤解的地方,認(rèn)為每個(gè)模塊都應(yīng)該只做一件事。這也算是一個(gè)設(shè)計(jì)原則,確保一個(gè)函數(shù)只完成一個(gè)功能,但這只是一個(gè)面相底層實(shí)現(xiàn)細(xì)節(jié)的設(shè)計(jì)原則,不是SRP的全部。

合理的說(shuō)法是,任何一個(gè)軟件模塊都應(yīng)該只對(duì)某一類行為者負(fù)責(zé)。在類的設(shè)計(jì)上,區(qū)分好行為者的角色,減少依賴。

軟件模塊可以指一組緊密相關(guān)的函數(shù)和數(shù)據(jù)結(jié)構(gòu)。

單一職責(zé)原則,主要討論的是函數(shù)和類之間的關(guān)系,在組件層面,我們可以稱之為 共同閉包原則,在軟件架構(gòu)層面,它則是奠定架構(gòu)邊界的變更軸心。

2:開(kāi)閉原則 OCP

良好的設(shè)計(jì)應(yīng)該易于擴(kuò)展,同時(shí)抗拒修改,限制其每次修改所影響的范圍。

實(shí)現(xiàn)方式是通過(guò)將系統(tǒng)劃分為一系列組件,并將這些組件間的依賴關(guān)系按層級(jí)結(jié)構(gòu)進(jìn)行組織,使得高階組件不會(huì)因低階組件被修改而受到影響。

3:里氏替換原則 LSP。

子類可以替換父類的功能,也可以復(fù)寫(xiě)父類的方法。

4:接口隔離原則ISP
image.png

此種設(shè)計(jì)方式,不太合理。如使用Java靜態(tài)類型語(yǔ)言編寫(xiě),User1雖然不需要調(diào)用op2 op3a,但在源碼層次上也與他們形成依賴關(guān)系,這種依賴意味著我們對(duì)ops代碼中op2 所做的任何修改,即使不會(huì)影響到user1的功能,也會(huì)導(dǎo)致它需要被重新編譯和部署。

所以需要接口隔離。

任何層次的軟件設(shè)計(jì)如果依賴了它并不需要的東西,就會(huì)帶來(lái)意料之外的麻煩。

5:依賴反轉(zhuǎn)原則DIP

如果想要設(shè)計(jì)一個(gè)靈活的系統(tǒng),在源代碼層次的依賴關(guān)系中就應(yīng)該引用抽象類型,而非具體實(shí)現(xiàn)。

也就是說(shuō)在Java這類靜態(tài)類型語(yǔ)言中,在使用use import include 時(shí),應(yīng)該盡量只引入那些包含接口,抽象類或者其他抽象類型聲明的源文件,不應(yīng)該引用具體的實(shí)現(xiàn)。

依賴倒置原則定義

1、上層模塊不應(yīng)該依賴底層模塊,它們都應(yīng)該依賴于抽象。

2、抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。

首先,這個(gè)原則聽(tīng)起來(lái)很像是“針對(duì)接口編程,不針對(duì)現(xiàn)實(shí)編程”,不是嗎?的確很相似,然而這里更強(qiáng)調(diào)“抽象”。

依賴倒置原則,究竟倒置在哪里?

在依賴倒置原則中的倒置指的是和一般OO設(shè)計(jì)的思考方式完全相反。

舉個(gè)例子,現(xiàn)在你需要實(shí)現(xiàn)一個(gè)比薩店,你第一件想到的事情是什么?我想到的是一個(gè)比薩店,里面有很多具體的比薩,如:芝士比薩、素食比薩、海鮮比薩……

比薩店是上層模塊,比薩是下層模塊,如果把比薩店和它依賴的對(duì)象畫(huà)成一張圖,看起來(lái)是這樣:

正常依賴圖

沒(méi)錯(cuò)!先從頂端開(kāi)始,然后往下到具體類,但是,正如你看到的你不想讓比薩店理會(huì)這些具體類,要不然比薩店將全都依賴這些具體類?,F(xiàn)在“倒置”你的想法……別從上層模塊比薩店開(kāi)始思考,而是從下層模塊比薩開(kāi)始,然后想想看能抽象化些什么。你可能會(huì)想到,芝士比薩、素食比薩、海鮮比薩都是比薩,所以它們應(yīng)該共享一個(gè)Pizza接口。對(duì)了,你想要抽象化一個(gè)Pizza。好,現(xiàn)在回頭重新思考如何設(shè)計(jì)比薩店。

依賴倒置后的圖

圖一的依賴箭頭都是從上往下的,圖二的箭頭出現(xiàn)了從下往上,依賴關(guān)系確實(shí)“倒置”了

另外,此例子也很好的解釋了“上層模塊不應(yīng)該依賴底層模塊,它們都應(yīng)該依賴于抽象?!保谧铋_(kāi)始的設(shè)計(jì)中,高層模塊PizzaStroe直接依賴低層模塊(各種具體的Pizaa),調(diào)整設(shè)計(jì)后,高層模塊和低層模塊都依賴于抽象(Pizza)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容