對於寫物件導向語言的人而言應該不算是陌生的單字
這個單字是我在介紹物件導向三本柱時有提到的
Robert.C.Martin a.k.a Uncle Bob所提出的
他有出一系列Clean Code的書
建議接觸程式一段時間的人可以去拜讀(真的是拜讀一下)
本篇算是clean architecture (也是Uncle Bob的著作)一點點心得
在閱讀這本書之前
我對於SRP的理解是
一個函式應該只做一件事情
例如:
我前陣子在維護公司的系統時
看見了一個函式是這樣子寫的
public bool CheckItem(){
if(item.store>0){
UpdateTableItemXXX();
}else{
UpdateRestoreTable();
}
retune IsUpdateSuccess();
}
舉個例子方法名稱明明是checkItem
但裡面實際做的動作卻是檢查並更新資料庫
我當時沒注意到
然後就炸了
但是一個函式應該只做一件事情
只是構成SRP的一部份
真正的SRP是一個模組(類別)應該只對唯一的一個角色負責
舉個例子而言
有一台萬用的調理鍋(請把他想成軟體)
他有3種功能
分別是微波 烤土司 跟煮飯
今天媽媽只會用煮飯的功能
爸爸只會用烤土司的功能
而我只會用微波的功能
醜醜示意圖
今天工程師忽然發現 烤土司跟煮飯的加熱方法是一樣的
於是他把加熱的方法抽出來
因為今天爸爸想吃低溫烘焙的吐司
於是請工程師改了加熱方法的溫度上限
但是媽媽並不知情
而且工程師沒有注意到烤土司的加熱溫度跟煮飯的溫度不同
直到有一天媽媽煮飯怎麼煮都煮不熟
他才注意到加熱的方法被偷偷更改過了
媽媽氣炸了
所以單一職責原則說
分離支援不同腳色的程式碼
與其用一台萬用料理機
不如買三台機器
雖然這麼做會使類別增多
但是可以透過Facade模式解決
不過那屬於Design Pattern的範疇(我還沒讀完QQ)
有興趣可以自行研究~~