【问题标题】:Open/Closed Principle in OOPOOP 中的开闭原则
【发布时间】:2018-06-18 09:52:57
【问题描述】:

打开/关闭原则指出“软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭”。

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

【问题讨论】:

  • 打开/关闭的主体无论如何都是垃圾。我不会注意的。
  • 大多数OOP技术,如接口、抽象类、继承等,都是基于OCP产生的。但是,OCP 的定义和含义在新世界中可能会发生变化。请深入阅读 Robert C. Martin 的笔记here这不是垃圾。如今,OCP 主要用于架构和设计,而不是实现。在大多数情况下,Java 等编程语言会阻止您违反 OCP。

标签: java oop


【解决方案1】:

Open/Closed 原则是“对扩展开放,对修改关闭”。

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

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

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

如果您无论如何都必须修改域类,您可以考虑重构域类,以便将来可以通过添加类来进行更改,而不是再次修改域类。

【讨论】:

    【解决方案2】:

    在您的情况下,只要这些更改不会强制更改类 API,并且因为它是关于域类而不是服务类,它就不会违反 OCP。

    当一个模块的 API 建立并发布给客户端使用时,它就被称为关闭。一旦你这样做了,你就不能改变 API,因为它会破坏客户的代码。

    另一方面,只要 API 保持不变,您就可以无缝地为客户端修改实现类的内部工作。

    当对程序的一次更改导致对程序的一连串更改时 依赖模块,该程序表现出不受欢迎的属性 我们已经将其与“坏”设计联系起来。程序变成 脆弱、僵化、不可预测和不可重复使用。开闭原则 以非常直接的方式攻击这一点。它说你应该 设计永不改变的模块。当需求改变时,你扩展 通过添加新代码而不是更改旧代码来改变此类模块的行为 已经可以运行的代码。

    阅读:https://web.archive.org/web/20060822033314/http://www.objectmentor.com/resources/articles/ocp.pdf

    【讨论】:

      【解决方案3】:

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

      1. 新字段
      2. 某些方法中的新代码行
      3. 新方法
      4. 新课程
      5. 新包

      OCP 说:

      Mayer(1988 年首次定义,see reference 1):

      如果模块可用于扩展,则该模块将被称为打开。为了 例如,应该可以将字段添加到它的数据结构中 包含它所执行的功能集的新元素。

      如果一个模块可供其他模块使用,则称该模块已关闭 模块。这假设该模块已被明确定义, 稳定的描述(信息隐藏意义上的接口)。 在编程语言模块的情况下,封闭模块是一个 可以编译并存储在库中,供其他人使用。在 设计或规范模块的情况,简单地关闭模块 意味着得到管理层的批准,将其添加到项目的 已接受软件项目的官方存储库(通常称为 项目基线),并发布其界面以利于 其他模块设计者。

      但它有点模糊。 (并且可能已经过时 - 基于 Robert C. Martin)

      Robert C. Martin 在 2014 年 谈到 OCP see reference 2

      请仔细考虑。如果所有模块的行为 在您的系统中可以扩展,无需修改它们,然后您 无需修改任何旧代码即可向该系统添加新功能。 只需通过编写新代码来添加这些功能。

      因此: 如果我们可以在现有源代码中添加新字段而不更改现有代码(仅添加新代码),则不违反 OCP。

      但是,如果我们在源代码中添加一个新字段,并且在接下来的步骤中我们强制更改现有代码的某些部分,则违反了 OCP。

      要评估我们的项目 OCP 值,例如我们可以说:我们强制更改的代码行数(在添加新字段时),显示了我们项目的 OCP 值。

      最后:要回答您的问题,源代码的所有部分都应该可以用来评估 OCP 值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-16
        • 1970-01-01
        相关资源
        最近更新 更多