SRP是所有設計原則最簡單的,但也是最難運用的。(中文翻譯有之一,略去了)
現實工作中,關於一個類是否符合SRP,或者是否有必要符合SRP的討論是經常發生的。爭論的關鍵在於職責的定義,但我理解SRP真正的核心是關注於變化。這並不是我的新見解,全是來自Martin大叔的解釋:
- 首先職責的定義是: 引起變化的原因,不是由分類所決定的。如果存在相對的變化,纔要考慮分離。
- 其次,關於引起變化的因素,不要空想。一定確信有變化的可能,纔會加以考慮。
他的提醒是非常中肯的。實踐中正是常常基於功能的分類來定義職責的。
. 教師 (班主任很可能會帶課)
. 班級的管理 (組織班委,整治一下早戀之類的)
這時你拿着設計到了一個寄宿學校,校長可能會告訴你,他們這裏的教師會輪流值班,兼做保育員,照看住校的學生。又是一個新的職責,怎麼辦?
如果遵守單一職責的原則,我們應該增加一個接口:
果真要如此嗎? 注意,如果是在一般的學校,保育員不是老師的本職工作,可在這所寄宿學校裏,卻是教師的本職工作,是和老師一起變化的。校長的反饋是:
“我們學校的教師必須擔任保育工作,我並不認爲這會是什麼新職責。作爲教師,要麼接受,要麼離開。至於班主任工作,確實還是其特殊的地方,不然也不會給擔任班主任的老師多一點津貼了。”。
請再體會一下,關於保育員職責的討論。如果兩個職責/角色不是同時變化的,才考慮分離。如果確定同時變化,就沒有必要分離。除非有一天,某個勞動部門到該寄宿學校檢查,認爲他們這樣不符合某個法律規定,強制規定老師可以選擇是否擔當保育員。如此一來,兩個職責就又變成獨立變化的了,就可以考慮分離職責。
再進一步,如果是針對一個只有一個支教教師的小學,極爲偏僻。這裏的校長會告訴你:
”這個學校裏的每一個教師,唯一的一個,既是校長,也是老師。我不認爲還需要明確班主任做什麼,教師做什麼,在這裏,只要學生需要的都要做。並且這裏很窮,五年內都不見得再有新老師來。”。
(向朱敏才孫麗娜夫婦致敬!)
聊到這裏,不知道我說清楚了沒有!設計要跟着需求走,不能生硬的套理論。歡迎拍磚!