設(shè)計原則

1. SOLID原則

通常所說的SOLID 原則并非單純的 1 個原則,而是由 5 個設(shè)計原則組成的脸秽,它們分別是:單一職責(zé)原則(SRP)立膛、開閉原則(OCP)里氏替換原則(LSP)糙麦、接口隔離原則(ISP)依賴倒置原則(DIP).

縮寫 英文名稱 中文名稱
SRP Single Responsibility Principle 單一職責(zé)原則
OCP Open Close Principle 開閉原則
LSP Liskov Substitution Principle 里氏替換原則
ISP Interface Segregation Principle 接口分離原則
DIP Dependency Inversion Principle 依賴倒置原則

ps: 通常所說的SOLID不包含LoD(迪米特法則(最少知道原則))
LoD: Law of Demeter ( Least Knowledge Principle)迪米特法則(最少知道原則)

1.1 單一職責(zé)原則(SRP),Single Responsibility Principle

這個原則的英文描述是這樣的:A class or module should have a single responsibility丛肮。
一個類或者模塊只負責(zé)完成一個職責(zé)(或者功能)赡磅。

1.2 開閉原則(OCP),Open Closed Principle

它的英文描述是:software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification宝与。
軟件實體(模塊焚廊、類、方法等)應(yīng)該“對擴展開放习劫、對修改關(guān)閉”咆瘟。
即:添加一個新的功能應(yīng)該是,在已有代碼基礎(chǔ)上擴展代碼(新增模塊诽里、類袒餐、方法等),而非修改已有代碼(修改模塊谤狡、類灸眼、方法等)。

1.3 里氏替換原則(LSP)墓懂,Liskov Substitution Principle

這個原則最早是在 1986 年由 Barbara Liskov 提出焰宣,他是這么描述這條原則的:

If S is a subtype of T, then objects of type T may be replaced with objects of type S, without breaking the program。

在 1996 年捕仔,Robert Martin 在他的 SOLID 原則中匕积,重新描述了這個原則,英文原話是這樣的:

Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it榜跌。

我們綜合兩者的描述闪唆,將這條原則用中文描述出來,是這樣的:子類對象(object of subtype/derived class)能夠替換程序(program)中父類對象(object of base/parent class)出現(xiàn)的任何地方斜做,并且保證原來程序的邏輯行為(behavior)不變及正確性不被破壞苞氮。
雖然從定義描述和代碼實現(xiàn)上來看,多態(tài)和里式替換有點類似瓤逼,但它們關(guān)注的角度是不一樣的笼吟。多態(tài)是面向?qū)ο缶幊痰囊淮筇匦钥馕铮彩敲嫦驅(qū)ο缶幊陶Z言的一種語法。它是一種代碼實現(xiàn)的思路贷帮。而里式替換是一種設(shè)計原則戚揭,是用來指導(dǎo)繼承關(guān)系中子類該如何設(shè)計的,子類的設(shè)計要保證在替換父類的時候撵枢,不改變原有程序的邏輯以及不破壞原有程序的正確性民晒。
里式替換原則是用來指導(dǎo)繼承關(guān)系中子類該如何設(shè)計的一個原則。 理解里式替換原則锄禽,最核心的就是理解“design by contract(按照協(xié)議來設(shè)計)”這幾個字潜必。父類定義了函數(shù)的“約定”(或者叫協(xié)議),那子類可以改變函數(shù)的內(nèi)部實現(xiàn)邏輯沃但,但不能改變函數(shù)原有的“約定”磁滚。這里的約定包括:函數(shù)聲明要實現(xiàn)的功能;對輸入宵晚、輸出垂攘、異常的約定;甚至包括注釋中所羅列的任何特殊說明淤刃。

1.4 接口隔離原則(ISP)晒他,Interface Segregation Principle

Clients should not be forced to depend upon interfaces that they do not use.
客戶端不應(yīng)該被強迫依賴它不需要的接口。其中的“客戶端”逸贾,可以理解為接口的調(diào)用者或者使用者陨仅。

1.5 依賴倒置原則/依賴反轉(zhuǎn)原則(DIP),Dependency Inversion Principle

High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.

