- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
stackoverflow 上有很多关于“开闭原则”主题的讨论。然而,似乎普遍对原理有更宽松的解释,例如 Eclipse 是开放的,可以通过插件进行修改。
根据严格的 OCP,您应该仅修改原始代码来修复错误,而不是添加新行为。
在公共(public)或操作系统库中是否有严格解释 OCP 的好例子,您可以在其中通过 OCP 观察功能的演变:有一个带有方法 bar() 的类 Foo,并且有一个带有 foo2() 的 FooDoingAlsoX库的下一版本中的方法,其中原始类已扩展,原始代码未修改。
编辑:根据 Robert C. Martin 的说法:“模块的二进制可执行版本,无论是可链接库、DLL 还是 Java .jar 都保持不变”*。我从未见过图书馆关闭,实际上,新行为被添加到图书馆并发布新版本。根据OCP,新的行为属于新的二进制模块。
*Robert C. Martin 的《敏捷软件开发、原则、模式和实践》
最佳答案
OCP 原则规定,类应对扩展开放,但对更改关闭。实现这一点的关键是抽象。如果你还读过 DIP 原理,你会发现抽象不应该依赖于细节,而细节应该依赖于抽象。在您的示例中,您的界面中有详细信息(两个特定方法 bar() 和 foo2())。要完全实现 OCP,您应尽量避免此类细节(例如,尝试将它们移至抽象后面,而采用一种具有不同实现的通用 foo 方法)。
例如,看看 SolrNet 中的这个接口(interface): https://github.com/mausch/SolrNet/blob/master/SolrNet/ISolrCommand.cs这是一个通用命令,仅告诉您可以执行某个命令,并没有提供更多详细信息。
细节在于接口(interface)的实现: https://github.com/mausch/SolrNet/tree/master/SolrNet/Commands
如您所见,您可以添加任意数量的命令,而无需更改任何其他类的实现。具体实现可以认为是封闭的修改,但接口(interface)允许我们使用新命令扩展功能,因此开放扩展。
(无论如何,SolrNet 并不是特别出色,我只是使用了这个项目中的示例,因为当我阅读这篇文章时,我的浏览器中碰巧有它,几乎所有良好编码的 OO 项目都以一种方式利用 OCP 原则,或者另一个)
编辑:如果您想要二进制级别的示例,您可以查看 nopCommerce (http://nopcommerce.codeplex.com/releases/view/69081),例如您可以在其中添加自己的运输提供商、支付提供商或汇率提供商,甚至无需通过实现一组接口(interface)来触及原始 DLL。再说一次,这对于 nopCommerce 来说并不是什么特别的事情,这只是我想到的第一个项目,因为我几天前使用过它;)
OCP 并不是一个只能在二进制级别使用的原则,好的 OOD 使用 OCP,不是在任何地方,而是在所有适合的级别;)二进制级别上的“严格”OCP 并不总是合适,并且如果您在每种情况下都使用它,则会增加额外的复杂性,当您想要在运行时更改实现或当您希望让外部开发人员能够扩展您的接口(interface)时,它最有趣。在设计界面时,您应始终牢记 OCP 原则,但不应将其视为法律,而应将其视为应在正确情况下使用的原则。
我猜当您引用 Robert C Martin 时,您指的是敏捷原则、模式和实践,如果是这样,请阅读同一章中的结论,他所说的内容与我上面所做的相同。例如,如果您阅读他的《Clean Code》一书,他对 OCP 原理给出了更详细的解释,我想说上面的引用有点不幸,因为它会让人们认为您应该始终将新代码放入新的 DLL:s、JAR 中:s 或 libs,事实是您应该始终考虑上下文。
我认为您应该看看 Martins 关于 OCP 的最新白皮书 http://objectmentor.com/resources/articles/ocp.pdf (他在后来的《清洁代码》一书中也提到了这一点),在那里他从不引用单独的二进制文件,而是引用“类、模块、函数”。我认为这证明了Martin在谈论OCP时不仅仅指的是二进制扩展,还指的是类和函数的扩展,因此二进制扩展并不比我第一个示例中的类扩展更“严格”。
关于oop - 开源库中 OCP 的好例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222585/
去年(2023年)年底我初学flutter,看了一些文档和教程,想找个东西*练练手。 小时候看过一个关于历史名人儿时事迹的短片,有一集是讲*总理的,有一个细节我记得很清楚:幼年***经常要做一个游戏
今天给大家分享一个我做的小工具,可以自定义扩展右键菜单的功能来提高工作效率,效果图如下: image 如上图,右键菜单多了几个我自定义的菜单
任何人都可以建议我应该使用什么程序/方法? 我需要有一个像谷歌地图这样的 map ,我可以在其中显示 map 、添加标记多边形等。 但是我不能依赖这样的在线服务,因为客户担心这样的服务会消失,我们的系
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 11年前关闭。 Improve this qu
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
您知道 EDA(电子设计自动化)领域有哪些开源项目正在寻找 C++ 程序员吗? 最佳答案 如果您经常关注 gEDA 的邮件列表,您也许能够加入 gEDA。详情:http://www.gpleda.or
如果现有Hadoop群集上有10个数据节点,则可以在4个或6个数据节点上安装NiFi吗? NiFi的主要目的是每天将数据从RDBMS加载到高容量的HDFS。 数据节点将配置为具有100 GB的高RAM
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Closed. This question is off-topic。它当前不接受答案。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
【Github源码】 《上一篇》 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库。 扩展动态对象是整个工具库中最重要的一个设计。
【Github源码】 《上一篇》 介绍了Xmtool工具库中的Web操作类库,今天我们继续为大家介绍其中的图形验证码类库。 图形验证码是为了抵御恶意攻击出现的一种设计;例如用
【Github源码】 《上一篇》 介绍了Xmtool工具库中的发送短信类库,今天我们继续为大家介绍其中的XML操作类库。 XML操作是软件开发过程中经常会遇到的情况;包括XM
作者以 SciTime 项目(一个对算法训练时间进行估计的包)的发布为例,详细解释了发布的每个步骤。 注意:本文假设你在 GitHub 上已经有一个想要打包和发布的项目。 第 0 步:获取项
前言 今天大姚给大家分享一个C#开源(MIT License)、免费、简单易用的Dapper扩展类库,帮助.NET开发者使用Dapper的CRUD操作变得更简单:Dommel。 项目特性
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 血压的测量和预测是心脏病患者和有心脏问题的人的一个重要条件,应该保持持续的控制。在这项研究中,基
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 心血管疾病是最严重的死亡原因之一,每年在全世界造成严重的生命损失。持续监测血压似乎是最可行的选择
我是一名优秀的程序员,十分优秀!