开放封闭原则

时间:2017-06-28 08:19:05

标签: c# open-closed-principle

我理解这个原则声明一个模块是开放的扩展但是关闭以进行修改,当我们想要在某个类中升级/修改一个方法时,这是明确的 - 我们创建另一个继承基类然后重写的类这里的基本方法是为了保持两种功能。

但是当我们想要为基类添加另一个不同的方法时呢?这被认为是基类的修改或扩展 - 可以将方法添加到基类中,还是我们还应该创建继承基类然后将新方法放在那里的新类?

此外,同样的问题是向基类添加属性和字段。

1 个答案:

答案 0 :(得分:5)

  

<强> TL; DR
  我认为添加一种新方法本身就意味着你不能违反OCP;因为OCP主要关注现有方法的鲁莽重写

  

实施例
  基类CalculatorMyCustomCalculator继承。基类只有添加,减去,乘以和除以两个数的方法   在MyCustomCalculator中创建新方法,例如CalculateAverage(params int[])并未违反OCP。它不会修改任何现有方法背后的逻辑,只是扩展计算器对象提供的方法。

新方法固有地不会改变旧方法。因此,他们不会修改现有的逻辑;然后简单地扩展可用的东西。

所以不,它不会(固有地)违反OCP。

它几乎不可能违反OCP,因为创建新东西(固有地)与修改存在的东西完全不同。

但有些事情需要注意:

  • 我可以想到一个(可论证的)例外:重载。如果您创建一个重载现有方法的新方法,那么您有责任遵守重载规则。最值得注意的是,这意味着重载方法应该执行与彼此完全相同的任务(重载方法仅基于不同的输入参数,但它们的处理和输出应该在功能上等效)。虽然我不是100%确定这是否违反了OCP(因为它错误地扩展了基类),或者 SRP (因为它对重载方法的处理/输出产生了模糊的责任)。这似乎是两者兼而有之。
  • 即使您的新方法不会使现有方法过载,同样的原则也适用。新方法是否足以与基类的责任(意图/目的)相关?因为如果它非常不同,那么您可能违反了 SRP

修改

我错过了你的部分问题

  

将方法添加到基类是否可以,或者我们还应创建继承基类然后将新方法放在那里的新类?

这取决于背景。对于我提供的Calculator / MyCustomCalculator / CalculateAverage()示例;我本能地将它添加到基类,因为计算平均值是一个与计算器职责相关的基本操作。

但是,如果我们讨论添加一个仅涉及复数(MethodForComplexNumbers())的方法,那么我会主张创建一个ComplexNumberCalculator,它继承自Calculator并实现{ {1}}。

但是,我认为这主要是由于 SRP ,而不是 OCP