开放/关闭原则规定,“软件实体(类、模块、功能等)应开放供扩展,但为修改而关闭”。
假设我有一个遗留域类,并且需求是在域类中添加一个新字段,那么它违背了OOP的开放/关闭原则。如果是这样,我们如何在不违反开放/关闭原则的情况下实现这一要求--
发布于 2018-01-09 11:24:03
开放/封闭原则是“开放供扩展,但为修改而关闭”。
其思想是设计您的系统,以便维护人员可以通过添加一个新类(通常是子类或实现接口)来添加功能,而不必修改现有的类。
在您的场景中,如果需要通过添加字段来修改域类,这是一个违反开放/封闭原则的设计的好例子。
如果您可以通过添加一个新类(可能是扩展域类或扩展某些接口)来满足需求,那么域类的设计就符合开放/封闭原则。是否可以这样做取决于域类是否为此而设计。
如果您无论如何都必须修改域类,您可以考虑重构域类,以便将来可以通过添加类来进行更改,而不是再次修改域类。
发布于 2018-01-09 13:07:22
系统总是在变化。我们应该把我们的软件转变成新的要求。我们需要一些:
OCP说:
梅耶尔(1988年第一次定义,见参考文献1):
如果一个模块可以扩展,它将被认为是开放的。例如,应该可以将字段添加到它包含的数据结构中,或者向它执行的一组函数中添加新的元素。 如果可供其他模块使用,则称模块已关闭。这假设模块已经得到了定义良好、稳定的描述(信息隐藏意义上的接口)。在编程语言模块的情况下,封闭模块是一个可以编译并存储在库中的模块,供其他模块使用。在设计或规范模块的情况下,关闭模块仅仅意味着得到管理部门的批准,将其添加到项目官方的可接受软件项存储库(通常称为项目基线),并为其他模块设计人员发布其接口。
但这有点模糊。(也许已经过时了--基于罗伯特·C·马丁)
罗伯特·C·马丁(RobertC.Martin)在2014中提到了OCP的。
仔细考虑一下。如果可以扩展系统中所有模块的行为,而不修改它们,那么您可以在不修改任何旧代码的情况下向该系统添加新特性。通过编写新的代码,这些特性将完全由添加。
因此:如果我们可以在不更改现有代码的情况下向现有源代码添加新字段(只添加新代码),则不会违反OCP。
但是,如果我们在源代码中添加一个新字段,并且在接下来的步骤中强制更改现有代码的某些部分,我们就违反了OCP。
要评估我们的项目OCP值,例如,我们可以说:我们强制更改的代码行数(在添加新字段中)显示了我们项目的OCP值。
最终:要回答您的问题,源代码的所有部分都可以用来评估OCP值。
发布于 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
https://stackoverflow.com/questions/48166896
复制相似问题