"开放/封闭原则"和"依赖性倒置原则"之间有什么区别?

san*_*ino 5 oop design-patterns open-closed-principle solid-principles dependency-inversion

我读过有关SOLID的文章但我没有看到OCP和DIP之间有任何区别.看看这个OCP的例子:

http://www.oodesign.com/open-close-principle.html
Run Code Online (Sandbox Code Playgroud)

持有OCP的代码也满足DIP.任何人都可以给我一个持有OCP但不是DIP的代码示例吗?

aho*_*fer 4

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

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

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

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

这看起来似乎没什么大不了的,但它无法扩展。想象一下一个由 20 名开发人员组成的团队同时致力于该软件。首先,每个添加新形状的开发人员都必须记住做两件事:更新现有代码并创建新代码。每个加入该项目的新开发人员可能都会经历惨痛的教训才明白这一点。其次,如果每个人每天都添加新形状,则意味着每个人都在尝试编辑 GraphicsEditor 类。同时。很头疼。问我怎么知道的。:-)(修改现有代码时也有可能引入错误。)

如果您可以在不接触 GraphicsEditor 类中的任何代码的情况下向系统添加新的 Shape,那将是理想的选择。这就是本文想要论证的。

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

理解这一切的一个更简单的方法是学习访问者设计模式。我不喜欢维基百科对这种模式的解释,所以我将向您指出另一个地方: http: //sourcemaking.com/design_patterns/visitor。我认为理解访问者模式可以使所有其他术语和概念变得清晰。