Stack Overflow问题的答案表明,特定框架违反了简单明了的OOP规则:单一责任原则(SRP).
单一责任原则真的是OOP的规则吗?
我对面向对象编程的定义的理解是"使用对象及其行为来创建软件的范例".这包括以下技术:封装,多态和继承.
现在不要误解我的意思 - 我认为SRP是大多数优秀OO设计的关键,但我觉得有些情况下这个原则可以而且应该被打破(就像数据库规范化规则一样).我积极推动SRP的好处,我的绝大多数代码都遵循这一原则.
但是,它是一个规则,因此暗示它不应该被打破吗?
软件开发中的规则很少(如果有的话)也不例外.有些人认为是没有地方转到但他们错了.
就OOP而言,没有单一的面向对象定义,因此根据您的要求,您将获得一组不同的硬性和软性原则,模式和实践.
OOP的经典概念是将消息发送到其他不透明的对象,并且对象用他们自己内部的知识来解释消息,然后执行某种功能.
SRP是一种软件工程原理,可以应用于类,函数或模块的角色.它有助于某种东西的凝聚力,使其表现得很好,没有不相关的东西悬挂在它上面,或者具有交织和复杂化的多种角色.
即使只有一个责任,它仍然可以从单个功能到一组松散相关的功能,这些功能是共同主题的一部分.只要你避免陪审团操纵一个元素来承担一些事情的责任,它不是主要用于或做一些其他特别的事情来淡化对象的简单性,那么就违反了你想要的任何原则.
但我发现更容易让SRP正确,然后做一些更精细的东西,同样强大.
这些规则都不是法律.它们是更多指导方针和最佳实践.有时候遵循"规则"没有意义,你需要做最适合你情况的事情.
不要害怕做你认为正确的事.你可能真的想出了更新更好的规则.
引用巴博萨船长的话:
"其次,你必须是海盗的代码才能申请,而你却不是.第三,代码更像是你所谓的"指导方针",而不是实际的规则...."
引用Jack Sparrow和Gibbs的话."我以为你应该遵守代码." 吉布斯先生:"我们认为它们是更实际的指导方针."
很明显,海盗很清楚这一点.
通过模式运动可以将"规则"理解为"力量"
因此,有一股力量试图让班级承担单一责任.(凝聚)
但也有一股力量试图保持与其他类别的耦合.
与所有设计(不仅仅是代码)一样,答案取决于它.