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)系
這是倒轉(zhuǎn)之后的依賴(lài)關(guān)系:
? 看箭頭渊额!看箭頭尽纽!看箭頭夏志!反向是不是倒轉(zhuǎn)了乃坤。接口屬于高層定義的,那么低層模塊就相當(dāng)于依賴(lài)于高層了,這是我理解的倒轉(zhuǎn)湿诊。
? 高內(nèi)聚狱杰,低耦合時(shí)每個(gè)程序員追求的目標(biāo),而要想實(shí)現(xiàn)這些目標(biāo)厅须,就需要一些規(guī)則支撐仿畸,SOLID就是這樣的規(guī)則。而理解了這些規(guī)則朗和,可以更好的理解涉及模式错沽。