設(shè)計(jì)模式之禪——設(shè)計(jì)原則SOLID+D(讀書筆記)

設(shè)計(jì)原則-SOLID+D

設(shè)計(jì)是有限度的,不能無限的考慮未來的變更情況,否則就會(huì)陷入設(shè)計(jì)的泥潭中而不能自拔

- S單一職責(zé)原則Single Responsibility Principle,SRP

定義: 應(yīng)該有且僅有一個(gè)原因引起類的變更。

單一職責(zé)原則要求一個(gè)接口或類只有一個(gè)原因引起變化,也就是一個(gè)接口或類只有一個(gè)職責(zé),它就負(fù)責(zé)一件事情。

優(yōu)點(diǎn):

  • 類的復(fù)雜性降低,實(shí)現(xiàn)什么職責(zé)都有清晰明確的定義;
  • 可讀性提高;
  • 可維護(hù)性提高;
  • 變更引起的風(fēng)險(xiǎn)降低,變更時(shí)必不可少的,如果接口的單一職責(zé)做得好,一個(gè)接口修改只對(duì)相應(yīng)的實(shí)現(xiàn)類有影響,對(duì)其他的接口無影響,這對(duì)系統(tǒng)的擴(kuò)展性、維護(hù)性都有很大的幫助。

- O開閉原則Open Closed Principle,ocp

定義:軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,其含義是說一個(gè)軟件實(shí)體應(yīng)該通過擴(kuò)展來實(shí)現(xiàn)變化,而不是通過修改已有的代碼來實(shí)現(xiàn)變化。

開閉原則是Java世界里最基礎(chǔ)的設(shè)計(jì)原則,它指導(dǎo)我們?nèi)绾谓⒁蝗朔€(wěn)定的、靈活的系統(tǒng)。

開閉原則告訴我們應(yīng)該盡量通過擴(kuò)展軟件實(shí)體的行為來實(shí)現(xiàn)變化而不是通過修改已有的代碼來完成變化,它是為軟件實(shí)體的未來時(shí)間而定制的對(duì)現(xiàn)行開發(fā)設(shè)計(jì)進(jìn)行約束的一個(gè)原則。

開閉原則是抽象類,其他的原則是具體的實(shí)現(xiàn)類。

優(yōu)點(diǎn):

  • 開閉原則對(duì)測試的影響:只需要保證新增類的正確性,不需要修改原來代碼;
  • 提高復(fù)用性:所有的邏輯是從原子邏輯組合而來的,而不是一個(gè)類中獨(dú)立實(shí)現(xiàn)一個(gè)業(yè)務(wù)邏輯。這樣代碼才可以復(fù)用。復(fù)用減少代碼量,避免相同的邏輯分散在多個(gè)角落,避免日后維護(hù)人員為了修改一個(gè)微小的缺陷或增加新功能而要在項(xiàng)目中到處查找相關(guān)代碼;
  • 開閉原則提高復(fù)用性:擴(kuò)展的時(shí)候不需要維護(hù)原有類;
  • 應(yīng)對(duì)面向?qū)ο箝_發(fā)的要求:抽象接口;

- L里氏替換原則Liskov Substitution Principle,LSP

定義:只要父類能出現(xiàn)的地方子類就能夠出現(xiàn),而且替換為子類也不會(huì)產(chǎn)生任何錯(cuò)誤或異常,使用者可能根本就不需要指導(dǎo)是父類還是子類。但是,反過來就不行了,有子類出現(xiàn)的地方,父類未必能適應(yīng)。

規(guī)范:

  1. 子類必須完全實(shí)現(xiàn)父類的方法。如果子類不能完整的實(shí)現(xiàn)父類的方法,或者父類的某些方法在子類中已經(jīng)發(fā)生畸變,則建議斷開父子繼承關(guān)系,采用依賴、聚集、組合等關(guān)系代替。
  2. 子類可以有自己的個(gè)性。
  3. 覆蓋或?qū)崿F(xiàn)父類的方法時(shí)輸入?yún)?shù)可以被放大。利用重載實(shí)現(xiàn)。
  4. 覆寫或?qū)崿F(xiàn)父類的方法時(shí)輸出結(jié)果可以被縮小。

