我阅读了有关S.O.L.I.D.的文章但我认为OCP和DIP之间没有任何区别。看一下OCP的示例:
http://www.oodesign.com/open-close-principle.html
保存OCP的代码也完成了DIP。谁能给我一个包含OCP而不是DIP的代码示例?
最佳答案
我发现对依赖项注入(inject)和打开/关闭的解释也很困惑。不一定要那样。让我们看看您引用的文章:http://www.oodesign.com/open-close-principle.html
在他们的示例中,有一个GraphicsEditor类和一个形状类层次结构。在它们显示的第一个类图中,GraphicsEditor中有很多方法可以绘制各种形状类:drawShape; drawCircle; drawRectangle。
当您想添加平行四边形类时会发生什么?您首先创建新的类Parallelogram,然后修改GraphicsEditor类以添加一个名为drawParallelogram的新方法。
这就是本文所指的“坏处”:添加一种新形状意味着您必须更改现有代码。您添加一个新的Shape子类(平行四边形),并向GraphicsEditor添加一个新方法(drawParallelogram)。
这看起来似乎没什么大不了的,但是它并没有扩大规模。想象一下一个由20个开发人员组成的团队,他们全部同时在开发该软件。首先,每个添加新形状的开发人员都必须记住做两件事:更新现有代码并创建新代码。每个加入该项目的新开发人员都可能会很难学到这一点。其次,如果每个人每天都在添加新形状,则意味着每个人都在尝试编辑GraphicsEditor类。同时。头疼问我我怎么知道。 :-)(修改后,也有可能在现有代码中引入错误。)
如果可以在不触摸GraphicsEditor类中的任何代码的情况下向系统添加新的Shape,那将是理想的。这就是本文要演示的内容。
查看文章中的第二个类图。现在,每个形状都实现自己的绘制方法。 GraphicsEditor只需要知道有一些父类(super class)“Shape”,并且其所有子类都实现了“draw”方法。 GraphicsEditor不再关心存在多少个子类或其名称。开发人员可以自由地实现新形状,而无需修改GraphicsEditor类。现在,GraphicsEditor类已“关闭”。这样,系统是“开放扩展的”-无需更改现有代码即可创建新形状。问题解决了。
了解所有这些的一种更简单的方法是学习访问者设计模式。我不喜欢Wikipedia对这种模式的解释,所以我将带您到另一个地方:http://sourcemaking.com/design_patterns/visitor。我认为了解访问者模式会使所有其他术语和概念都付诸实践。
关于oop - "Open/closed principle"和 "Dependency inversion principle"有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8328075/