OOP中的开放/封闭原则

时间:2018-01-09 11:10:35

标签: java oop

开放/关闭原则指出“软件实体(类,模块,函数等)应该是可以扩展的,但是关闭以进行修改”。

假设我有一个遗留域类,并且要求在域类中添加一个新字段,因此它违反了OOP的打开/关闭原则。如果是这样,我们如何在不违反开/关原则的情况下实现此要求?

3 个答案:

答案 0 :(得分:2)

开放/封闭原则是"打开以进行扩展,但已关闭以进行修改"。

我们的想法是,您可以设计系统,以便维护人员可以通过添加新类(通常是子类或实现接口)来添加功能,而不必修改现有的类。

在您的方案中,如果您需要通过添加字段修改域类,这是违反开放/封闭原则的设计的一个很好的示例。

如果您可以通过添加新类(可能扩展域类或扩展某个接口)来满足要求,那么域类的设计符合开放/封闭原则。是否可以这样做取决于域类是否是为此而设计的。

如果必须修改域类,可以考虑重构域类,以便可以通过添加类而不是再次修改域类来进行未来的更改。

答案 1 :(得分:0)

系统总是在变化。我们应该将软件更改为新的要求。我们需要一些:

  1. 新字段
  2. 某些方法中的新代码行
  3. 新方法
  4. 新课程
  5. new packeges
  6. 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