SRP,Single Responsibility Principle,翻译成中文叫单一职责的原则,意思就是说一个class或者function或者module只做一件事。
那么什么叫一件事,关于这一件事怎么理解?“把大象放进冰箱”可以看做一件大事,“打开冰箱门”,“把大象塞进去”,“把冰箱门关上”,可以看做“把大象放进冰箱”这一件事拆分后的3件小事。
由此可见,“一件事”这个东西是非常模糊的,大事可以拆解成小事,小事又可以不断拆解,最后,一行代码自己是不是也可以解释成“一件事”?
所以SRP中的S到底怎么理解?其实对于这个东西的解释也是经历了岁月沧桑的变化。
维基百科里面说,发明这个原则的bob爷爷对此解释说:一个类应该只有一个要修改它的原因。
这句话把事情搅的更加复杂,原因是什么?我怎么知道改变它的原因是啥?难以理解。
维基百科后面又来了一段,说因为“原因”这个词造成的confusion,blablablabla…我就不贴了,原文太长这里放不下。
总之这个解释无法尽如人意。好像必须想象今后可能的变化然后用未来的事情反推现在是不是SRP,这不make sense。
有鉴于这么多年来对SRP没法解释清楚的历史,bob大叔终于在2018年的最新版clean architecture里面修改了SRP的定义。
现在最新的定义是:A module should be responsible to one, and only one, actor.
The term actor refers to a group (consisting of one or more stakeholders or users) that requires a change in the module.
这样事情就稍微能看懂了些,让我来尝试解释一下这个东东。
actor可以这么理解:“把大象放进冰箱”总要有一个class去做吧,这个class叫小美。
我们把“把大象放进冰箱”叫做class大象,打这么几个字太累了简化一下。那么在整个系统中只有小美会调用大象,那么这就符合了SRP。
现在又来了个class小帅,小帅说我也要调用大象,那么没问题,同样也符合SRP。因为小美和小帅都调用了同一个功能,以后要change它们require的change也都是一样的。
现在又来了个class大聪明,大聪明说我要把北极熊装进冰箱,然后你为其单独开发了一个class叫做熊,只给大聪明用,虽然从大象那里copy了些开关冰箱门的代码,但这也没问题,仍然SRP。
但是如果你觉得可以修改下大象class,让它同时能实现大象和北极熊的功能,那就不SRP了,因为明天小美帅可能把需求改成了“把熊猫塞进冰箱”,”,大聪明也可能改成“把北极熊塞进空调”。这二组主人都有可能以不同目的要改你的class,那就乱糟糟了。