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

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

Is Single Responsibility Principle a rule of OOP?

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

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

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

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

但是,这是否是规则,是否意味着它不应被打破?


软件开发中很少有规则,如果有的话,也不例外。有些人认为没有去处,但是他们错了。

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

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

SRP是一种软件工程原理,可以应用于类,函数或模块的角色。它有助于某种事物的凝聚力,从而使其表现得很好,而没有无关紧要的悬挂或具有使事物复杂化和缠绕的多个角色。

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

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


引用巴博萨上尉的话:

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

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

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

可以通过模式移动将"规则"理解为"强制"

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

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

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


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

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


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

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

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

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


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

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


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

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


推荐阅读

    设计电脑系统封装|电脑系统封装教程

    设计电脑系统封装|电脑系统封装教程,,电脑系统封装教程不是的,只是虚拟机比较方便。物理机也可以的,只是要通过外界启动来ghost系统。 办法

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    Java创建对象的几种方式

    Java创建对象的几种方式,对象,方法,本文目录Java创建对象的几种方式java中几种创建对象的方式1Java中创建对象的集中方式有那些JAVA创建对

    rails框架介绍

    rails框架介绍,框架,代码, Rails 框架首次提出是在2004年7月,其的研发者是26岁的丹麦人David Heinemeier Hansson。不同于已有复杂的Web

    wps快速的编辑图层|WPS巧用对象图层

    wps快速的编辑图层|WPS巧用对象图层,图层,编辑,快速,wps,1.WPS 如何巧用对象图层一、认识对象图层工具及按纽1、您可以在插件工具栏中可以

    java三大框架面试题

    java三大框架面试题,面试题,对象,本文目录java三大框架面试题前端面试题分享之什么是Spring开发中主要使用spring的什么技术 面试题Java面