开放/关闭原则指出“软件实体(类,模块,函数等)应该是可以扩展的,但是关闭以进行修改”。
假设我有一个遗留域类,并且要求在域类中添加一个新字段,因此它违反了OOP的打开/关闭原则。如果是这样,我们如何在不违反开/关原则的情况下实现此要求?
答案 0 :(得分:2)
开放/封闭原则是"打开以进行扩展,但已关闭以进行修改"。
我们的想法是,您可以设计系统,以便维护人员可以通过添加新类(通常是子类或实现接口)来添加功能,而不必修改现有的类。
在您的方案中,如果您需要通过添加字段修改域类,这是违反开放/封闭原则的设计的一个很好的示例。
如果您可以通过添加新类(可能扩展域类或扩展某个接口)来满足要求,那么域类的设计符合开放/封闭原则。是否可以这样做取决于域类是否是为此而设计的。
如果必须修改域类,可以考虑重构域类,以便可以通过添加类而不是再次修改域类来进行未来的更改。
答案 1 :(得分:0)
系统总是在变化。我们应该将软件更改为新的要求。我们需要一些:
OCP说:
Mayer(1988年的第一个定义,see reference 1):
如果模块可用于扩展,则称该模块是开放的。对于 例如,应该可以将字段添加到数据结构中 包含或执行它所执行的函数集的新元素。
如果模块可供其他人使用,则该模块将被关闭 模块。这假设模块已经定义明确, 稳定的描述(信息隐藏意义上的界面)。 在编程语言模块的情况下,封闭模块是一个 可以编译并存储在库中,供其他人使用。在 在设计或规范模块的情况下,简单地关闭模块 是指由管理层批准,将其添加到项目中 已接受软件项目的官方存储库(通常称为 项目基线),并为了利益而发布其界面 其他模块设计师。
但它有点模糊。 (也许过时 - 基于Robert C. Martin)
Robert C. Martin在 2014 中注意到OCP see reference 2:
仔细想想。如果所有模块的行为 在你的系统中可以扩展,而无需修改,然后你 可以为该系统添加新功能而无需修改任何旧代码。 这些功能将仅通过编写新代码添加。
<强>因此强>: 如果我们可以将新字段添加到现有源代码而不更改现有代码(仅添加新代码),则不会违反OCP。
然而,如果我们向源代码添加新字段,并且在接下来的步骤中我们强制更改现有代码的某些部分,则会违反OCP。
为了评估我们的项目OCP值,例如我们可以说:我们强制改变的代码行数(在添加新字段中)显示了我们项目的OCP值。
最后:要回答您的问题,应该可以使用源代码的所有部分来评估OCP值。
答案 2 :(得分:0)
在您的情况下,只要这些更改不会强制更改类API,并且因为它是关于域类而不是服务类,就不会违反OCP。
当一个模块的API已经建立并发布给客户使用时,该模块就被关闭了。一旦你这样做,你就无法改变API,因为它会破坏客户端&#39;代码。
另一方面,只要API保持不变,您就可以无缝地修改实现类的内部工作方式。
对程序进行一次更改会导致一系列更改 依赖模块,该程序表现出不良的属性 我们已经将“坏”设计联系起来。该计划成为 脆弱,僵硬,不可预测和无法回避。开放原则 以非常直接的方式攻击它。它说你应该 设计永不改变的模块。当需求发生变化时,您会扩展 通过添加新代码而不是通过更改旧代码来执行此类模块的行为 已经有效的代码。
阅读本文:https://web.archive.org/web/20060822033314/http://www.objectmentor.com/resources/articles/ocp.pdf