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)聚、松耦合”编振?