首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OOP中的开/闭原理

OOP中的开/闭原理
EN

Stack Overflow用户
提问于 2018-01-09 11:10:34
回答 3查看 739关注 0票数 0

开放/关闭原则规定,“软件实体(类、模块、功能等)应开放供扩展,但为修改而关闭”。

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

EN

回答 3

Stack Overflow用户

发布于 2018-01-09 11:24:03

开放/封闭原则是“开放供扩展,但为修改而关闭”。

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-01-09 13:07:22

系统总是在变化。我们应该把我们的软件转变成新的要求。我们需要一些:

  1. 新领域
  2. 某些方法中的新代码行
  3. 新方法
  4. 新班
  5. 新包装

OCP说:

梅耶尔(1988年第一次定义,见参考文献1):

如果一个模块可以扩展,它将被认为是开放的。例如,应该可以将字段添加到它包含的数据结构中,或者向它执行的一组函数中添加新的元素。 如果可供其他模块使用,则称模块已关闭。这假设模块已经得到了定义良好、稳定的描述(信息隐藏意义上的接口)。在编程语言模块的情况下,封闭模块是一个可以编译并存储在库中的模块,供其他模块使用。在设计或规范模块的情况下,关闭模块仅仅意味着得到管理部门的批准,将其添加到项目官方的可接受软件项存储库(通常称为项目基线),并为其他模块设计人员发布其接口。

但这有点模糊。(也许已经过时了--基于罗伯特·C·马丁)

罗伯特·C·马丁(RobertC.Martin)在2014中提到了OCP的。

仔细考虑一下。如果可以扩展系统中所有模块的行为,而不修改它们,那么您可以在不修改任何旧代码的情况下向该系统添加新特性。通过编写新的代码,这些特性将完全由添加。

因此:如果我们可以在不更改现有代码的情况下向现有源代码添加新字段(只添加新代码),则不会违反OCP。

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-01-09 13:18:58

在您的示例中,只要这些更改不强制对类API进行更改,并且因为它是关于域类,而不是服务类,就不会违反OCP。

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

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

当对程序的单个更改导致对依赖模块的一系列更改时,该程序就会显示出我们与“坏”设计相关联的不良属性。程序变得脆弱、僵化、不可预测和不可重用。开放原则以一种非常直截了当的方式对此进行了攻击。它说你应该设计一个永不改变的模块。当需求发生变化时,可以通过添加新代码来扩展此类模块的行为,而不是通过更改已经工作的旧代码来扩展这些模块的行为。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48166896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档