六大設(shè)計(jì)原則

  • 單一職責(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ì):
  1. 類的復(fù)雜性降低藏研,實(shí)現(xiàn)什么職責(zé)都有清晰明確的定義;
  2. 可讀性高概行,復(fù)雜性降低蠢挡,可讀性自然就提高了;
  3. 可維護(hù)性提高,可讀性提高了业踏,那自然更容易維護(hù)了禽炬;
  4. 變更引起的風(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ì)原則

  1. 單一職責(zé)原則:一個(gè)類或接口只承擔(dān)一個(gè)職責(zé)娇钱。

  2. 里氏替換原則:在繼承類時(shí),務(wù)必重寫(override)父類中所有的方法绊困,尤其需要注意父類的protected方法(它們往往是讓你重寫的)文搂,子類盡量不要暴露自己的public方法供外界調(diào)用。

  3. 依賴倒置原則:高層模塊不應(yīng)該依賴于低層模塊秤朗,而應(yīng)該依賴于抽象煤蹭。抽象不應(yīng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)依賴于抽象取视。

  4. 接口隔離原則:不要對(duì)外暴露沒有實(shí)際意義的接口硝皂。

  5. 迪米特法則:盡量減少對(duì)象之間的交互,從而減小類之間的耦合作谭。

  6. 開閉原則:對(duì)軟件實(shí)體的改動(dòng)稽物,最好用擴(kuò)展而非修改的方式。

總結(jié)來自:https://zhuanlan.zhihu.com/p/110130347

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末折欠,一起剝皮案震驚了整個(gè)濱河市姨裸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怨酝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件那先,死亡現(xiàn)場(chǎng)離奇詭異农猬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)售淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門斤葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慷垮,“玉大人,你說我怎么就攤上這事揍堕×仙恚” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵衩茸,是天一觀的道長(zhǎng)芹血。 經(jīng)常有香客問我,道長(zhǎng)楞慈,這世上最難降的妖魔是什么幔烛? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮囊蓝,結(jié)果婚禮上饿悬,老公的妹妹穿的比我還像新娘。我一直安慰自己聚霜,他們只是感情好狡恬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝎宇,像睡著了一般弟劲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夫啊,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天函卒,我揣著相機(jī)與錄音,去河邊找鬼撇眯。 笑死报嵌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熊榛。 我是一名探鬼主播锚国,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼玄坦!你這毒婦竟也來了血筑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤煎楣,失蹤者是張志新(化名)和其女友劉穎豺总,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體择懂,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喻喳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了困曙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片表伦。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谦去,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹦哼,到底是詐尸還是另有隱情鳄哭,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布纲熏,位于F島的核電站妆丘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赤套。R本人自食惡果不足惜飘痛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望容握。 院中可真熱鬧宣脉,春花似錦、人聲如沸剔氏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谈跛。三九已至羊苟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間感憾,已是汗流浹背蜡励。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阻桅,地道東北人凉倚。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嫂沉,于是被迫代替她去往敵國(guó)和親稽寒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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