SOLID五大原則

SOLID五大原則

? 面向?qū)ο缶幊逃形宕笤瓌t:

  • Single responsibility principle:?jiǎn)我宦氊?zé)原則,一個(gè)對(duì)象應(yīng)該具有單一功能兆览,不應(yīng)該將過(guò)多的功能賦予一個(gè)類(lèi)
  • Open-close principle:開(kāi)閉原則悼沈,對(duì)擴(kuò)展開(kāi)發(fā)贱迟,對(duì)修改關(guān)閉姐扮。
  • Liskov substitution principle:里氏替換原則,程序里的對(duì)象可以被其子類(lèi)替換衣吠,且不改變其正確性茶敏。
  • Interface segregation principle:接口隔離原則,多個(gè)客戶(hù)端特定接口比一個(gè)用途廣泛的接口好
  • Dependency inversion principle:依賴(lài)反轉(zhuǎn)原則缚俏,依賴(lài)于抽象而不是一個(gè)實(shí)例

? 開(kāi)發(fā)軟件的目的惊搏,是實(shí)現(xiàn)軟件的功能,隨后忧换,是提高軟件的性能恬惯,容錯(cuò)性,可擴(kuò)展性亚茬,可維護(hù)性酪耳,穩(wěn)定性等。在軟件設(shè)計(jì)之初刹缝,軟件的功能性是首要考慮目標(biāo)碗暗;對(duì)盡可能多的錯(cuò)誤輸入進(jìn)行有效的反饋可以提高軟件的容錯(cuò)性;對(duì)流程邏輯進(jìn)行和里的設(shè)計(jì)和對(duì)java語(yǔ)言進(jìn)行合理的使用梢夯,可以提高軟件的性能讹堤;而遵循SOLID原則進(jìn)行設(shè)計(jì),可以有效的增加程序的可維護(hù)性和擴(kuò)展性厨疙,而所有的其他特性決定了軟件的穩(wěn)定性洲守。

? 單一職責(zé)原則是設(shè)計(jì)類(lèi)的時(shí)候,使其具有單一功能沾凄,比如說(shuō)梗醇,person類(lèi)只具有人的功能,它不能再具有人之外的其他功能撒蟀,如果你想設(shè)計(jì)一個(gè)超人叙谨,請(qǐng)?jiān)黾右粋€(gè)類(lèi),super-person保屯。

? 開(kāi)閉原則手负,對(duì)擴(kuò)展開(kāi)發(fā),對(duì)修改關(guān)閉姑尺。在軟件的生命周期內(nèi)竟终,因變化,升級(jí)切蟋,和維護(hù)等原因需要對(duì)軟件進(jìn)行修改的時(shí)候统捶,盡量通過(guò)擴(kuò)展實(shí)體,而不是通過(guò)修改已有代碼來(lái)實(shí)現(xiàn)變化。

? 里氏替換原則喘鸟,程序的對(duì)象可以被子類(lèi)的對(duì)象替換匆绣,且不會(huì)改變程序的正確性。子類(lèi)可以無(wú)縫替換父類(lèi)什黑,這在編程語(yǔ)言特性上已經(jīng)實(shí)現(xiàn)崎淳,可是不改變程序的正確性,需要開(kāi)發(fā)人員對(duì)子類(lèi)進(jìn)行良好的設(shè)計(jì)愕把。

? 接口隔離原則拣凹,為每一個(gè)實(shí)現(xiàn)類(lèi)設(shè)計(jì)一個(gè)特定接口,好過(guò)講所有實(shí)現(xiàn)類(lèi)的功能設(shè)計(jì)為一個(gè)接口礼华。這個(gè)和類(lèi)的單一職責(zé)類(lèi)時(shí)咐鹤,是對(duì)接口的的單一職責(zé)的規(guī)定。

? 依賴(lài)反轉(zhuǎn)原則:是指一種特定的解耦(傳統(tǒng)的依賴(lài)關(guān)系創(chuàng)建在高層次上圣絮,而具體的策略設(shè)置則應(yīng)用在低層次的模塊上)形式祈惶,使得高層次的模塊不依賴(lài)于低層次的模塊的實(shí)現(xiàn)細(xì)節(jié),依賴(lài)關(guān)系被顛倒(反轉(zhuǎn))扮匠,從而使得低層次模塊依賴(lài)于高層次模塊的需求抽象捧请。

? 我們開(kāi)發(fā)模塊的接口和實(shí)現(xiàn)類(lèi)是相互影響的,如果我們需要改變接口棒搜,那么實(shí)現(xiàn)類(lèi)勢(shì)必受到影響疹蛉,如果我們提供的接口不滿(mǎn)足實(shí)現(xiàn)類(lèi)的需求,就需要我們改變接口來(lái)滿(mǎn)足實(shí)現(xiàn)類(lèi)新的需求力麸。如果我們提供的接口過(guò)于肥胖可款,即抽離所有暴露的方法封裝在一個(gè)接口中,就會(huì)導(dǎo)致:1克蚂、實(shí)現(xiàn)類(lèi)可能會(huì)需要實(shí)現(xiàn)不需要的方法闺鲸,加重負(fù)擔(dān);2埃叭、接口一旦改變摸恍,無(wú)論改變涉及不涉及實(shí)現(xiàn)類(lèi)使用的接口,都需要實(shí)現(xiàn)類(lèi)進(jìn)行改變赤屋。

