單一職責原則 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 反而會增加了不必要的複雜性 造成維護成本提高。