【问题标题】:Open closed vs Single responsibility开放封闭 vs 单一责任
【发布时间】:2015-09-10 04:23:53
【问题描述】:

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

SRP 声明一个类必须只有一个改变的理由。 OCP 声明类必须对修改关闭,但对扩展开放。

我觉得这很矛盾。一个原则是类必须足够简单,您可以出于单一原因进行更改,但另一原则是类不能更改,只能扩展。

谁有更好的解释?

【问题讨论】:

  • 他们并不矛盾。扩展不是修改。
  • 埃德·科特雷尔。是的。这就是我要说的。 OCP 状态不修改类,只扩展它,而 SRP 状态只有一个修改原因。你有没有读过我的问题?
  • 我读了你的问题。关键是这些不是不相容的陈述。 SRP 并不意味着课程永远不会改变。这意味着他们应该只有一个 原因 进行更改,例如底层业务逻辑或第三方库是否需要更改。 OCP 意味着您需要对类执行的任何其他操作都应该由扩展完成,而不是修改。

标签: oop design-patterns solid-principles


【解决方案1】:

让我们将所有责任和变更原因表示为 2D 圆。

SRP -> 要求我们在那个圆的边缘切入(哈哈),这样剩下的部分就会非常紧密地耦合在一起,如果它会改变,它也会同时改变。

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

换句话说,符合 SRP 的类可能会失败 OCP,而符合 OCP 的类可能会失败 SRP。两者之间也有很大的重叠,但我的演示也表明也会有差异。

【讨论】:

    【解决方案2】:

    单一职责原则处理这样一个事实,即如果一个类有多个职责,如果这些职责在一个类中,它们将紧密耦合。 因此,如果接口或算法因一项职责而发生变化,它很可能也会影响另一项职责,这是一种不希望的影响。

    在开放/封闭原则中,类应该能够扩展其行为而无需修改类本身。唯一需要修改类应该是因为它有错误/错误,而不是因为您想更改或添加功能。

    例如(OCP):包含硬编码对象类型列表的类不开放扩展,因为如果要向列表中添加新类型,则需要修改该类。相反,更好的设计是当类具有添加或删除功能,或者您可以实现一个接口来保存每个子类的不同类型。

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多