- 單一職責(zé)原則(Single Responsibility Principle)
- 開閉原則(Open Closed Principle)
- 里氏替換原則(Liskov Substitution Principle)
- 迪米特法則(Law of Demeter),又叫“最少知道法則”
- 接口隔離原則(Interface Segregation Principle)
- 依賴倒置原則(Dependence Inversion Principle)
把這 6 個(gè)原則的首字母(里氏替換原則和迪米特法則的首字母重復(fù)聂使,只取一個(gè))聯(lián)合起來就是:SOLID(穩(wěn)定的)氧枣,其代表的含義也就是把這 6 個(gè)原則結(jié)合使用的好處:建立穩(wěn)定佛嬉、靈活找都、健壯的設(shè)計(jì)踢械。
單一職責(zé)
單一職責(zé)原則要求一個(gè)接口或一個(gè)類只能有一個(gè)原因引起變化沃暗,也就是一個(gè)接口或者類只能有一個(gè)職責(zé)魁兼,只負(fù)責(zé)一件事情坐搔。
優(yōu)勢(shì):
- 類的復(fù)雜性降低藏研,實(shí)現(xiàn)什么職責(zé)都有清晰明確的定義;
- 可讀性高概行,復(fù)雜性降低蠢挡,可讀性自然就提高了;
- 可維護(hù)性提高,可讀性提高了业踏,那自然更容易維護(hù)了禽炬;
- 變更引起的風(fēng)險(xiǎn)降低,變更是必不可少的勤家,如果接口的單一職責(zé)做得好腹尖,一個(gè)接口修改只對(duì)相應(yīng)的實(shí)現(xiàn)類有影響,對(duì)其他的接口無影響却紧,這對(duì)系統(tǒng)的擴(kuò)展性桐臊、維護(hù)性都有非常大的幫助。
里氏替換原則
在面向?qū)ο蟮恼Z言中晓殊,繼承是必不可少的断凶、非常優(yōu)秀的語言機(jī)制,它有如下優(yōu)點(diǎn):
- 代碼共享巫俺,減少創(chuàng)建類的工作量认烁,每個(gè)子類都擁有父類的屬性和方法;
- 提高代碼的重用性介汹;
- 子類可以形似父類却嗡,但又異于父類;
- 提高代碼的可擴(kuò)展性嘹承;
- 提高產(chǎn)品或項(xiàng)目的開放性窗价。
有優(yōu)點(diǎn)就必然存在缺點(diǎn):
- 繼承是侵入性的。只要繼承叹卷,就必須擁有父類的屬性和方法撼港。
- 降低代碼的靈活性。子類會(huì)多一些父類的約束骤竹。
- 增強(qiáng)了耦合性帝牡。當(dāng)父類的常量、變量蒙揣、方法被修改時(shí)靶溜,需要考慮子類的修改。
為了讓“利”的因素發(fā)揮最大的作用懒震,同時(shí)減少“弊”帶來的麻煩罩息,引入了里氏替換原則(LSP),即只要父類能出現(xiàn)的地方挎狸,子類就可以出現(xiàn)扣汪,而且替換為子類也不會(huì)產(chǎn)生任何錯(cuò)誤或異常。一句簡(jiǎn)單的定義包含了4層含義:
- 子類必須完全實(shí)現(xiàn)父類的方法
- 子類可以有自己的個(gè)性
- 覆蓋或?qū)崿F(xiàn)父類的方法時(shí)锨匆,輸入?yún)?shù)可以被放大
- 覆蓋或?qū)崿F(xiàn)父類的方法時(shí)崭别,輸出結(jié)果可以被縮小
依賴倒置原則
- 模塊間的依賴通過抽象發(fā)生冬筒,實(shí)現(xiàn)類之間不直接發(fā)生依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的
- 接口或抽象類不依賴于實(shí)現(xiàn)類
- 實(shí)現(xiàn)類依賴接口或抽象類
優(yōu)點(diǎn):
依賴倒置原則可以減少類間的耦合性茅主,提高系統(tǒng)的穩(wěn)定性舞痰,降低并行開發(fā)引起的風(fēng)險(xiǎn),提高代碼的可讀性和可維護(hù)性
接口隔離原則
接口隔離原則就是客戶端不應(yīng)該依賴它不需要的接口诀姚,或者說類間的依賴關(guān)系應(yīng)該建立在最小的接口上响牛,接口隔離原則是對(duì)接口進(jìn)行規(guī)范約束。
其實(shí)通俗來理解就是赫段,不要在一個(gè)接口里面放很多的方法呀打,這樣會(huì)顯得這個(gè)類很臃腫不堪。接口應(yīng)該盡量細(xì)化糯笙,一個(gè)接口對(duì)應(yīng)一個(gè)功能模塊贬丛,同時(shí)接口里面的方法應(yīng)該盡可能的少,使接口更加輕便靈活给涕〔蜚荆或許看到接口隔離原則這樣的定義很多人會(huì)覺得和單一職責(zé)原則很像,但是這兩個(gè)原則還是有著很鮮明的區(qū)別够庙。接口隔離原則和單一職責(zé)原則的審視角度是不同的恭应,單一職責(zé)原則要求類和接口職責(zé)單一,注重的是職責(zé)耘眨,是業(yè)務(wù)邏輯上的劃分昼榛,而接口隔離原則要求方法要盡可能的少,是在接口設(shè)計(jì)上的考慮剔难。例如一個(gè)接口的職責(zé)包含10個(gè)方法褒纲,這10個(gè)方法都放在一個(gè)接口中,并且提供給多個(gè)模塊訪問钥飞,各個(gè)模塊按照規(guī)定的權(quán)限來訪問,并規(guī)定了“不使用的方法不能訪問”衫嵌,這樣的設(shè)計(jì)是不符合接口隔離原則的读宙,接口隔離原則要求“盡量使用多個(gè)專門的接口”,這里專門的接口就是指提供給每個(gè)模塊的都應(yīng)該是單一接口(即每一個(gè)模塊對(duì)應(yīng)一個(gè)接口)楔绞,而不是建立一個(gè)龐大臃腫的接口來容納所有的客戶端訪問结闸。
使用原則
- 根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)原則: 沒有哪個(gè)設(shè)計(jì)可以十全十美的考慮到所有的設(shè)計(jì)原則酒朵,有些設(shè)計(jì)原則之間就可能出現(xiàn)沖突桦锄,就如同單一職責(zé)原則和接口隔離原則,一個(gè)考慮的是接口的職責(zé)的單一性蔫耽,一個(gè)考慮的是方法設(shè)計(jì)的專業(yè)性(盡可能的少)结耀,必然是會(huì)出現(xiàn)沖突留夜。在出現(xiàn)沖突時(shí),盡量以單一職責(zé)為主图甜,當(dāng)然這也要考慮具體的情況碍粥。
- 提高高內(nèi)聚: 提高接口,類黑毅,模塊的處理能力嚼摩,減少對(duì)外的交互。比如你給殺手提交了一個(gè)訂單矿瘦,要求他在一周之內(nèi)殺一個(gè)人枕面,一周后殺手完成了任務(wù),這種不講條件完成任務(wù)的表現(xiàn)就是高內(nèi)聚缚去。具體來說就是:要求在接口中盡量少公布public方法潮秘,接口是對(duì)外的承諾,承諾越少對(duì)系統(tǒng)的開發(fā)越有利病游,變更的風(fēng)險(xiǎn)就越小唇跨,也有利于降低成本。
- 定制服務(wù): 單獨(dú)為一個(gè)個(gè)體提供優(yōu)良服務(wù)(只提供訪問者需要的方法)衬衬。
- 接口設(shè)計(jì)要有限度: 根據(jù)經(jīng)驗(yàn)判斷
迪米特法則
迪米特法則(LoD)也叫最少知道法則:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象有最少的了解买猖。
- 只和朋友交流:類與類之間的關(guān)系是建立在類間的,而不是方法間滋尉,因此一個(gè)方法盡量不引入一個(gè)類中不存在的對(duì)象
- 朋友間也是有距離的:一個(gè)類把太多方法暴露給另一個(gè)類玉控,兩者的朋友關(guān)系太親密了,耦合關(guān)系變的異常牢固狮惜,如果更改聊其中一個(gè)方法高诺,則要同時(shí)修改另一個(gè)類,增加了風(fēng)險(xiǎn)碾篡。因此虱而,這種耦合是不合適的,我們需要對(duì)其優(yōu)化开泽。一個(gè)類公開的public屬性或方法越多牡拇,修改時(shí)涉及的面也就越大,變更引起的風(fēng)險(xiǎn)擴(kuò)散也就越大穆律。所以惠呼,我們開發(fā)中盡量不要對(duì)外公布太多public方法和非靜態(tài)的public變量,盡量?jī)?nèi)斂
- 是自己的就是自己的:在實(shí)際開發(fā)中經(jīng)常會(huì)出現(xiàn)這樣一種情況:一個(gè)方法放在本類中也可以峦耘,放在其他類中也沒有錯(cuò)剔蹋。那這時(shí),我們只需要堅(jiān)持一個(gè)原則:如果一個(gè)方法放在本類中辅髓,既不增加類間關(guān)系泣崩,也對(duì)本類不產(chǎn)生負(fù)面影響少梁,那就放置在本類中。
開閉原則
開閉原則是指一個(gè)軟件實(shí)體如類律想、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放猎莲,對(duì)修改關(guān)閉。也就是說一個(gè)軟件實(shí)體應(yīng)該通過擴(kuò)展來實(shí)現(xiàn)變化技即,而不是通過修改已有的代碼來實(shí)現(xiàn)變化著洼。
為什么要用開閉原則
- 開閉原則非常著名,只要是做面向?qū)ο缶幊痰亩穑陂_發(fā)時(shí)都會(huì)提及開閉原則身笤。
- 開閉原則是最基礎(chǔ)的一個(gè)原則,前面介紹的5個(gè)原則都是開閉原則的具體形態(tài)葵陵,而開閉原則才是其精神領(lǐng)袖液荸。
- 開閉原則提高了復(fù)用性,以及可維護(hù)性脱篙。
總結(jié):
總結(jié)六大設(shè)計(jì)原則
單一職責(zé)原則:一個(gè)類或接口只承擔(dān)一個(gè)職責(zé)娇钱。
里氏替換原則:在繼承類時(shí),務(wù)必重寫(override)父類中所有的方法绊困,尤其需要注意父類的protected方法(它們往往是讓你重寫的)文搂,子類盡量不要暴露自己的public方法供外界調(diào)用。
依賴倒置原則:高層模塊不應(yīng)該依賴于低層模塊秤朗,而應(yīng)該依賴于抽象煤蹭。抽象不應(yīng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)依賴于抽象取视。
接口隔離原則:不要對(duì)外暴露沒有實(shí)際意義的接口硝皂。
迪米特法則:盡量減少對(duì)象之間的交互,從而減小類之間的耦合作谭。
開閉原則:對(duì)軟件實(shí)體的改動(dòng)稽物,最好用擴(kuò)展而非修改的方式。
總結(jié)來自:https://zhuanlan.zhihu.com/p/110130347