单一责任原则是OOP的规则吗?

时间:2008-08-19 00:11:01

标签: oop

Stack Overflow问题answer表示特定框架违反了简单明了的OOP规则:单一责任原则(SRP)。

单一责任原则真的是OOP规则吗?

我对面向对象编程的定义的理解是“使用对象及其行为来创建软件的范例”。这包括以下技术:封装,多态性和继承。

现在不要误解我的意思 - 我认为SRP是大多数优秀OO设计的关键,但我觉得有些情况下这个原则可以而且应该被打破(就像数据库规范化规则一样)。我积极推动SRP的好处,我的绝大多数代码都遵循这一原则。

但是,这是一个规则,因此暗示它不应该被打破吗?

6 个答案:

答案 0 :(得分:22)

软件开发中的规则很少,无一例外。有些人认为 goto 没有地方,但他们错了。

就OOP而言,没有一个面向对象的定义,所以根据你的要求你会得到一套不同的硬性和软性原则,模式和实践。

OOP的经典概念是将消息发送到其他不透明的对象,并且对象用他们自己内部的知识解释消息,然后执行某种功能。

SRP是一种软件工程原理,可以应用于类,函数或模块的角色。它有助于某种东西的凝聚力,使其表现得很好,没有不相关的位置,或者有多种角色交织在一起并使事情变得复杂。

即使只有一个责任,它仍然可以从单个功能到一组松散相关的功能,这些功能是共同主题的一部分。只要你避免陪审团操纵一个元素来承担一些事情的责任,它不是主要用于或做一些其他特别的事情来淡化对象的简单性,那么违反你想要的任何原则。

但我发现让SRP更正确然后做更精细的事情就更容易了。

答案 1 :(得分:5)

引用巴博萨船长:

“..其次,你必须是海盗的海盗代码才能申请,而你却不是。 第三,代码更像是你所谓的“指导方针”而不是实际规则....“

引用Jack Sparrow&吉布斯。 “我以为你应该遵守代码。” 吉布斯先生:“我们认为他们是更实际的指导方针。”

很明显,海盗很清楚这一点。

“规则”可以通过模式运动理解为“力量”

因此,有一股力量试图让班级承担一项责任。 (凝聚)

但也有一股力量试图保持与其他班级的联系。

与所有设计(不仅仅是代码)一样,答案取决于它。

答案 2 :(得分:5)

这些规则都不是法律。它们是更多指导方针和最佳实践。有时候遵循“规则”没有意义,你需要做最适合你情况的事情。

不要害怕做你认为正确的事。实际上,你可能会提出更新更好的规则。

答案 3 :(得分:1)

啊,我想这与我给出的答案有关。 :)

与大多数规则和法律一样,这些规则具有相关的潜在动机 - 如果潜在的动机不存在或适用于您的案例,那么您可以根据自己的需要自由弯曲/违反规则

话虽如此,SRP本身并不是OOP的规则,但被认为是创建易于扩展和可单元测试的OOP应用程序的最佳实践。

我认为这两个特征在企业应用程序开发中都是最重要的,现有应用程序的维护比新开发项目占用更多时间。

答案 4 :(得分:0)

正如许多其他海报所说,所有规则都被打破了 话虽如此,我认为SRP是编写优秀代码的重要规则之一。它不是特定于面向对象的编程,但如果类没有单一的责任,那么OOP的“封装”部分很难做到。

毕竟,您如何正确而简单地封装具有多重职责的类?通常答案是多个界面,并且在许多语言中可以提供相当多的帮助,但是对于类的用户而言,它可能会在不同情况下以完全不同的方式应用,这仍然令人困惑。

答案 5 :(得分:-1)

SRP只是ISP的另一种表达方式:-)。

“P”表示“原则”,而不是“规则”:D