單一職責、開放封閉原則簡介


Posted by Andy Tsai on 2021-07-27

單一職責原則 Single Responsibility Principle(SRP)

編寫程式時,我們要檢視它們的責任,讓每個方法只做好一件事(單一責任),如果功能複雜就拆分開,每個部分保持獨立。這關係到能不能建立易於重用、維護、測試的程式。

當一個方法有過多的職責,那麼需要修改到它的機率就越大,在修改時也是件危險的事,因為過多的職責耦合在一起時,一個職責的變化有可能影響到其他職責,容易發生意外的bug。

  • 拆職責的時機
    也不是所有時候都要拆職責,可以去思考,這個方法發生變化的可能性多高,如果很低,那麼也許寫在一起也無妨,未來有需要 重構時再改也ok。

開放封閉原則 Open-Closed Principle (OCP)

  • 對擴展保持開放,對修改封閉
    在增加需求時,應該增加代碼,而非修改已有代碼,修改已有代碼是件危險的事,尤其業務邏輯複雜時,一個不小心就會發生連鎖反應,bug越改越多。

  • 將不可變和可變隔離開
    將程式中容易發生變化的地方,構造抽象來封裝它們,
    也就是把穩定不變的部分和容易變化的部分隔離開來,在未來系統演進過程,我們不太需要去動不變的部分,只需要處理變化的部分即可。

從簡單的Promise範例體會SRP和OCP

function imgLoad(url) {
    return new Promise(function(resolve, reject) {
        var img = document.createElement('img')
        img.onload = () => resolve(img);
        img.onerror = () => reject('加載失敗')
        img.src = url
    });
}

imgLoad('https://xxxxx').then((img) => {
    console.log(img.width)
    return img
}).then((img) => {
    console.log(img.height)
    return img
}).catch((err) => {
    console.log(err)
})

在這裡,每個.then只做一件事,這就是單一職責原則

現在假設有一個新需求,要打印出圖片連結,我們就再加再加一個.then即可

imgLoad('https://xxxxx').then((img) => {
    console.log(img.width)
    return img
}).then((img) => {
    console.log(img.height)
    return img
}).then((img) => {
    console.log(img.src)
}).catch((err) => {
    console.log(err)
})

這就是開放封閉原則,對擴展開放,對修改封閉

總結

SRP和OCP都是非常好的設計理念,能讓我們在維護、擴展應用時舒服許多,
但也要注意不需一成不變的遵守,有時over design 反而會增加了不必要的複雜性 造成維護成本提高。










Related Posts

D23_繼續第三週解題

D23_繼續第三週解題

重新認識Vue.js

重新認識Vue.js

跟你朋友介紹 Git

跟你朋友介紹 Git


Comments