开闭原则 vs 单一职责原则

6

我在研究单一职责原则(SRP)和开放封闭原则(OCP)。

SRP指出一个类只应该有一个导致它发生变化的原因。 OCP指出这个类应该对修改关闭但对扩展开放。

我觉得这两个原则是相互矛盾的。一个原则要求类足够简单,只有一个原因需要改变,而另一个原则则要求类不能被修改,只能被扩展。

有没有更好的解释呢?


它们不矛盾。扩展并非修改。 - elixenide
1
Ed Cottrell。是的。这就是我所说的。OCP声明不修改类,只扩展它,而SRP声明只有一个修改原因。你真的读了我的问题吗? - Hari Subramaniam
7
我看到了你的问题。关键在于这些陈述并不是互相排斥的。SRP并不意味着类永远不会发生变化,而是指它们应该只有一个更改的原因,例如底层业务逻辑或第三方库需要更改。OCP 的意思是,你需要对类做的任何其他事情都应该通过扩展来完成,而不是修改。 - elixenide
2个回答

3
单一职责原则指的是,如果一个类有多个职责,那么这些职责将会在一个类中紧密耦合。因此,如果一个职责的接口或算法发生了变化,它很可能也会影响到其他职责,这是不希望看到的结果。
开闭原则指的是,一个类应该能够扩展其行为,而无需修改类本身。唯一需要修改类的原因应该是因为它存在错误或缺陷,而不是因为您想要改变或添加功能。
例如(OCP):一个持有硬编码对象类型列表的类不适合进行扩展,因为如果您想要向列表中添加新类型,则需要修改该类。相反,更好的设计是使类具有添加或删除功能,或者实现一个接口以在子类中保存不同类型。

0

让我们将所有的责任和变更原因表示为一个二维圆圈。

SRP -> 要求我们在该圆圈的边缘切削(哈哈),以便剩下的部分非常紧密耦合,如果它发生变化,它将同时改变。

OCP -> 要求我们在该圆圈上打洞,以便那些以不同速度变化的部分可以在以后提供。

换句话说,符合SRP的类可能会违反OCP,而符合OCP的类可能会违反SRP。两者之间也有显著的重叠,但我的演示还显示了差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接