? 所以我們需要把肥胖的接口按照不同角色(即功能)分割開(kāi)來(lái)立镶,形成不同的角色接口,不同的客戶(hù)都使用不同的角色类早,那么我們?cè)诟淖兘涌诘臅r(shí)候媚媒,只需要對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)改變即可。

? Robert C. Martin說(shuō)單一職責(zé)的是指每一個(gè)module或則class都只有一個(gè)改變的原因莺奔,而這個(gè)改變的原因一定是人提出的欣范,所以這個(gè)原則是和人有關(guān)的变泄。

? 單一職責(zé)原則要求class或module只有一個(gè)職責(zé)令哟,而將單個(gè)多角色接口(肥胖的接口)分離成多個(gè)單角色接口恼琼,這樣我們對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)就可以更明確自己的責(zé)任,減少改變的原因屏富,實(shí)現(xiàn)單一職責(zé)原則晴竞,

? 開(kāi)閉原則是對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放狠半。這其中的關(guān)鍵是抽象和多態(tài)噩死。當(dāng)依賴(lài)于抽象的時(shí)候,我們就一個(gè)隨時(shí)更好具體的實(shí)現(xiàn)類(lèi)來(lái)實(shí)現(xiàn)變化神年。

? 個(gè)人理解已维,他真正的指的是在增加一個(gè)功能的時(shí)候,只需要增加新功能代碼已日,不需要修改使用這些功能的代碼垛耳。但是在現(xiàn)實(shí)中,是不可能100%對(duì)修改關(guān)閉的飘千,所以我們需要根據(jù)經(jīng)驗(yàn)去堂鲜,將哪些需要不得不修改的地方獨(dú)立出去,在修改的時(shí)候盡量降低影響护奈。

? 里氏替換原則是子類(lèi)可以替換父類(lèi)缔莲,且破壞程序的正確性。這個(gè)規(guī)則強(qiáng)調(diào)了子類(lèi)和父類(lèi)要在外在行為霉旗,即公共方法上保持一直痴奏。如何保證父子類(lèi)在行為上保持一致?我們聲明方法的時(shí)候厌秒,需要聲明前置條件和后置條件读拆,要想保持父子類(lèi)行為一致,就需要子類(lèi)的前置條件要比父類(lèi)的前置條件寬松简僧,以使父類(lèi)的前置條件完全可以使用子類(lèi)建椰,子類(lèi)的后置條件要比父類(lèi)嚴(yán)格恳啥,以使子類(lèi)的后置條件完全使用于父類(lèi)浅缸。

? 依賴(lài)倒置原則是

  • 高層次模塊不應(yīng)該依賴(lài)低層次模塊脑漫,他們都應(yīng)該依賴(lài)抽象柱锹;
  • 抽象不應(yīng)該依賴(lài)細(xì)節(jié)萤厅,細(xì)節(jié)應(yīng)該依賴(lài)抽象

? 這里為什么要用倒置呢毕贼?看下圖:

這是原本的依賴(lài)關(guān)系


1584288217310.png

這是倒轉(zhuǎn)之后的依賴(lài)關(guān)系:


1584288289707.png

? 看箭頭渊额!看箭頭尽纽!看箭頭夏志!反向是不是倒轉(zhuǎn)了乃坤。接口屬于高層定義的,那么低層模塊就相當(dāng)于依賴(lài)于高層了,這是我理解的倒轉(zhuǎn)湿诊。

? 高內(nèi)聚狱杰,低耦合時(shí)每個(gè)程序員追求的目標(biāo),而要想實(shí)現(xiàn)這些目標(biāo)厅须,就需要一些規(guī)則支撐仿畸,SOLID就是這樣的規(guī)則。而理解了這些規(guī)則朗和,可以更好的理解涉及模式错沽。

參考:

SOLID

開(kāi)閉原則

Law of Demeter

RoleInterface

The Single Responsibility Principle, Robert C Martin

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眶拉,隨后出現(xiàn)的幾起案子千埃,更是在濱河造成了極大的恐慌,老刑警劉巖忆植,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件放可,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡唱逢,警方通過(guò)查閱死者的電腦和手機(jī)吴侦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坞古,“玉大人备韧,你說(shuō)我怎么就攤上這事』痉悖” “怎么了织堂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)奶陈。 經(jīng)常有香客問(wèn)我易阳,道長(zhǎng),這世上最難降的妖魔是什么吃粒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任潦俺,我火速辦了婚禮,結(jié)果婚禮上徐勃,老公的妹妹穿的比我還像新娘事示。我一直安慰自己,他們只是感情好僻肖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布肖爵。 她就那樣靜靜地躺著,像睡著了一般臀脏。 火紅的嫁衣襯著肌膚如雪劝堪。 梳的紋絲不亂的頭發(fā)上冀自,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音秒啦,去河邊找鬼熬粗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帝蒿,可吹牛的內(nèi)容都是我干的荐糜。 我是一名探鬼主播巷怜,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葛超,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了延塑?” 一聲冷哼從身側(cè)響起绣张,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关带,沒(méi)想到半個(gè)月后侥涵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋雏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年芜飘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磨总。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗦明,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚪燕,到底是詐尸還是另有隱情娶牌,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布馆纳,位于F島的核電站诗良,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲁驶。R本人自食惡果不足惜鉴裹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钥弯。 院中可真熱鬧径荔,春花似錦、人聲如沸寿羞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绪穆。三九已至辨泳,卻和暖如春虱岂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菠红。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工第岖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人试溯。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓蔑滓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遇绞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子键袱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容