开放/封闭原则的问题?

     2023-03-15     52

关键词:

【中文标题】开放/封闭原则的问题?【英文标题】:Issues with the Open/Closed Principle? 【发布时间】:2014-07-07 15:16:36 【问题描述】:

正在阅读 SOLID 设计的开放/封闭原则,并对它的可维护性感到好奇。

假设我有从父类 A 继承的子类 B 和 C。B 具有 B 独有的方法,C 具有 C 独有的方法。父类 A 有两个子类使用的常用方法。

在未来的代码版本中,假设我们有一个新特性,它在 B 类和 C 类之间引入了一个通用方法。我们现在不能将该方法推送到 A 类,因为它违反了“为修改而关闭”部分原则。这似乎引入了代码冗余。不仅如此,从技术上来说,在B类和C类中加入这个新特性,是不是也违反了修改原则?

似乎使用 Open/Closed 方法,您最终会构建不必要的级联子类层次结构,仅仅是因为不允许更改原始代码。这是一个正确的假设/理解吗?

【问题讨论】:

这听起来有点做作,但你可以考虑让 B 和 C 派生自一个共同的基础,而该基础本身是从 A 派生的。很大程度上取决于这个新方法是否应该构成 A 的公共接口的一部分以及该接口是否是抽象的。在将接口公开之前,这种重构是很常见的。 SOLID 可能需要在首字母缩略词中添加另一个字母:P 代表“选择你的战斗”,以强调设计是妥协的事实。阅读更多:martinfowler.com/ieeeSoftware/protectedVariation.pdf 虽然这很老,我认为你应该考虑添加一个新功能不会改变旧功能,所以打开关闭原则就可以了,你不是在修改旧代码,你是添加新的以扩展现有类 【参考方案1】:

你没有水晶球,你看不到未来并预测会发生变更请求。

但是一旦提出变更请求,该领域的另一项变更很可能稍后会发生。

让我们以评论中的汽车为例:在收到所有汽车到现在按喇叭的更改请求的那一刻,您应该考虑是否稍后会再进行此类更改。假设您认为这是一个很好的机会,它只有一件事,那就是重构以使整个情况开放以供扩展而封闭以供修改。因此,现在不仅可以轻松添加鸣喇叭,而且您可以轻松添加下一个此类功能。

您说得对,过早地应用它会使代码膨胀,并且在代码审查期间它还会收到大量YAGNI cmets。

【讨论】:

“在选择需要扩展的代码区域时要小心;在任何地方都应用开闭原则是浪费、不必要的,并且可能导致复杂、难以理解的代码。”弗里曼,埃里克;罗布森,伊丽莎白;贝茨,伯特;凯西塞拉 (2004-10-25)。 Head First 设计模式(Kindle 位置 1588-1589)。奥莱利媒体。 Kindle 版。【参考方案2】:

似乎使用开放式/封闭式方法,您最终会构建一个 子类的不必要的级联层次结构仅仅是因为一个 不允许对原代码进行改动。这是一个 正确的假设/理解?

不,我不认为遵循开放/封闭原则会导致子类的级联层次结构。

首先,它只是一个原则或目标。有时,即使对于 SOLID 爱好者来说,向基类添加方法显然是“正确”的方法。

其次,基类中的许多方法(显然会导致更改)一开始就有点代码味道。你看过“favour composition over inheritance”这个短语吗?

【讨论】:

我认为组合优于继承适用于这种情况......假设:Class Car Drive() Brake() Class Corvette : Car CruiseControl() Class Honda : Car DeployAirbag() 新业务要求所有汽车都能按喇叭。这适用于两辆车。这不是对象或组合,它只是将共享方法行为添加到层次结构中。需要编辑 Car 以考虑 Honk() 以避免代码重复。 @roger 的建议是添加一个中间类以避免修改,这似乎会造成我所指示的级联/代码膨胀效果。

SOLID - 单一职责原则和开放/封闭原则是不是相互排斥?

】SOLID-单一职责原则和开放/封闭原则是不是相互排斥?【英文标题】:SOLID-aretheSingleResponsibilityPrincipleandtheOpen/ClosedPrinciplemutuallyexclusive?SOLID-单一职责原则和开放/封闭原则是否相互排斥?【发布时间】:2018-03-0915:46:18【问题描述... 查看详情

使用泛型实现开放封闭原则

】使用泛型实现开放封闭原则【英文标题】:Implementingopenclosedprincipleusinggenerics【发布时间】:2016-10-0508:10:46【问题描述】:我是使用SOLID的新手,所以请原谅我缺乏正确的术语,请纠正我,如果需要,我希望学习:-)我正在升级... 查看详情

开放/封闭原则是不是说我们不能更改类的接口?

】开放/封闭原则是不是说我们不能更改类的接口?【英文标题】:DoesOpen/ClosedPrinciplesaythatwecan\'tchangedinterfacesofourclasses?开放/封闭原则是否说我们不能更改类的接口?【发布时间】:2016-04-0306:49:16【问题描述】:请看这堂课:publ... 查看详情

