Oop 是";“高内聚力”;“的同义词”;单一责任原则;

Oop 是";“高内聚力”;“的同义词”;单一责任原则;,oop,solid-principles,single-responsibility-principle,cohesion,Oop,Solid Principles,Single Responsibility Principle,Cohesion,高凝聚力是单一责任原则的同义词吗?如果不是,它们有何不同?它们不是一回事 您可以拥有一个高度内聚的类,它不只是一个职责。它不是同义词。SRP(单一责任原则)是指确保您的类只有一项责任。当然,这会增加类的凝聚力 但是,您可以在不严格遵循SRP的情况下获得高内聚性 这是一个很好的来源。你问:如果没有,它们有什么不同? 单一责任原则 扔掉你认为你猜这个原则意味着什么 Robert C.Martin正式将该原则定义为: 一个类应该只有一个更改的原因 大多数人定义SRP是不正确的。SRP通常被错误地解释为

高凝聚力单一责任原则的同义词吗?如果不是,它们有何不同?

它们不是一回事

您可以拥有一个高度内聚的类,它不只是一个职责。

它不是同义词。SRP(单一责任原则)是指确保您的类只有一项责任。当然,这会增加类的凝聚力

但是,您可以在不严格遵循SRP的情况下获得高内聚性


这是一个很好的来源。

你问:如果没有,它们有什么不同?

单一责任原则 扔掉你认为你猜这个原则意味着什么

Robert C.Martin正式将该原则定义为:

一个类应该只有一个更改的原因

大多数人定义SRP是不正确的。SRP通常被错误地解释为:

“员工类不应
UpdateDemographics()
SendMessage()
,这是两项职责…将
SendMessage()
放入Message类中!!”

^错误

vv右

罗伯特·C·马丁说

“责任不是‘代码所做的事情’”。(NDC 2012)

Robert C.Martin将SRP定义为:

“任何模块应仅对一人负责(角色)。”(NDC 2012)

利益相关者要求更改视图中的数据排序时,管理层不应惊慌失措,担心算法会崩溃。因为处理视图排序的模块只对干系人负责,而处理总体计算算法的模块只对业务分析师负责。因此,当业务分析师要求更改算法时,我们不必担心视图会更改

因此,一个模块(单数)的更改只有一个原因:该模块所服务的个人角色
请求更改

这是您定义SRP的新基础,现在您可以应用“强”思想>SRP,使定义更加颗粒状。没有人说要将所有前端代码放在一个模块中,将所有后端代码放在一个模块中

高内聚 假设您有一种方法<代码>十进制计算(员工)和另一种方法<代码>作废工资(员工)

这些是属于一起的吗?可能有一个执行各种计算的服务,也可能有一个只包装人力资源支付SOAP的服务。也许
Pay(Employee)
调用了
calculatepay(Employee)
,但仅仅因为他们有
Pay
这个词,并不意味着他们属于一起

我如何创建凝聚力?-你没有。凝聚力是你观察到的东西。你要做的是不要把属于你的东西拆开。

可以为您想要的每个公共方法创建一个类。现在每个类都有一个公共方法,所有的东西都是定义良好的混乱。您有名为
PayrollClass1
PayrollClass2
的类,因为一个类以一种方式进行计算,另一个类以两种方式进行计算

有些语言甚至可以从类的完全缺乏中获益,方法可以免费运行。没有方法分组,方法只是可以随时调用的方法。它们几乎都是静态的

然而,您可以观察到,
计算(员工)
支付(员工)
实际上是高度约束的。他们就像一对完美无缺的夫妻,他们在一起看起来很棒。当方法明确地属于一起时,你不想把它们分开。观察它们的自然状态并建立野生动物保护区。这是保持高内聚力的。你不是创造它,而是观察它

这真正有助于正确的代码复制。例如,
PayrollService.CalculatePayFor(Employee)
的代码与
ReportService.CalculatePayFor(Employee)
的代码完全相同。这不好吗?当然不是。如果高级管理层为了报告而要求更改员工薪酬的计算方法,这与H.R.为了实际支付方法的税务目的而要求您更改计算方法的责任不同

“等等,他是不是把SRP和凝聚力搞混了?”没有,但我很高兴你认识到了这一点。如果ReportService进入PayrollService的类并使用其方法,该怎么办?然后当它为了合法的支付目的而改变时,所有的报告都会改变。。。但管理层不希望这样!!!因此,由于内聚力迫使方法保留在自己的类中,而SRP迫使模块保留在应用程序中,因此ReportService被迫从PayrollService类复制/粘贴方法。现在它们可以独立地改变

“但如果这不是你想要的呢?”嗯,代码中有很多地方不允许重复。但最常见的情况是算法保持自身不变,并独立于依赖项进行更改。即使这意味着重复。这取决于需要什么。但关注点分离、单一责任、凝聚力和干性(不要重复自己)都是不同的想法

旁注:干燥并不意味着永远不会有重复。正如我提到的:很多时候,您可能会有重复的代码,因为不同关注点之间的业务规则相似,并且有不同的更改原因。

在Robert Martin的文章中

如果你想想[SRP],你就会意识到这只是