5

我阅读了有关 SOLID 的文章,但我看不出 OCP 和 DIP 之间有什么区别。看看这个 OCP 的例子:

http://www.oodesign.com/open-close-principle.html

持有 OCP 的代码也满足 DIP。谁能给我一个包含OCP而不是DIP的代码示例?

4

1 回答 1

4

我发现依赖注入和打开/关闭的解释也令人困惑。不一定要那样。我们来看看你参考的文章:http ://www.oodesign.com/open-close-principle.html

在他们的示例中,有一个 GraphicsEditor 类和一个形状类的层次结构。在他们展示的第一个类图中,GraphicsEditor 中有一堆方法用于绘制各种形状类:drawShape;画圈;绘制矩形。

当你想添加一个平行四边形类时会发生什么?首先创建新类 Parallelogram,然后修改 GraphicsEditor 类以添加一个名为 drawParallelogram 的新方法。

这就是文章所指的“坏处”:添加一个新形状意味着您必须更改现有代码。您添加了 Shape (Parallelogram) 的新子类,并向 GraphicsEditor 添加了新方法 (drawParallelogram)。

这可能看起来没什么大不了的,但它并没有规模化。想象一下,一个由 20 名开发人员组成的团队同时在软件上工作。首先,每个添加新形状的开发人员都必须记住做两件事:更新现有代码和创建新代码。每个加入该项目的新开发人员都可能会以艰难的方式学习这一点。其次,如果每个人每天都在添加新形状,这意味着每个人都在尝试编辑 GraphicsEditor 类。同时。真是头疼。问我怎么知道的。:-)(也有可能在修改现有代码时将错误引入现有代码。)

如果您可以在不触及 GraphicsEditor 类中的任何代码的情况下向系统添加新形状,那将是理想的。这就是这篇文章想要展示的。

看文章中的第二个类图。每个形状现在都实现了自己的绘制方法。GraphicsEditor 只需要知道有一些超类“Shape”,并且它的所有子类都实现了“draw”方法。GraphicsEditor 不再关心有多少子类或它们的名称。开发人员无需修改 GraphicsEditor 类即可自由实现新形状。GraphicsEditor 类现在“关闭”。通过这种方式,系统“对扩展开放”——无需更改现有代码即可创建新形状。问题解决了。

了解所有这些的更简单方法是学习访问者设计模式。我不喜欢 Wikipedia 对这种模式的解释,所以我将向您指出另一个地方:http: //sourcemaking.com/design_patterns/visitor。我认为理解访问者模式会使所有其他术语和概念都到位。

于 2011-11-30T18:18:53.547 回答