单一责任原则与关注点分离之间的区别


Answers:


39

单一责任原则(SRP)-给每个班级一个改变的理由;和“改变的理由” ==“责任”。例如:发票类不负责自行打印。

关注点分离(自1974年起)。关注==系统功能。照顾每个关注点:对于每个关注点,其他关注点都无关紧要。隐藏行为的实现。

这里


原则上相同,但仅SoC不会阻止过度分离。过度分离不如过度耦合那么糟糕,但是却很糟糕,因为它增加了构建和维护软件的成本(与过度耦合相同的问题-不同的原因)。SoC要求两个非常重要的成功因素,至少每个bob叔(1)“关注点”是业务级别优先(不是技术级别);(2)分离属于同一个事物是错误的。blog.cleancoder.com/uncle-bob/2014/05/08/…–
FastAl

16

在我看来,单一责任原则是实现关注点分离的工具/习惯用法之一。


3
什么?可以轻松地创建一个具有非重叠功能(SRP)的应用程序,其中包含许多没有独立关注点(!SOC)的对象。
安德鲁·宋

6
但是,要对具有多个职责但仍遵循关注点分离原则的对象进行成像要困难得多。换句话说,要实现关注点的真正分离(在所有级别上),最好是遵守单一责任原则
BostonLogan

16

关注点与单一责任原则的分离(SoC与SRP)

从链接的文章中:

关注点分离(SoC) –是将计算机程序分解为功能尽可能重叠的不同功能的过程。关注点是程序中的任何关注点或关注点。通常,关注与功能或行为同义。 http://en.wikipedia.org/wiki/Separation_of_concerns

单一责任原则(SRP) –每个对象都应负有单一责任,并且其所有服务应与该责任狭义地保持一致。在某种程度上,凝聚力被视为SRP的同义词。 http://en.wikipedia.org/wiki/Single_responsibility_principle


4
根据这些定义,哪个级别的凝聚力被视为单一责任原则的同义词?我搜索到有很多内聚级别(从低到高):一致,逻辑,时间,过程和功能。在这种解释中,它仅表示“功能内聚”吗?
limonik

13

单一职责规定对象应负责单个工作单元。

关注点分离指出,应将应用程序划分为功能尽可能重叠的模块。

最终结果相似...应用略有不同。


对象和模块之间有什么区别?对我而言,模块是类,而对象是类或类的实例
Rookian

模块可以是应用程序中全部类似的功能……由许多类之间的交互组成(如果您遵循“单一职责”模式,则每个类都有一个职责)。
贾斯汀·涅斯纳

12

单一责任原则和关注点分离实际上是同一回事。

当然,您可以在学术讨论中陷入困境,尝试找出两者之间的某种差异,但是为什么呢?出于所有意图和目的,它们描述同一件事。最大的问题是人们非常想知道确切的“关注点”和“责任感”,以至于他们可能错过了SRP和SoC背后的重要思想。

这个想法只是将您的代码库分成松散耦合的隔离部分。这使多个开发人员可以在不影响彼此的情况下处理不同的零件,也允许单个开发人员修改一个孤立的零件而不会破坏另一个零件。

这是在模块级别应用的,例如MVC是促进SRP和SoC的体系结构模式。代码库分为独立的模型,视图和控制器。这样,视图的修改可以独立于模型进行。两两不是可怕的交织在一起。

在较低的级别上,这也应应用于类。不要将多个方法放在一个类中,而是将代码分成几个部分。出于同样的原因。

即使在方法级别,也可以将大型方法拆分为较小的方法。

原则上。SRP是一个原则,而不是一条规则,因此您不必(读:不能/不应该)严格遵循它。例如,这并不意味着走得太远,每个类只有一个七行方法。这仅表示将代码拆分为孤立部分的一般原则。关键是它将导致更好的代码库和更稳定的软件。


8

关注点分离(SoC)。将您的应用程序划分为不同的功能,并尽可能减少功能重叠。(微软)。

“关注” =“明显特征” =“明显部分”

“关注”在高低两方面都起作用

单一责任原则 规定,每个模块或类都应对软件提供的功能的一部分负责,而责任应由类完全封装。它的所有服务都应严格地与这一责任保持一致。(维基百科定义)

“责任” =“改变的理由” 改变了什么?“软件提供的功能的一部分” =基本单元

结论

  • 单一责任原则适用于基本单位->低级适用

  • 关注点分离在高水平和低水平上均有效

  • SRP和SoC协同工作以分离关注点。它们
    在低级时完全相同


SRP也可以在不同级别上使用。在库级别上,您具有更一般的职责,在类级别上,您更负责。
Phil1970

7

由于先前的答案均未引用创建单一职责原则的罗伯特·马丁(Robert Martin),因此我认为这里需要一个更具权威性的答案。

