内聚与单一职责

Cohesion vs Single Responsibility

我已经开始研究凝聚力等概念和单一职责原则等原则。我很困惑他们之间的区别。

网上的资料很多,但我觉得很难筛选出正确的比较。

内聚和单一职责之间有什么关系? 一个class有没有可能只有一个职责但是内聚性低?

这些概念在维基百科中有简洁的描述 here and here

一个责任仍然是一个抽象的概念。如果责任是建立一个报告,它是一个任务,但仍然是一个有几个步骤和数据部分的任务。因此 class 中会出现一些 space 的低内聚。随便做个计算,如果简单,就"atomic"和高内聚

如果您认为 SRP 有一个单一的理由来更改 class,我认为这也有帮助。

Cohesion可以看作是一个软件质量指标,而SRP更多的是一个主观的软件质量原则。正如 Pragmatic Programmers 所描述的那样,当属于一起并相互依赖的事物保持在一起时,就会产生内聚代码。

例如,如果class的实例变量或属性是全部被它的方法和它的方法单独使用,但这些方法也不使用任何来自其他对象的外部数据或方法,class 被认为是高度内聚的。但是,如果那个 class 恰好是从一个文件中读取和写入,那么 class 可以看作是 而不是 遵守单一职责原则,作为读取和写入写作可以被视为两个截然不同的任务。无论如何,您还可以将 class 的主要任务视为 "do IO operations with the file system",因此 SRP 在某种程度上可以根据其应用的上下文进行解释。