SOLID 原則
如果熟悉面向?qū)ο缶幊?,可能聽說過SOLID原則。
通過插圖更好地理解這些原則,并強調(diào)每個原則的目標(biāo)。
您會看到,其中一些原則可能看起來相似,但它們的目標(biāo)不同。有可能在滿足一個原則的同時違反另一個原則,即使它們是相似的。
為了簡單起見,我將使用“類”這個詞,但請注意它也可以應(yīng)用于本文中的函數(shù)、方法或模塊。
更新*
我收到了一些關(guān)于本文中的 Open Closed 違反單一職責(zé)原則的評論。請注意,本文的目的是獨立地解釋這些原則中的每一個。 此外,職責(zé)(或角色)與行動不同。在 SRP 中,我使用了“I am Painter”,在 Open-Closed 中,我使用了“I can Paint”。 重要的是要注意這一點,因為可以執(zhí)行多個操作來履行職責(zé)(或角色)。該類應(yīng)該有一個責(zé)任(SRP),但其履行該責(zé)任的功能應(yīng)該對擴展(OCP)開放。
現(xiàn)在,讓我們開始吧!
堅實的原則
S——單一職責(zé)
一個類應(yīng)該有一個單一的職責(zé)
如果一個類有很多職責(zé),它會增加錯誤的可能性,因為更改其職責(zé)之一可能會在您不知情的情況下影響其他職責(zé)。
目標(biāo)
該原則旨在分離行為,以便如果由于您的更改而出現(xiàn)錯誤,它不會影響其他不相關(guān)的行為。
O – 開閉原則
類應(yīng)該對擴展開放,對修改關(guān)閉
更改類的當(dāng)前行為將影響使用該類的所有系統(tǒng)。
如果您希望類執(zhí)行更多功能,理想的方法是添加到已經(jīng)存在的功能而不是更改它們。
目標(biāo)
這個原則旨在擴展一個類的行為而不改變該類的現(xiàn)有行為。這是為了避免在使用類的任何地方引起錯誤。
L – 里氏替換原則
如果 S 是 T 的子類型,則程序中 T 類型的對象可以被 S 類型的對象替換,而不會改變該程序的任何所需屬性。
當(dāng)子類不能執(zhí)行與其父類相同的操作時,這可能會導(dǎo)致錯誤。
子類應(yīng)該能夠處理相同的請求并傳遞與父類相同的結(jié)果,或者它可以傳遞相同類型的結(jié)果。
圖片顯示父類交付咖啡(它可以是任何類型的咖啡)。兒子可以制作卡布奇諾,因為它是一種特定類型的咖啡,但不能送水。
如果子類不滿足這些要求,則意味著子類被徹底改變,違反了這一原則。
目標(biāo)
該原則旨在強制一致性,以便可以以相同的方式使用父類或其子類而不會出現(xiàn)任何錯誤。
I -接口隔離
不應(yīng)強迫客戶依賴他們不使用的方法。
接口隔離原則表明客戶端不應(yīng)該被強迫實現(xiàn)一些他們不會使用的接口,應(yīng)該把胖接口中的方法分組,然后用多個接口替代它,每個接口服務(wù)于一個子模塊。簡單地說,就是使用多個專門的接口比使用單個接口要好很多。
目標(biāo)
這個原則旨在將一組動作拆分成更小的集合,以便一個類只執(zhí)行它需要的一組動作。
D -依賴倒置
– 高級模塊不應(yīng)依賴于低級模塊。兩者都應(yīng)該依賴于抽象。 – 抽象不應(yīng)依賴于細(xì)節(jié)。細(xì)節(jié)應(yīng)該取決于抽象。
首先,讓我們更簡單地定義這里使用的術(shù)語
高級模塊(或類):使用工具執(zhí)行操作的類。
低級模塊(或類):執(zhí)行操作所需的工具
Abstraction:表示連接兩個類的接口。
開閉原則(OCP)是面向?qū)ο笤O(shè)計原則的基礎(chǔ)也是整個設(shè)計的一個終極目標(biāo),而依賴倒置原則(DIP )則是實現(xiàn)OCP原則的一個基礎(chǔ),換句話說開閉原則(OCP)是你蓋一棟大樓的設(shè)計藍圖,那么依賴倒置原則就是蓋這棟大樓的一個鋼構(gòu)框架。
目標(biāo)
該原則旨在通過引入接口來減少高級類對低級類的依賴。