S.O.L.I.D五大原則 雖然對(duì)我不陌生 但是他們的JS實(shí)現(xiàn)我沒怎么思考過骇塘,今天看湯姆大叔的博客蘸朋,然后加以總結(jié)核无, 當(dāng)然不是說這五大原則就是真理 你需要根據(jù)你的項(xiàng)目的真實(shí)情況加以使用
- The Single Responsibility Principle(單一職責(zé)SRP)
- The Open/Closed Principle(開閉原則OCP)
- The Liskov Substitution Principle(里氏替換原則LSP)
- The Interface Segregation Principle(接口分離原則ISP)
- The Dependency Inversion Principle(依賴反轉(zhuǎn)原則DIP)
單一職責(zé)
這個(gè)怎么說呢,就是每個(gè)函數(shù)或者類擁有相對(duì)單一的職責(zé)藕坯,怎么做呢团南,這個(gè)沒有辦法一概而論,我個(gè)人理解就是第一步要邏輯上說的通炼彪,就是不能一聽就是錯(cuò)的吐根,比如食堂的大師傅在做飯的同時(shí)不能還要負(fù)責(zé)擦地一樣。
第二個(gè)要做的就是盡量把邏輯和數(shù)據(jù)拆開辐马,這樣外面只需要修改數(shù)據(jù)而不需要觸碰到邏輯
第三個(gè)就是盡量吧相關(guān)邏輯封裝到一起拷橘,比如我們有個(gè)邏輯用到計(jì)算,那么我們可以把所有的計(jì)算邏輯抽離出來行成一個(gè)新的計(jì)算類
開閉原則
軟件實(shí)體(類,模塊冗疮,方法等等)應(yīng)當(dāng)對(duì)擴(kuò)展開放萄唇,對(duì)修改關(guān)閉,即軟件實(shí)體應(yīng)當(dāng)在不修改的前提下擴(kuò)展赌厅。
我自己粗淺的理解就是 不能因?yàn)樘砑恿诵碌倪壿?就必須把以前 的代碼都要改一下穷绵, 比如 我的類增加了一種Type 我們?nèi)绻途托枰砑右粋€(gè) else if 其實(shí)是不好的 因?yàn)檫@樣第一是把所有類型的邏輯都寫到了一起 其次是可能要修改多處
而我想到解決方式就是子類話 然后實(shí)現(xiàn)不同的接口 這樣的話 當(dāng)邏輯變化的時(shí)候 我們只需要新建一個(gè)類就好了
里氏替換原則
派生類型必須可以替換它的基類型。
這個(gè)我其實(shí)不是特別理解特愿,那么我就先從繼承的角度來說一下仲墨,但是其實(shí)大神們告訴我們不要繼承 要使用組合, 這個(gè)之后再說
從繼承的角度講揍障,我認(rèn)為有兩點(diǎn)
- 子類必須能繼承父類的所有邏輯目养,如果只想繼承部分代碼,需要把父類再次抽象
- 即使是重寫了父類的方法毒嫡,也不能使存在的邏輯發(fā)生變化癌蚁,簡單來說,父類有開門 關(guān)門倆方法兜畸,但是子類重寫了開門努释,但是當(dāng)調(diào)用關(guān)門方法,門是不能被關(guān)上的 咬摇,所以子類也許還需要重寫關(guān)門方法
大神告訴我們
盡量使用對(duì)象組合而不是類繼承
里氏替換原則(LSP)的本質(zhì)不是真的和繼承有關(guān)伐蒂,而是行為兼容性。
當(dāng)然這又涉及了另一個(gè)原則 合成復(fù)用
而我的理解就是當(dāng)你需要基類的方法的時(shí)候 可以試著不去繼承 而是選擇擁有一個(gè)基類的對(duì)象作為屬性 然后讓他幫助你實(shí)現(xiàn)功能 當(dāng)然這些需要你視情況而定
接口分離原則
不應(yīng)該強(qiáng)迫客戶依賴于它們不用的方法肛鹏。
不太理解 不過簡單來說就是一個(gè)類不能擁有他不需要的方法或者屬性
依賴倒置原則
高層模塊不應(yīng)該依賴于低層模塊逸邦,二者都應(yīng)該依賴于抽象
抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象
我的簡單理解就是 不管高級(jí)模塊和低級(jí)模塊是怎么樣的 我們都必須設(shè)計(jì)一個(gè)他們倆交流的接口 這個(gè)接口是不能改變的 這的之后不管他們怎么修改邏輯 都不會(huì)想影響對(duì)方 這個(gè)就是按接口編程