[OOD] 為什麼單一職責原則(SRP)是最難運用的
單一職責原則(SRP)已經幾乎是每一個程式設計師都知道的設計原則。最早由Robert C. Martin在<<敏捷軟體開發 — 原則、模式與實踐>>中正式提出。書中作者在結論中提到:
SRP是所有設計原則最簡單的,但也是最難運用的。(中文翻譯有之一,略去了)
現實工作中,關於一個類是否符合SRP,或者是否有必要符合SRP的討論是經常發生的。爭論的關鍵在於職責的定義,但我理解SRP真正的核心是關注於變化。這並不是我的新見解,全是來自Martin大叔的解釋:
他的提醒是非常中肯的。實踐中正是常常基於功能的分類來定義職責的。
. 教師 (班主任很可能會帶課)
. 班級的管理 (組織班委,整治一下早戀之類的)
![](https://i.iter01.com/images/a90b9d65b4f3abd33fed9ba5ce32b68864f00fcc8ecce2c94202174536ee9aa6.png)
這時你拿著設計到了一個寄宿學校,校長可能會告訴你,他們這裡的教師會輪流值班,兼做保育員,照看住校的學生。又是一個新的職責,怎麼辦?
如果遵守單一職責的原則,我們應該增加一個介面:
![](https://i.iter01.com/images/2617ccfa044c3d5e9de554511caf0e679a13ba026548caf3d28cb8c458fae295.png)
請再體會一下,關於保育員職責的討論。如果兩個職責/角色不是同時變化的,才考慮分離。如果確定同時變化,就沒有必要分離。除非有一天,某個勞動部門到該寄宿學校檢查,認為他們這樣不符合某個法律規定,強制規定老師可以選擇是否擔當保育員。如此一來,兩個職責就又變成獨立變化的了,就可以考慮分離職責。
![](https://i.iter01.com/images/9bc3e9e3bc8be732c3ca8f40e422b050fbfce3053a27e9c75791f0fbed274260.png)
(向朱敏才孫麗娜夫婦致敬!)
SRP是所有設計原則最簡單的,但也是最難運用的。(中文翻譯有之一,略去了)
現實工作中,關於一個類是否符合SRP,或者是否有必要符合SRP的討論是經常發生的。爭論的關鍵在於職責的定義,但我理解SRP真正的核心是關注於變化。這並不是我的新見解,全是來自Martin大叔的解釋:
- 首先職責的定義是: 引起變化的原因,不是由分類所決定的。如果存在相對的變化,才要考慮分離。
- 其次,關於引起變化的因素,不要空想。一定確信有變化的可能,才會加以考慮。
他的提醒是非常中肯的。實踐中正是常常基於功能的分類來定義職責的。
. 教師 (班主任很可能會帶課)
. 班級的管理 (組織班委,整治一下早戀之類的)
![](https://i.iter01.com/images/a90b9d65b4f3abd33fed9ba5ce32b68864f00fcc8ecce2c94202174536ee9aa6.png)
這時你拿著設計到了一個寄宿學校,校長可能會告訴你,他們這裡的教師會輪流值班,兼做保育員,照看住校的學生。又是一個新的職責,怎麼辦?
如果遵守單一職責的原則,我們應該增加一個介面:
![](https://i.iter01.com/images/2617ccfa044c3d5e9de554511caf0e679a13ba026548caf3d28cb8c458fae295.png)
果真要如此嗎? 注意,如果是在一般的學校,保育員不是老師的本職工作,可在這所寄宿學校裡,卻是教師的本職工作,是和老師一起變化的。校長的反饋是:
“我們學校的教師必須擔任保育工作,我並不認為這會是什麼新職責。作為教師,要麼接受,要麼離開。至於班主任工作,確實還是其特殊的地方,不然也不會給擔任班主任的老師多一點津貼了。”。
請再體會一下,關於保育員職責的討論。如果兩個職責/角色不是同時變化的,才考慮分離。如果確定同時變化,就沒有必要分離。除非有一天,某個勞動部門到該寄宿學校檢查,認為他們這樣不符合某個法律規定,強制規定老師可以選擇是否擔當保育員。如此一來,兩個職責就又變成獨立變化的了,就可以考慮分離職責。
再進一步,如果是針對一個只有一個支教教師的小學,極為偏僻。這裡的校長會告訴你:
”這個學校裡的每一個教師,唯一的一個,既是校長,也是老師。我不認為還需要明確班主任做什麼,教師做什麼,在這裡,只要學生需要的都要做。並且這裡很窮,五年內都不見得再有新老師來。”。
![](https://i.iter01.com/images/9bc3e9e3bc8be732c3ca8f40e422b050fbfce3053a27e9c75791f0fbed274260.png)
(向朱敏才孫麗娜夫婦致敬!)
聊到這裡,不知道我說清楚了沒有!設計要跟著需求走,不能生硬的套理論。歡迎拍磚!
相關文章
- 單一職責原則
- 單一職責原則在 iOS 中的應用iOS
- 設計原則之【單一職責原則】
- 單一職責原則筆記筆記
- 單一職責原則詳解
- 被誤解的單一職責原則 - Joe
- [譯] 更可靠的 React 元件:單一職責原則React元件
- 設計模式六大原則(一)----單一職責原則設計模式
- 編碼最佳實踐——單一職責原則
- 設計模式的七大原則(1) --單一職責原則設計模式
- 單一職責原則:軟體世界中最重要的規則 - DZone
- 面象物件設計6大原則之一:單一職責原則物件
- 嘻哈說:設計模式之單一職責原則設計模式
- 《JavaScript設計模式與開發實踐》原則篇(1)—— 單一職責原則JavaScript設計模式
- 將單一職責原則應用於前端FE/BFF分層架構 - Expedia前端架構
- 單一責任SRP設計舉例 - macerubMac
- 吃透單一職責原則,100倍效果提升程式碼質量
- Linux運維架構師崗位職責是什麼?入職要求!Linux運維架構
- Linux運維和桌面運維有什麼區別?崗位職責是什麼?Linux運維
- 為什麼單件流是精益生產的首要原則?
- Linux運維有什麼職責工作?linux簡單學習Linux運維
- 新媒體運營工作是什麼?崗位職責有哪些?
- Linux運維職責是什麼?日常工作內容有哪些?Linux運維
- Linux運維人員核心職責是什麼?linux初學影片Linux運維
- Python運維工程師是什麼?Python運維工程師工作職責及要求!Python運維工程師
- 大資料運維能做什麼?有什麼工作職責?大資料運維
- Linux運維就業崗位有哪些?崗位職責是什麼?Linux運維就業
- 保持類的單一職責
- 什麼是單一斷言規則
- Laravel深入學習8 – 單一責任原則Laravel
- YAGNI原則是什麼? -oliverkumper
- The Principles of OOD 物件導向設計原則物件
- 什麼是如何把握波段操作?波段操作的原則是什麼
- Linux系統安全最小原則是什麼意思?Linux運維Linux運維
- 什麼是依賴倒置原則
- java開閉原則是什麼?Java
- 為什麼說資料庫是Serverless最難攻堅的堡壘?資料庫Server
- 設計模式 - 單一職責設計模式
- 用最簡單的話告訴你什麼是ElasticSearchElasticsearch