马丁的SRP灵感来自大卫·帕纳斯(David Parnas),埃兹格·迪克斯特拉(Essger Dijkstra)(创造了关注分离的术语)和拉里·康斯坦丁(拉里·康斯坦丁)(创造了耦合凝聚力的术语)。马丁将他们的想法整合到了SRP中。

单一责任原则的另一种措词是:

将因相同原因而发生变化的事物聚集在一起。分开那些因不同原因而改变的事物。

如果考虑到这一点,您将意识到这只是定义内聚和耦合的另一种方式。我们希望增加由于相同原因而改变的事物之间的凝聚力,并且我们希望减少因不同原因而改变的事物之间的耦合。

但是,在考虑这一原则时,请记住,改变的原因是。这是谁请求更改。而且,您不希望通过将许多不同人出于不同原因而关心的代码混合在一起来混淆这些人或您自己。

对于最初的问题,SRP和SoC之间的次要区别是Martin提炼了“关注”一词来指代


3

分离关注点是一个过程;单一责任原则是一种设计/架构哲学。它们并不完全脱节,但是它们有不同的用途。


2

与此类似,但是:SoC与关注点有关:将一个复杂的问题分解为几个关注点,SRP只是一个责任。


2

SRP和SOC在不同的抽象级别上工作。两种情况下的目的都是减少耦合并增强内聚力。尽管SRP在对象级别上工作更多,但SOC在功能级别的实现上也可能工作。一个功能可以由一个对象实现,也可以由多个对象实现。因此,两个原理的结合和内聚性可能不同。


2

我试图在关注点分离(SoC)和单一责任原则(SRP)之间进行比较。

差异性

  • SRP在类级别,但是SoC在每个计算机程序,抽象...或有时在体系结构级别。

  • SRP是关于将您的域划分为仅具有一种责任(改变的一个原因)的内聚类的质量(而不是什么)的质量。在另一方面,SoC是一种用于将上下文分为不同部分的设计原则,这样,由于存在许多工具(例如类,函数,模块,程序包等),每个部分都解决了一个单独的问题(不是怎么解决)。 ..)以达到不同水平的目标。

  • SRP的概念基于内聚性(高内聚性),而SoC在每个抽象级别上都接近于分子,分而治之(D&C),...。

  • SoC是应对复杂性(例如抽象)的良好设计原则,而要达到单一负责的类,则可以将SoC原则用作出色的解决方案。因此,一种了解一个班级有多个责任的方法是,您是否可以从该班级提取另一个责任(关注)。

相似之处

  • 在应用了所有这些原理之后,您的上下文将变得更加可重用,可维护,健壮,易读...。

0

回答:

关注分离(SoC)是一个更通用的术语-可以在系统级别或较低级别(例如,类(甚至是类中的方法))中应用

单一责任原则(SRP)用于在较低级别(例如在一堂课中讨论SoC


思考方式:

  1. 在低层,SoC和SRP是同义词。因此,您可以说SRP是多余的术语-或SoC仅应用于讨论系统级别

  2. 给定(1),术语SoC有点模棱两可。您需要上下文信息才能知道讨论的是高级SoC还是较低级SoC

  3. 要记住SRP仅是较低级别的术语,请考虑一下:在日常语言中,“责任”通常是定义明确的事物,可以与特定代码联系在一起,而“担忧”通常有点含糊,可能包含许多相关的内容,这也许就是为什么SoC比SRP更适合讨论系统级别的原因

  4. 从某种意义上说,SoC是比SRP更强的要求/原则,因为它适用于系统级别,并且要在系统级别真正实现,还必须在系统组件的开发中使用。也就是说,高级别的SoC意味着较低级别的SoC / SRP不错-但是事实并非如此,也就是说,较低级别的SoC / SRP并不意味着下一个更高级别的SoC或任何东西。包含系统。有关在方法级别实现但在类级别违反的SoC / SRP的示例,请查看Artur Trosin的博客文章


0

关注点分离

关注分离(SOC)原则指出,代码工件应使人们可以将注意力集中在某个方面。代码工件可以是任何东西,从特定的功能到类,整个包,甚至整个应用程序都可以。SOC原理可以应用于一个应用程序中的每个体系结构级别。应用SOC的体系结构示例是分层体系结构。

单一责任原则

单一责任原则(SRP)指出“一个模块应该只有一个变更理由”(Clean Architecture,Martin,第62页)。SRP适用于模块级别,在应用SRP时,应将重点放在更改原因上。

结论

SOC原则规定,代码工件应允许人们将注意力集中在某个方面。SRP通过指出在模块级别上我们应该将注意力集中在更改的原因上来具体说明这一点。因此,SRP是SOC。

PS完整性:共同封闭原则

通用关闭原则(CCP)是SRP在更高级别(组件级别)的重述。CCP指出,出于相同原因在相同时间更改的类应收集到相同的组件中(Clean Architecture,第105页)。CCP是SOC的另一个示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.