单一责任原则与关注点分离有什么区别?
单一责任原则(SRP) - 给每个班级一个改变的理由;和“改变的理由”==“责任”。例如:Invoice类没有责任自行打印。
关注的分离(自1974年以来)。关注==系统的特点。照顾每一个问题:对于每一个问题,其他问题都是无关紧要的。隐藏行为的实施。
来自here。
SRP和SOC在不同的抽象层次上工作。目的是在两种情况下减少耦合并增强内聚力。虽然SRP在对象级别上工作得更多,但SOC也可以在功能级别的实现上工作。函数可以由一个对象实现,也可以由多个对象实现。因此,两种原理的耦合和内聚可能不同。
我试图在关注点分离(SoC)和单一责任原则(SRP)之间进行比较。
差异
相似
回答:
关注点分离(SoC)是一个更通用的术语 - 它可以应用于系统级别或较低级别,如类(甚至是类中的方法)
单一责任原则(SRP)用于讨论较低级别的SoC,例如在课堂上
想一想的方法:
Separation of Concern vs Single Responsibility Principle ( SoC vs SRP )
来自链接的文章:
关注点分离(SoC) - 是将计算机程序分解为尽可能少地在功能上重叠的不同功能的过程。关注点是程序中的任何兴趣或焦点。通常,顾虑与特征或行为是同义词。 http://en.wikipedia.org/wiki/Separation_of_concerns
单一责任原则(SRP) - 每个对象都应该承担一项责任,并且其所有服务应该与该责任密切相关。在某种程度上,Cohesion被认为是SRP的同义词。 http://en.wikipedia.org/wiki/Single_responsibility_principle
单一责任声明对象负责单个工作单元。
关注点分离表明应用程序应该分成功能性尽可能少的模块。
类似的最终结果......略有不同的应用。
在我看来,单一责任原则是实现关注点分离的工具/习语之一。
单一责任原则和关注点分离实际上是一回事。
当然,你可以陷入学术讨论中,试图梳理出两者之间的某种差异,但为什么呢?出于所有意图和目的,他们描述了同样的事情。最大的问题是人们如此想知道究竟什么是“关注”和“责任”,他们可能会错过SRP和SoC背后的重要思想。
这个想法只是将您的代码库分成松散耦合的孤立部分。这允许多个开发人员在不影响彼此的情况下处理不同的部分,它还允许单个开发人员修改一个孤立的部分而不会破坏另一个部分。
这适用于模块级,例如MVC是一种促进SRP和SoC的架构模式。代码库分为独立模型,视图和控制器。这样,视图的修改可以独立于模型完成。两个不是可怕的交织在一起。
在较低级别,这也应该应用于类。而不是将几十个方法放在一个类中,而是将代码分成几个。出于同样的原因。
即使在方法级别,也可以将大型方法拆分为更小的方法。
原则上。 SRP是一个原则,而不是一个规则,所以你不必(读:不能/不应该)将它虔诚地追随到极致。这并不意味着走得太远,例如每个类只有一个七行方法。它只是意味着将代码拆分为孤立部分的一般原则。关键是它会带来更好的代码库和更稳定的软件。
关注点分离(SoC)。将您的应用程序划分为不同的功能,尽可能少地重叠功能。 (微软)。
“关注”=“不同特征”=“不同部分”
“关注”在高层和低层均有效
单一责任原则规定每个模块或类应对软件提供的功能的单个部分负责,并且该责任应完全由类封装。其所有服务应与该责任严格一致。 (维基百科定义)
“责任”=“改变的理由”改变了什么? “软件提供的功能的一部分”=基本单元
结论
分离关注是一个过程;单一责任原则是一种设计/架构理念。它们并非完全脱节,但它们有不同的用途。
由于之前的答案都没有引用创建Single Responsibility Principle的罗伯特·马丁,我认为这里需要一个更权威的答案。
Martin对SRP的启发来自David Parnas,Edsger Dijkstra(创造了“关注点分离”一词)和Larry Constantine(创造了耦合和凝聚力这两个术语)。 Martin将他们的想法整合到SRP中。
单一责任原则的另一个措辞是:
将出于同样原因而改变的事物聚集在一起。将那些因不同原因而改变的事物分开。
如果你想到这一点,你会发现这只是定义内聚和耦合的另一种方式。我们希望增加因同样原因而改变的事物之间的凝聚力,并且我们希望减少因不同原因而改变的事物之间的耦合。
但是,当你考虑这个原则时,请记住改变的原因是人。是要求变更的人。并且您不希望通过将许多不同人关心的代码混合在一起来混淆那些人或者您自己。
对于最初的问题,SRP和SoC之间的细微差别在于,Martin将术语“关注”改进为人。
类似但是:SoC与担忧有关:将一个复杂的问题分解为几个问题,SRP只有一个责任。