鍍金池/ 問答/Java  PHP  網(wǎng)絡(luò)安全/ 開放封閉原則(OCP) 和 單一職責(zé)(SRP) 沒看懂區(qū)別在哪里

開放封閉原則(OCP) 和 單一職責(zé)(SRP) 沒看懂區(qū)別在哪里

網(wǎng)上很多用 計算器 例子 舉例說明這兩個原則, 但是發(fā)現(xiàn)好像區(qū)別就是 OCP有個抽象類, 而SRP沒有繼承抽象

1.OCP相比較SRP, OCP的例子也都是把一個個的功能獨立出來, 這不就做到了單一職責(zé)么?

2.然后說OCP可以做到對擴展開放, SRP不也可以做到么, 需要其他運算時, 加一個對應(yīng)的類不就行了, 只不過相比較OCP, 沒有去繼承抽象來約束類而已啊, 所以不太理解這里的區(qū)別

3.而所謂 "修改封閉" 啥意思? 沒太懂, 不知道說的是對哪個類做到了修改封閉, 畢竟即便是OCP, 新擴展(增加)一個運算類是很容易, 但是增加完了, 不還得在主頁中中修改(在if else 或 switch case中增加一級么)

4.很多資料說 繼承了抽象, 所以就對修改封閉 沒看懂

回答
編輯回答
神經(jīng)質(zhì)

一個設(shè)計良好的模塊,拿給別人用,那人需要一些新功能,應(yīng)該怎么用呢,是修改已有模塊代碼?還是用別的手段進行擴展?開閉原則就是你的模塊要是足夠牛逼,就不會逼著別人改你的源碼╮(╯_╰)╭ 在使用足夠牛逼的模塊時,要通過擴展來實現(xiàn)自己的功能而不是改人家代碼。

單一職責(zé)就好理解了,對于一個一個的組件來說,多功能是沒必要的,沙發(fā)是沙發(fā),床是床,沙發(fā)床只能是權(quán)宜之計。

兩者之間相同的地方就是“如無必要,勿增實體”,沒有必要改代碼就不要改代碼,沒必要加功能就不要加功能。通過組件之間的拼接組合實現(xiàn)整體功能,這樣就能實現(xiàn)“高內(nèi)聚,低耦合”的理想了。

當(dāng)然這倆原則某種角度來說也是矛盾的,模塊如何才能足夠牛逼?大而全就可以了,然而大而全顯然和單一職責(zé)沖突,所以這里就又有個權(quán)衡的問題,不過不用擔(dān)心,“權(quán)衡”這種事情是無處不在的,“選擇比努力重要”說的就是權(quán)衡的重要性。

2017年12月22日 03:02
編輯回答
祈歡

這六個原則在廣義上不是互相沖突的,而且是要求同時實現(xiàn)的。

對于1,OCP所想實現(xiàn)的能力不影響它同時是SRP;
對于2,如你所說,SRP是通過增加對應(yīng)的類來實現(xiàn)的,也就是說增加乘法計算時不需要去修改原來的加法計算類,加法計算類對修改是封閉的,可卻可與通過繼承計算基類而增加乘法計算。這就是說這個計算類不只對修改封閉,還對拓展開放。同理,這不影響每個子類都是單一職則的,而且恰好體現(xiàn)了這些子類良好的符合了這兩個原則。
對于3,封閉在這里是那個加法子類,你不需要擔(dān)心增加乘法后你的加法算法出現(xiàn)問題,它是封閉的。

請諸位指正。

2017年1月2日 02:04