JAVA開發(fā)六大設(shè)計(jì)原則(SOLID)

引用一位10年Java工作經(jīng)驗(yàn)的架構(gòu)師聊Java和工作經(jīng)驗(yàn)

1.單一職責(zé)原則(Single?Responsibility?Principle?-?SRP)

原文:There?should?never?be?more?than?one?reason?for?a?class?to?change.

譯文:永遠(yuǎn)不應(yīng)該有多于一個(gè)原因來改變某個(gè)類。

理解:對(duì)于一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。說白了就是,不同的類具備不同的職責(zé),各施其責(zé)。這就好比一個(gè)團(tuán)隊(duì),大家分工協(xié)作,互不影響,各做各的事情。

應(yīng)用:當(dāng)我們做系統(tǒng)設(shè)計(jì)時(shí),如果發(fā)現(xiàn)有一個(gè)類擁有了兩種的職責(zé),那就問自己一個(gè)問題:可以將這個(gè)類分成兩個(gè)類嗎?如果真的有必要,那就分吧。千萬不要讓一個(gè)類干的事情太多!

2.開放封閉原則(Open?Closed?Principle?-?OCP)

原文:Software?entities?like?classes,?modules?and?functions?should?be?open?for?extension?but?closed?for?modifications.

譯文:軟件實(shí)體,如:類、模塊與函數(shù),對(duì)于擴(kuò)展應(yīng)該是開放的,但對(duì)于修改應(yīng)該是封閉的。

理解:簡言之,對(duì)擴(kuò)展開放,對(duì)修改封閉。換句話說,可以去擴(kuò)展類,但不要去修改類。

應(yīng)用:當(dāng)需求有改動(dòng),要修改代碼了,此時(shí)您要做的是,盡量用繼承或組合的方式來擴(kuò)展類的功能,而不是直接修改類的代碼。當(dāng)然,如果能夠確保對(duì)整體架構(gòu)不會(huì)產(chǎn)生任何影響,那么也沒必要搞得那么復(fù)雜了,直接改這個(gè)類吧。

3.里氏替換原則(Liskov?Substitution?Principle?-?LSP)

原文:Functions?that?use?pointers?or?references?to?base?classes?must?be?able?to?use?objects?of?derived?classes?without?knowing?it.

譯文:使用基類的指針或引用的函數(shù),必須是在不知情的情況下,能夠使用派生類的對(duì)象。

理解:父類能夠替換子類,但子類不一定能替換父類。也就是說,在代碼中可以將父類全部替換為子類,程序不會(huì)報(bào)錯(cuò),也不會(huì)在運(yùn)行時(shí)出現(xiàn)任何異常,但反過來卻不一定成立。

應(yīng)用:在繼承類時(shí),務(wù)必重寫(Override)父類中所有的方法,尤其需要注意父類的?protected?方法(它們往往是讓您重寫的),子類盡量不要暴露自己的?public?方法供外界調(diào)用。

該原則由麻省理工學(xué)院的?Barbara?Liskov?女士提出,她是美國第一位獲取計(jì)算機(jī)博士學(xué)位的女性,曾經(jīng)也獲得過計(jì)算機(jī)圖靈獎(jiǎng)。

4.最少知識(shí)原則(Least?Knowledge?Principle?-?LKP)

原文:Only?talk?to?you?immediate?friends.

譯文:只與你最直接的朋友交流。

理解:盡量減少對(duì)象之間的交互,從而減小類之間的耦合。簡言之,一定要做到:低耦合,高內(nèi)聚。

應(yīng)用:在做系統(tǒng)設(shè)計(jì)時(shí),不要讓一個(gè)類依賴于太多的其他類,需盡量減小依賴關(guān)系,否則,您死都不知道自己怎么死的。

該原則也稱為“迪米特法則(Law?of?Demeter)”,由?Ian?Holland?提出。這個(gè)人不太愿意和陌生人說話,只和他走得最近的朋友們交流。

5.接口隔離原則(Interface?Segregation?Principle?-?ISP)

原文:The?dependency?of?one?class?to?another?one?should?depend?on?the?smallest?possible?interface.

譯文:一個(gè)類與另一個(gè)類之間的依賴性,應(yīng)該依賴于盡可能小的接口。

理解:不要對(duì)外暴露沒有實(shí)際意義的接口。也就是說,接口是給別人調(diào)用的,那就不要去為難別人了,盡可能保證接口的實(shí)用性吧。她好,我也好。

應(yīng)用:當(dāng)需要對(duì)外暴露接口時(shí),需要再三斟酌,如果真的沒有必要對(duì)外提供的,就刪了吧。一旦您提供了,就意味著,您將來要多做一件事情,何苦要給自己找事做呢。

6.?依賴倒置原則(Dependence?Inversion?Principle?-?DIP)

原文:High?level?modules?should?not?depends?upon?low?level?modules.?Both?should?depend?upon?abstractions.?Abstractions?should?not?depend?upon?details.?Details?should?depend?upon?abstractions.

譯文:高層模塊不應(yīng)該依賴于低層模塊,它們應(yīng)該依賴于抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。

理解:應(yīng)該面向接口編程,不應(yīng)該面向?qū)崿F(xiàn)類編程。面向?qū)崿F(xiàn)類編程,相當(dāng)于就是論事,那是正向依賴(正常人思維);面向接口編程,相當(dāng)于通過事物表象來看本質(zhì),那是反向依賴,即依賴倒置(程序員思維)。

應(yīng)用:并不是說,所有的類都要有一個(gè)對(duì)應(yīng)的接口,而是說,如果有接口,那就盡量使用接口來編程吧。

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評(píng)論 25 709
  • 起伏很多,很多東西在匯聚整合。這是多年以來,內(nèi)心再次被攪動(dòng)得如此厲害,像掀起了一股暗流,逐漸匯聚成波濤洶涌的巨浪,...
    沐翠微閱讀 265評(píng)論 0 1
  • 通過Xcode命令行編譯 本文檔提供命令行常提到一些問題 命令行工具是什么 命令行工具包是一個(gè)小型獨(dú)立包,可供下載...
    君賞閱讀 28,411評(píng)論 1 16

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