"开闭原则"和"依赖反转原则"有什么区别?"

6

我看过关于S.O.L.I.D的文章,但是我没有看出OCP和DIP有什么区别。看看这个OCP的例子:

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

符合OCP原则的代码也应该满足DIP原则。有没有人能给我提供一个仅具备OCP而不符合DIP的代码示例?


从概念角度来看,OCP和DIP有根本的不同。我的猜测是,具有OCP的代码可能也具有DIP,但无论如何都是偶然的。 - Brian Driscoll
DIP可能暗示OCP,但OCP并不一定暗示DIP。 - Brian Driscoll
所以,据我理解,OCP是DIP或没有抽象的DIP。我说得对吗? - santino
我认为你过于关注代码而忽略了概念。OCP和DIP都是关于如何设计应用程序的概念原则,因此它们是不同的。 - Brian Driscoll
这个回答解决了你的问题吗?“开闭原则”和“依赖倒置原则”的区别是什么? - jaco0646
显示剩余2条评论
1个回答

4
我也认为依赖注入和开闭原则的解释很令人困惑。但其实并不需要这样。让我们来看看你提到的这篇文章:http://www.oodesign.com/open-close-principle.html
他们的例子中,有一个GraphicsEditor类和一系列形状类的层级结构。在第一个类图中,GraphicsEditor中有一堆方法用于绘制每种形状类:drawShape、drawCircle、drawRectangle。
当你想添加一个平行四边形时会发生什么?你首先创建新类Parallelogram,然后修改GraphicsEditor类以添加一个名为drawParallelogram的新方法。
这就是本文所说的“坏处”:添加一个新形状意味着你必须改变现有代码。你添加一个新的Shape子类(Parallelogram),并向GraphicsEditor添加一个新的方法(drawParallelogram)。
这可能看起来不是很重要,但它无法扩展。想象一下,有一个由20个开发人员组成的团队正在同时开发这个软件。首先,每个添加新形状的开发人员都必须记住要做两件事:更新现有代码和创建新代码。每个新加入项目的开发人员可能都要吃过亏才会了解这点。其次,如果每个人都每天添加新图形,这意味着每个人都试图编辑GraphicsEditor类。同时进行。这是非常头疼的问题。问我怎么知道的。:-)(在修改现有代码时还可能引入错误)。
如果您可以在不触及GraphicsEditor类中的任何代码的情况下向系统中添加新Shape,那将是理想的。这就是本文想要展示的内容。
看看文章中的第二个类图。每种形状现在都实现了自己的draw方法。GraphicsEditor只需要知道有一个超类“Shape”,并且所有子类都实现了方法“draw”。GraphicsEditor不再关心有多少子类或它们的名称是什么。开发人员可以自由实现新形状,而无需修改GraphicsEditor类。GraphicsEditor类现在是“封闭”的。通过这种方式,系统“对扩展开放”--创建新形状无需更改现有代码。问题得到解决。
理解所有这些的更简单方法是学习访问者设计模式。我不喜欢维基百科对该模式的解释,因此我会指向另一个地方:http://sourcemaking.com/design_patterns/visitor。我认为理解访问者模式会使所有其他术语和概念变得清晰明了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接