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

时间:2020-03-05 18:40:34  来源:igfitidea点击:

一个对Stack Overflow问题的回答表明,一个特定的框架违反了一个简单而简单的OOP规则:单一责任原则(SRP)。

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

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

现在不要误会我,我相信SRP是大多数好的OO设计的关键,但是我觉得在某些情况下可以并且应该打破这个原则(就像数据库规范化规则一样)。我积极推动SRP的好处,并且我的大部分代码都遵循这一原则。

但是,这是否是规则,是否暗示它不应该被打破?

解决方案

回答

软件开发中很少有规则,如果有的话,也不例外。有些人认为没有地方可以使用goto,但是他们错了。

就OOP而言,没有一个单一的面向对象的定义,因此根据我们要求的对象,我们将获得一套不同的硬性和软性原则,模式和实践。

OOP的经典思想是将消息发送到原本不透明的对象,然后这些对象会根据自己的内在知识来解释消息,然后执行某种功能。

SRP是一种软件工程原理,可以应用于类,函数或者模块的角色。它有助于事物的凝聚力,从而使其表现得很好,不会相互影响,也不会使事物复杂而复杂。

即使只有一项职责,也可能从单个功能到一组松散相关的功能(这是同一主题的一部分)不等。只要我们避免陪审团操纵某个元素来承担它最初不是设计用于某件事情的责任,或者避免做一些临时的事情来削弱对象的简单性,那么就会违反我们想要的任何原理。

但是我发现,正确设置SRP要容易得多,而做一些精巧而又健壮的事情就容易了。

回答

这些规则都不是法律。它们是更多准则和最佳实践。有时候,遵循"规则"没有意义,而我们需要做最适合自己情况的事情。

不要害怕做我们认为正确的事情。我们实际上可能想出了更新更好的规则。

回答

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

与大多数规则和法律一样,这些规则具有与之相关的潜在动机-如果根本动机不存在或者不适用于案子,那么我们可以根据自己的需要随意弯曲/破坏规则。

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

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

回答

引用巴博萨上尉的话:

" ..其次,我们必须是海盗,海盗代码才能适用,而我们不是。
第三,代码比实际规则更像是我们所谓的"准则"。"

引用Hyman·斯派洛和吉布斯的话。
"我以为你应该遵守守则。"
吉布斯先生:"我们认为这是更实际的准则。"

显然,海盗们对此非常了解。

通过规则运动可以将"规则"理解为"强制"

因此,有一种力量试图使班级承担单一责任。 (凝聚)

但是,也有一种力量试图使与其他阶层的耦合下降。

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

回答

正如许多其他张贴者所说的那样,所有规则都被打破了。
话虽如此,我确实认为SRP是编写良好代码的更重要的规则之一。它不是特定于面向对象的编程的,但是,如果类没有单一职责,那么OOP的"封装"部分就很难做到正确。

毕竟,我们如何正确,简单地封装具有多个职责的类?通常,答案是多个接口,并且以多种语言提供了很多帮助,但是它仍然使班级用户感到困惑,因为它在不同情况下可能以完全不同的方式应用。

回答

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

而" P"表示"原理",而不是"规则":D