優(yōu)點(diǎn): 面向?qū)ο蟮恼Z言中,繼承是必不可少的,具有代碼共享、多態(tài)、擴(kuò)展性等優(yōu)點(diǎn),但是也增強(qiáng)了耦合性,降低了靈活性,所以需要里氏替換原則減少弊端,發(fā)揮優(yōu)點(diǎn)。

- I接口隔離原則Interface Segregation Principle

定義:客戶端不該依賴他不需要的接口,類間的依賴關(guān)系應(yīng)該建立在最小的接口上。

建立單一接口,不要建立龐大臃腫的接口

接口分類:

  • 實(shí)例接口:Java中的類也是一種接口
  • 類接口:interface關(guān)鍵字定義的接口

接口隔離原則與單一職責(zé)原則是不一樣的:接口隔離原則與單一職責(zé)的審視角度是不相同的,單一職責(zé)要求的是類和接口職責(zé)單一,注重的是職責(zé),這是業(yè)務(wù)邏輯上的劃分,而接口隔離原則要求接口的方法盡量少。

接口隔離原則是對(duì)接口進(jìn)行規(guī)范約束:

  1. 接口要盡量小。根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)原則;
  2. 接口要高內(nèi)聚。接口中盡量少公布public方法,接口是對(duì)外的承諾,承諾越少對(duì)系統(tǒng)的開發(fā)越有利,變更的風(fēng)險(xiǎn)也越少,同時(shí)也有利于降低成本;
  3. 定制服務(wù)。拆分接口,只提供個(gè)體需要的服務(wù);
  4. 接口設(shè)計(jì)是有限度的;

最佳實(shí)踐:

  • 一個(gè)接口只服務(wù)于一個(gè)子模塊或業(yè)務(wù)邏輯;
  • 通過業(yè)務(wù)邏輯壓縮接口中的public方法;
  • 已經(jīng)被污染的接口,盡量去修改,若變更的風(fēng)險(xiǎn)較大,則采用適配器模式進(jìn)行轉(zhuǎn)化處理; 了解環(huán)境,拒絕盲從。

- D依賴倒置原則Dependence Inversion Principle,DIP

含義:

  • 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象;
  • 抽象不應(yīng)該依賴細(xì)節(jié);
  • 細(xì)節(jié)應(yīng)該依賴抽象;

表現(xiàn):

  • 模塊間的依賴通過抽象發(fā)生,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的;
  • 接口或抽象不依賴于實(shí)現(xiàn)類;
  • 實(shí)現(xiàn)類依賴接口或抽象類。

面向接口編程

采取依賴倒置原則可以減少類間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)引起的風(fēng)險(xiǎn),提高代碼的可讀性和可維護(hù)性。

抽象是對(duì)實(shí)現(xiàn)的約束,對(duì)依賴著而言,也是一種契約,不僅僅約束自己,還同時(shí)約束自己與外部的關(guān)系,其目的是保證所有的細(xì)節(jié)不脫離契約的范疇,確保約束雙方按照既定的契約共同發(fā)展。 最佳實(shí)踐:

  • 每個(gè)類盡量都有接口或抽象類,或者抽象類和接口都具備;
  • 變量的表面類型盡量是接口或者是抽象類;
  • 任何類都不該從具體類派生
  • 盡量不要覆寫基類的方法;
  • 結(jié)合里氏替換原則使用。

- D迪米特法則Law of Demeter,LOD

定義:應(yīng)該對(duì)其他對(duì)象有最少的了解。

迪米特法則的核心觀念就是類間解耦,弱耦合,只有弱耦合之后,類的復(fù)用率才可以提高。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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