在應(yīng)用的開發(fā)過程中意敛,最難的不是完成應(yīng)用的開發(fā)工作,而是在后續(xù)的升級刘急、維護中讓應(yīng)用系統(tǒng)能夠擁抱變化函荣。擁抱變化也就是意味著在滿足需求且不破壞系統(tǒng)穩(wěn)定性的前提下保持高可擴展性、高內(nèi)聚扳肛、低耦合傻挂,在經(jīng)歷了各版本的變更之后依舊保持清晰、靈活挖息、穩(wěn)定的系統(tǒng)架構(gòu)金拒。
雖然在實際的應(yīng)該開發(fā)中,要飽受產(chǎn)品的折磨和摧殘套腹、需要在極其有限的研發(fā)時間里完成功能绪抛、上線。但是我們?nèi)孕璞M量保持遵循面向?qū)ο蟮牧笤O(shè)計原則电禀,這才能讓我們不必在各種需求的苦海中掙扎幢码。
1.單一責任原則
定義:就一個類而言尖飞,應(yīng)該只有一個引起變化的原因。
優(yōu)點:低耦合
缺點:責任界限比較難劃分
總結(jié):在研發(fā)當中政基,設(shè)計的規(guī)范應(yīng)盡量滿足單一責任原則。接口一定要做到單一責任原則沮明,類的設(shè)計盡量做到只有一個引起變化的原因辕坝。
2.里氏替換原則
定義: 所有引用父類的地方,必要能透明的使用其子類
優(yōu)點:低耦合酱畅,高內(nèi)聚琳袄,增強程序的健壯性圣贸。版本升級時挚歧,只需新增對應(yīng)的實現(xiàn)子類,不必影響舊的業(yè)務(wù)邏輯
缺點: 繼承是侵入性的吁峻,子類必須擁有分類的所有屬性和方法滑负,同時可能造成子類代碼冗余用含、靈活性降低
總結(jié): 在項目中,采用里氏替換原則啄骇,應(yīng)盡量避免子類的個性(擁有自己的業(yè)務(wù)實現(xiàn)方法)缸夹,把子類當父類使用痪寻,個性無法使用虽惭,單獨作為一個業(yè)務(wù),耦合關(guān)系復(fù)雜
3.依賴倒置原則
定義: 模塊間的依賴通過抽象發(fā)生顾画,實現(xiàn)類之間不發(fā)生直接的依賴關(guān)系匆笤,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的。
優(yōu)點: 減少類間的耦合性炮捧,提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)引起的風(fēng)險咆课,提高代碼的可讀性和維護性
缺點: 前期需要耗時進行結(jié)構(gòu)設(shè)計及抽象提取
總結(jié): 依賴倒置原則的本質(zhì)就是通過抽象(接口或抽象類)使各個類或模塊的實現(xiàn)彼此獨立傀蚌,不相互影響,實現(xiàn)模塊間的松耦合善炫。在實踐中可以根據(jù)以下幾個規(guī)則來衡量:
每個類盡量都有接口或抽象類,或者抽象類和兩者都具備
任何類盡量都不應(yīng)該從具體的類派生
結(jié)合里氏替換原則
接口隔離原則
定義: 客戶端不應(yīng)該依賴它不需要的接口窜醉,類間的依賴關(guān)系應(yīng)該建立在最小的接口上
優(yōu)點: 接口隔離的原則將非常龐大、臃腫的接口拆分成更小的和更具體的接口榨惰,這樣客戶將會只需要知道他們感興趣的方法。接口隔離原則的目的是系統(tǒng)解開耦合居凶,從而容易重構(gòu)藤抡、更改和重新部署缺點: 需要耗時統(tǒng)籌接口隔離顆粒度,接口拆分的標準缠黍、顆粒度比較難劃分,太大降低靈活性瓷式,太小疾忍,導(dǎo)致接口數(shù)據(jù)增大,開發(fā)成本更高總結(jié): 接口隔離原則是對接口的定義瓤漏,同時也是對類的定義颊埃,接口和類盡量使用原子接口和原子類來組織。在實踐中可以根據(jù)以下幾個規(guī)則來衡量:
一個接口只服務(wù)于一個子模塊或業(yè)務(wù)邏輯
通過業(yè)務(wù)邏輯壓縮接口中的public方法饥漫,盡量讓接口精簡罗标,而不是暴露一大堆方法
已被污染的接口庸队,盡量去修改彻消,若變更風(fēng)險較大宙拉,則采用設(shè)配器模式進行轉(zhuǎn)換處理
根據(jù)業(yè)務(wù),每個項目或產(chǎn)品都有特定的環(huán)境因素,拆分的標準可能不同御板,不要硬套標準
5.迪米特原則
定義: 一個對象應(yīng)該對自己需要耦合或調(diào)用的類知道最少牛郑,盡量不要對外公布太多的public方法和非靜態(tài)的public變量
優(yōu)點: 迪米特法則的核心觀念就是類間解耦,提高類的復(fù)用率
缺點: 可能產(chǎn)生大量的中轉(zhuǎn)或者跳轉(zhuǎn)類淹朋,導(dǎo)致系統(tǒng)的復(fù)雜性提高
總結(jié): 迪米特法則是要求類間解耦,但解耦是有限度酪惭。在實際的項目中者甲,要適度的參考運用,嚴格執(zhí)行就是“過猶不及”
6.開放封閉原則
定義:軟件中的對象(類虏缸、模塊、函數(shù)等)應(yīng)該對于擴展是開放的窥岩,但是宰缤,對于修改是封閉的。
優(yōu)點:
避免修改代碼朦乏,影響已經(jīng)通過單元測試等原業(yè)務(wù)邏輯
可以提高復(fù)用性、可維護性
缺點: 需要預(yù)知變化呻疹,全局統(tǒng)籌筹陵。
總結(jié): 在將開閉原則運行到實際的項目中需注意:
抽象約束朦佩,通過接口或者抽象類約束擴展语稠,對擴展進行邊界開放。
元數(shù)據(jù)控制模塊行為宙暇,通過配置參數(shù)(文件占贫,數(shù)據(jù)庫),減少重復(fù)開發(fā)
制定項目章程
封裝變化瞳收,第一將相同的變化封裝到同一個接口或者抽象類中螟深;第二將不同的變化封裝到不同的接口或抽象類中界弧,不應(yīng)該有兩個不同的變化出現(xiàn)在同一個接口或抽象類中垢箕。