高層模塊(high-level modules)不要依賴低層模塊(low-level)耕陷。高層模塊和低層模塊應(yīng)該通過抽象(abstractions)來互相依賴掂名。除此之外据沈,抽象(abstractions)不要依賴具體實現(xiàn)細節(jié)(details)哟沫,具體實現(xiàn)細節(jié)(details)依賴抽象(abstractions)。


其他原則: KISS锌介, YANGI嗜诀, DRY,迪米特法則

2. KISS原則

有三種描述方式

Keep It Simple and Stupid.
Keep It Short and Simple.
Keep It Simple and Straightforward.

翻譯成中文就是:盡量保持簡單孔祸。

3. YANGI原則

英文全稱是:You Ain’t Gonna Need It隆敢。直譯就是:你不會需要它。
實際上崔慧,這條原則的核心思想就是:不要做過度設(shè)計拂蝎。

YAGNI 原則跟 KISS 原則并非一回事兒:
KISS 原則講的是“如何做”的問題(盡量保持簡單),而 YAGNI 原則說的是“要不要做”的問題(當(dāng)前不需要的就不要做)惶室。

4. DRY 原則

它的英文描述為:Don’t Repeat Yourself温自。中文直譯為:不要重復(fù)自己玄货。
將它應(yīng)用在編程中,可以理解為:不要寫重復(fù)的代碼悼泌。

5. 迪米特法則(LoD)

Law of Demeter松捉, LoD
更直觀的叫法最小知識原則,英文翻譯為:The Least Knowledge Principle馆里。

Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.

翻譯成中文:

每個模塊(unit)只應(yīng)該了解那些與它關(guān)系密切的模塊(units: only units “closely” related to the current unit)的有限知識(knowledge)隘世。或者說鸠踪,每個模塊只和自己的朋友“說話”(talk)丙者,不和陌生人“說話”(talk)。

利用這個原則营密,能夠幫我們實現(xiàn)代碼的“高內(nèi)聚蔓钟、松耦合”。

參考:
《極客時間》面向?qū)ο笤O(shè)計的六大設(shè)計原則
《極客時間》設(shè)計模式:面向?qū)ο笤O(shè)計的六大原則
《極客時間》面向?qū)ο笤O(shè)計的六大設(shè)計原則
《極客時間》里式替換(LSP)
《極客時間》我為何說KISS卵贱、YAGNI原則看似簡單滥沫,卻經(jīng)常被用錯?
《極客時間》重復(fù)的代碼就一定違背DRY嗎键俱?如何提高代碼的復(fù)用性兰绣?
《極客時間》如何用迪米特法則(LOD)實現(xiàn)“高內(nèi)聚、松耦合”编振?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缀辩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子踪央,更是在濱河造成了極大的恐慌臀玄,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畅蹂,死亡現(xiàn)場離奇詭異健无,居然都是意外死亡,警方通過查閱死者的電腦和手機液斜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門累贤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人少漆,你說我怎么就攤上這事臼膏。” “怎么了示损?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵渗磅,是天一觀的道長。 經(jīng)常有香客問我,道長始鱼,這世上最難降的妖魔是什么论巍? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮风响,結(jié)果婚禮上嘉汰,老公的妹妹穿的比我還像新娘。我一直安慰自己状勤,他們只是感情好鞋怀,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著持搜,像睡著了一般密似。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葫盼,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天残腌,我揣著相機與錄音,去河邊找鬼贫导。 笑死抛猫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孩灯。 我是一名探鬼主播闺金,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峰档!你這毒婦竟也來了败匹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤讥巡,失蹤者是張志新(化名)和其女友劉穎掀亩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢顷,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡槽棍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吱涉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹泄。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡外里,死狀恐怖怎爵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盅蝗,我是刑警寧澤鳖链,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響芙委,放射性物質(zhì)發(fā)生泄漏逞敷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一灌侣、第九天 我趴在偏房一處隱蔽的房頂上張望推捐。 院中可真熱鬧,春花似錦侧啼、人聲如沸牛柒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皮壁。三九已至,卻和暖如春哪审,著一層夾襖步出監(jiān)牢的瞬間蛾魄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工湿滓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滴须,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓叽奥,卻偏偏與公主長得像描馅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子而线,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348