iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

C# 從入門到WebApi系列 第 15

[Day15] 淺出SOLID 關於單一職責原則(SRP)

  • 分享至 

  • xImage
  •  

SOLID是什麼

對於寫物件導向語言的人而言應該不算是陌生的單字

  • S 指的是Single responsibility principle(SRP) 單一職責原則 也是本篇要介紹的東西
  • O 指的是Open/close principle(OCP) 開放/封閉原則
  • L 指的是Liskov substitution principle(LSP) Liskov替換原則
  • I 指的是Interface Segregation Principle(ISP) 介面隔離原則 過去幾天常提到的
  • D 指的是Dependency Inversion Principle(DIP) 依賴反轉原則 昨天有提到

這個單字是我在介紹物件導向三本柱時有提到的
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種功能
分別是微波 烤土司 跟煮飯
今天媽媽只會用煮飯的功能
爸爸只會用烤土司的功能
而我只會用微波的功能

醜醜示意圖
https://ithelp.ithome.com.tw/upload/images/20200915/20109549u1GAO2CtrV.jpg

今天工程師忽然發現 烤土司跟煮飯的加熱方法是一樣的
於是他把加熱的方法抽出來
https://ithelp.ithome.com.tw/upload/images/20200915/20109549N3Ya5mtDLU.png

因為今天爸爸想吃低溫烘焙的吐司
於是請工程師改了加熱方法的溫度上限
但是媽媽並不知情
而且工程師沒有注意到烤土司的加熱溫度跟煮飯的溫度不同

直到有一天媽媽煮飯怎麼煮都煮不熟
他才注意到加熱的方法被偷偷更改過了
媽媽氣炸了

所以單一職責原則說
分離支援不同腳色的程式碼

與其用一台萬用料理機
不如買三台機器
https://ithelp.ithome.com.tw/upload/images/20200915/201095493RdGLRrLkC.jpg

雖然這麼做會使類別增多
但是可以透過Facade模式解決
不過那屬於Design Pattern的範疇(我還沒讀完QQ)
有興趣可以自行研究~~


上一篇
[Day14] 論物件導向三本柱之四(依賴反向) 順便介紹介面
下一篇
[Day16] 淺出 Solid 關於開放封閉原則
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言