Single Responsibility Principle (SRP)
class 應該只負責一件事、只有一個改變的理由,class 聚焦於實作該責任。避免一個 class 有多重責任,或者一個責任分散在多個 class 中。SRP 的主要目的是增加 class 的 cohesion(內聚力)。
OO 中會以 class 為單位,但可以提升到 process level。舉例來說,將多個 process 啟動與結束的控制分散在各個 process 以及 watch dog,就讓「控制 process 的啟動與結束」這個責任分散在多個地方。這會導致較難理解控制流程、不知道某個時間點是誰在控制,修改時也容易出 bug。
一個 class 可以負責一個「大」責任。運用 SRP 應該會讓系統中的 class 比較少但比較大,因為會將功能性集中在負責該功能的 class。在思考一個 class 應該負責什麼時,用較抽象的方式去想會比較好,想這 class 要做什麼?它的名稱顯示它該負責什麼?某件事究竟關不關它的事?
我覺得區分 class 的責任蠻困難的,取決於設計者怎麼想、怎麼看待一個 class 以及其想法的合理性。
SRP 分析
分析一個 class 是否符合 SRP。把 class 跟 method 名稱套到以下句子,用人類語言看看通不通順。
The [class] [method] itself.
The [class] [method] [arg] itself.
該 [class] [method] 它自己
該 [class] 自己 [method]
想起來順表示該 method 屬於這個 class、符合 SRP,反之則表示這 method 應該移到其他地方。
分析時要注意參數可能在 construct 已先傳入,不一定是 method 的 argument。