gpt4 book ai didi

oop - "Open/closed principle"和 "Dependency inversion principle"有什么区别?

转载 作者:行者123 更新时间:2023-12-04 20:19:28 24 4
gpt4 key购买 nike

我读过关于 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;画圈;绘制矩形。

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

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

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

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

看文章中的第二个类图。每个形状现在都实现了自己的绘制方法。 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com