歪讀《架構(gòu)整潔之道》第七章之原則就是用來(lái)遵守的

? ? ? ? 最近校園招聘,比較愛(ài)問(wèn)的一個(gè)問(wèn)題是:同學(xué),你知道SOLID嗎?比較多的同學(xué)一臉茫然,然后我就故作安慰道,沒(méi)事,不知道也正常;如果有同學(xué)能回答上一二,則滿臉欣慰,感嘆,不錯(cuò)不錯(cuò),閱讀面還很廣;如果每一個(gè)都能講的頭頭是道,我反而會(huì)疑惑,同學(xué),你是知道我要問(wèn)什么,提前背的吧?哈哈,雖是玩笑,不過(guò)設(shè)計(jì)原則要死記本就較難,活用更是考驗(yàn)軟件設(shè)計(jì)的基本功,能按自己的理解講解出來(lái)確實(shí)就非常好了。

? ? ? ? 實(shí)際上,軟件設(shè)計(jì)原則在《敏捷軟件開(kāi)發(fā):原則、模式與實(shí)踐》這本書(shū)講解的更為詳細(xì)一些,不過(guò)好的軟件架構(gòu),需要從整潔代碼開(kāi)始,就如好的建筑需要好的磚頭一樣,所以本書(shū)也對(duì)設(shè)計(jì)原則進(jìn)行了詳細(xì)的講解。設(shè)計(jì)原則就好比《九陰真經(jīng)》的總綱,偏向于理論知識(shí),而模式則偏向于應(yīng)用,是對(duì)原則的具體詮釋。

? ? 軟件設(shè)計(jì)原則本身是來(lái)源于軟件開(kāi)發(fā)過(guò)程中的規(guī)則總結(jié),就如武功秘籍,我們易按照先讀后練,先死套再活用的方法,今天我們就先來(lái)讀一讀再套用一下,當(dāng)然也僅止于此。

? ? 首先說(shuō)SOLID中的S,也就是單一職責(zé)原則(SRP),書(shū)上的標(biāo)準(zhǔn)定義“任何一個(gè)軟件模塊都應(yīng)該只對(duì)一類行為負(fù)責(zé)”,很抽象的解說(shuō),舉例來(lái)說(shuō),我們項(xiàng)目經(jīng)理和HR都需要統(tǒng)計(jì)每個(gè)員工的工時(shí),最初兩者要求的一樣的,就是大家的上下班打卡時(shí)間,剛開(kāi)始我們用相同的方法來(lái)實(shí)現(xiàn),結(jié)果有一天HR說(shuō),按國(guó)家規(guī)定,周六雙倍工資,工時(shí)算兩倍,按這個(gè)需求修改完成后,項(xiàng)目經(jīng)理這邊就出麻煩了,工時(shí)按雙倍計(jì)算,工作進(jìn)度沒(méi)有雙倍啊,工作進(jìn)度就完不成了。所以單一職責(zé)就是要把服務(wù)不同對(duì)象的代碼進(jìn)行切分,避免代碼修改的時(shí)候互相影響。

? ? 第二個(gè)是OCP,開(kāi)閉原則,書(shū)上的定義是“設(shè)計(jì)良好的計(jì)算機(jī)軟件應(yīng)該易與擴(kuò)展,同時(shí)抗拒修改”。按我的理解,“開(kāi)”即為變化,“閉”即不變的部分,開(kāi)閉原則就是以不變應(yīng)萬(wàn)變。比如我當(dāng)前設(shè)計(jì)的一個(gè)度量系統(tǒng),不變的是后端對(duì)流水線的運(yùn)行數(shù)據(jù)收集、分析、存儲(chǔ),而前端的看板展示部分,我會(huì)根據(jù)需要設(shè)計(jì)出流水線實(shí)時(shí)看板,每日看板,后續(xù)陸續(xù)擴(kuò)展出月度統(tǒng)計(jì)看板,年度統(tǒng)計(jì)看板,甚至還有不同維度的度量應(yīng)用,但這些擴(kuò)展的應(yīng)用對(duì)我的數(shù)據(jù)收集中心是無(wú)影響的。組件層次劃分清晰,且組件的依賴單向,即可以做到開(kāi)閉隨心而無(wú)所懼也。

? ? 第三個(gè)為L(zhǎng)SP,里氏替換原則,其中里氏是提出者Liskov女士的音譯,所以該原則的核心應(yīng)該是“替換”。書(shū)上定義為“繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立”,也就是說(shuō),如果子類不能完全繼承超類的所有性質(zhì),那么這樣的繼承就是不合理的。書(shū)上使用的是長(zhǎng)方形/正方形的例子,按數(shù)學(xué)書(shū)上的講解,正方形是一種特殊的長(zhǎng)方形。但是如果長(zhǎng)方形定義了setHight和setWide兩種方法,那么正方形是不適合繼承長(zhǎng)方形的,否則正方形調(diào)用setHight和setWide就會(huì)造成定義失效,為了兼容這種問(wèn)題,會(huì)造成軟件架構(gòu)極大的混亂。

? ? 第四個(gè)為ISP,接口隔離原則,按字面解釋,“要為各個(gè)類建立它們需要的專用接口,而不要試圖去建立一個(gè)很龐大的接口供所有依賴它的類去調(diào)用”。這個(gè)和單一職責(zé)原則很類似,可以說(shuō)是接口的單一職責(zé)。說(shuō)一個(gè)反例,有一個(gè)薪水管理的接口,salary(type,count),type可以為add,reduce,一個(gè)接口搞定兩件事情,這樣首先會(huì)造成salary的實(shí)現(xiàn)方法臃腫,其次,當(dāng)add的邏輯修改,比如需要對(duì)工作滿10年的同學(xué)雙倍加薪,這樣對(duì)調(diào)用reduce的地方也需要重新進(jìn)行編譯部署(靜態(tài)語(yǔ)言),即便動(dòng)態(tài)語(yǔ)言不需要重新編譯,接口的耦合也會(huì)造成接口的修改難度加大,容易帶來(lái)意料之外的麻煩。

? ? 第五個(gè)DIP,依賴反轉(zhuǎn)原則,定義如下:高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。依賴倒置原則的目的是通過(guò)要面向接口的編程來(lái)降低類間的耦合性,所以我們?cè)趯?shí)際編程中只要遵循以下4點(diǎn),就能在項(xiàng)目中滿足這個(gè)規(guī)則。

每個(gè)類盡量提供接口或抽象類,或者兩者都具備。

變量的聲明類型盡量是接口或者是抽象類。

任何類都不應(yīng)該從具體類派生。

使用繼承時(shí)盡量遵循里氏替換原則。

軟件設(shè)計(jì)原則還有迪米特法則以及合成復(fù)用原則,不過(guò)本書(shū)沒(méi)有提及,也就不再贅述。另外本章確實(shí)有點(diǎn)上頭,本想簡(jiǎn)單明了的介紹設(shè)計(jì)原則,但是個(gè)人本身理解就不深,自然無(wú)法深入淺出,姑且看之。

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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