day21接口类和抽象类,隔离原则,开放封闭原则,多态(代码片段)

...题权威通用#java#面向对象#java不能多继承#编程原则#python#开放封闭原则#开放对扩展是开放的#封闭对修改是封闭的#依赖倒置原则#接口隔离原则#已经写完的程序代码是不允许修改的##支付功能的例子 查看详情

Objective C 类别 vs 开放/封闭原则

】ObjectiveC类别vs开放/封闭原则【英文标题】:ObjectiveCCategoryvsopen/closedprinciple【发布时间】:2011-04-2115:21:33【问题描述】:根据Open/Closed原则。..软件实体(类、模块、函数等)应该对扩展开放,对修改关闭那么我可以说类别严重... 查看详情

我是不是违反了“开放/封闭”原则?

】我是不是违反了“开放/封闭”原则?【英文标题】:AmIviolatingthe"open/closed"principle?我是否违反了“开放/封闭”原则?【发布时间】:2016-05-0418:38:08【问题描述】:场景:我将一些信息(例如双精度数组)存储在类字段... 查看详情

开放/封闭原则 OO 类设计

】开放/封闭原则OO类设计【英文标题】:Open/ClosedPrincipleOOclassdesign【发布时间】:2014-09-2014:10:56【问题描述】:我正在尝试为在加权图上运行的库找出类设计。可以在这个图上执行各种算法,例如,找到两个节点之间的最短距离... 查看详情

开放/封闭原则和单一职责——图表

】开放/封闭原则和单一职责——图表【英文标题】:Open/ClosedPrinciple&SingleResponsibilty--Graphs【发布时间】:2016-09-1418:07:25【问题描述】:我正在编写一个Graph探索程序,但遇到了一些绊脚石。我的图表由Vertex和NetworkLink对象组成... 查看详情

如何确保我正在实施开放/封闭原则?

】如何确保我正在实施开放/封闭原则?【英文标题】:HowcanImakesureI\'mimplementingtheOpen/Closedprinciple?【发布时间】:2014-06-1222:32:55【问题描述】:假设我有一个名为Shape的基类,我希望每个形状都能够返回它们自己的区域。我可以... 查看详情

这是开放/封闭原则吗?如果不

】这是开放/封闭原则吗?如果不【英文标题】:IsthistheOpen/Closedprinciple?Andifnot【发布时间】:2011-05-2519:33:34【问题描述】:考虑以下代码publicinterfaceIEntityintIdget;set;publicclassUser:IEntitypublicintIdget;set;publicabstractclassRepositoryBase<TEntit... 查看详情

C#重新抽象是不是违反了开放/封闭原则?

】C#重新抽象是不是违反了开放/封闭原则?【英文标题】:DoesC#re-abstractingviolatetheopen/closedprinciple?C#重新抽象是否违反了开放/封闭原则?【发布时间】:2015-08-2902:40:16【问题描述】:作为一名将自己介绍给C#的Java程序员(初学者... 查看详情

设计模式--开放封闭原则

开放封闭原则开放-封闭原则:是说软件主题可以扩展但是不可修改。特点:对于扩展是开放的,对于更改是封闭的。在做系统是不可能做到一开始就确定了所有需求,以后不会变化的。只能在需求来临时,做尽量少的更改,不... 查看详情

OCP(开放封闭原则)与 IoC(控制反转)有啥关系?

】OCP(开放封闭原则)与IoC(控制反转)有啥关系?【英文标题】:HowisOCP(Openclosedprinciple)relatedtoIoC(InversionofControl)?OCP(开放封闭原则)与IoC(控制反转)有什么关系?【发布时间】:2019-08-1911:32:58【问题描述】:我能想到的一... 查看详情

开放封闭原则(openclosedprinciple)

开放封闭原则(OpenClosedPrinciple)在面向对象的设计中有很多流行的思想,比如说"所有的成员变量都应该设置为私有(Private)","要避免使用全局变量(GlobalVariables)","使用运行时类型识别(RTTI:RunTimeTypeIdentification,例如dynami... 查看详情

当您的对象可以是实例列表时,Python 开放封闭原则?

】当您的对象可以是实例列表时,Python开放封闭原则?【英文标题】:PythonOpenClosedPrinciplewhenyourobjectscouldbealistofinstances?【发布时间】:2019-07-1818:52:05【问题描述】:我有许多可以“jsonify”的不同对象,这些是自定义对象类型:c... 查看详情

开放-封闭原则

...改,但可以扩展的思想也是最重要的一种设计原则,就是开放-封闭原则(TheOpen-ClosedPr 查看详情

charpter04开放-封闭原则

开放封闭原则简介开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。这个原则其实是有两个特征,一个是说,“对于扩展是开放的(Openforextension)”,另一个是说“对于更改是封闭... 查看详情

面向对象原则之一开放封闭原则(开闭原则)

原文:面向对象原则之一开放封闭原则(开闭原则)前言面向对象有人分为五大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭... 查看详情