问题标签 [open-closed-principle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
682 浏览

oop - ISP和OCP有什么区别?

我不明白接口隔离原则和开放/封闭原则之间有什么区别。

我的理解是,ISP 必须使一切都依赖于接口和类上的 OCP,我看到它们都可以以相同的方式实现,但一种是接口,另一种是类。

0 投票
1 回答
61 浏览

oop - OOP - 事件可以而且应该成为抽象的一部分吗?

想象一下,我有一个对象系统,它们是事件发射器,也可以监听其他对象中的事件。在这个系统中,这些对象主要使用事件在它们之间进行通信。

我想遵循良好的面向对象实践,并且对为我的对象创建抽象感兴趣。我将使用的实际语言并不重要:例如,这些抽象可以是接口或抽象类。

这些抽象定义对象中的方法和属性,但不定义事件名称。新的实现可能会决定抛出全新的事件......确实,您总是使用相同的方法来抛出它们,但是如果您正在创建新的事件名称,我的印象是您在某种程度上违反了开放/封闭原则:我会说这相当于添加新方法。

是否有一种方法可以在该对象遵循的抽象中说明此类对象可以发出的可能事件?

我对这在 Java、C++、Javascript 和 Typescript 等语言中的工作方式很感兴趣。我不完全确定,因为我不了解 C#,但我认为在那种语言中,事件可以成为接口的一部分。但我感兴趣的是,您将如何使事件成为那些不以直接方式支持的其他语言的抽象的一部分。

0 投票
2 回答
586 浏览

c# - 工厂模式、开闭原则、接口和泛型

我试图根据开闭原则重构一些代码,但在应用设计模式时,我似乎无法正确获得以下类。(对于下面列出的许多课程,我深表歉意——我已经尽可能地减少了它们,但其余的需要向您展示我的设计)。

该设置由以下类组成:

此外PtpPort,我有PonPort,它也实现IInternetPort,而CatvPort只是实现IPort

已经在这段代码中,我认为有代码气味的迹象。在CreatePortin 中PtpPortFactory,漂亮的事情是它接受PtpPortDetails(继承自PortDetails)而不是强制转换。但是,如果这样做,我将无法创建一个PonPortFactory也实现的IPortFactory,因为这些端口需要PonPortDetails. 或CatvPortFactory就此而言。

当我使用端口工厂时,会出现另一种代码异味:

我真的很想不必从 to 做沮丧IPortIInternetPort而只是有CreatePort回报IInternetPort

理解上述内容所需的最后一点信息可能是以下类(基于Jimmy Bogards Enumeration类):

我真的希望有人能一路帮助我(我尝试过引入泛型,但似乎总是遇到 C# 不支持返回类型协变的障碍)。

此外,任何其他帮助我编写更好代码的技巧将不胜感激。

更新

由于评论请求,我在下面添加了更多代码。

不要被突然之间也有Port类型的事实所迷惑。这是另一个有界上下文中的聚合(在 DDD 的意义上)。该算法需要将 的列表作为输入IInternetPort,因为它在内部使用该方法OfCapability来选择一个端口。但是,当算法选择了正确的端口时,我们只对 感兴趣Id,因此返回类型只是一个IPort

0 投票
1 回答
133 浏览

java - Java开闭原理设计

我正在准备面向对象建模和设计的考试,但无法弄清楚这个问题。

设计违反开闭原则;你不能在不修改类的情况下添加更多的 JButton。重做设计,使之成为可能。设计应包含三个按钮和事件管理。避免重复代码。用类图展示新设计。

0 投票
2 回答
245 浏览

testing - 在不违反 SRP、OCP、DRY 的情况下编写测试

我试图更好地理解这三个原则。

我的问题是……如何在不违反 SRP、OCP 和 DRY 的情况下编写测试?

由于测试文件中的代码相似,我当前的设计违反了 DRY。

我无法将测试文件合并在一起,因为这将违反打开/关闭原则。(以后增加更多模块的概率很大)

我在这里缺少什么吗?如果有帮助,我正在为此使用 Ruby 和 Minitest。

模块文件

a.rb:

b.rb:

测试文件

a_test.rb:

b_test.rb:

0 投票
1 回答
98 浏览

c# - 如何加载函数从配置文件 - 工厂模式 - 打开关闭主体

下面是我的工厂类:

这就是我向这家工厂注册各种批量工作的方式:

为了遵循 Open Closed 主体,我想将所有这些寄存器条目存储到配置文件中,并希望从配置中加载它。因此,每当我添加一个新的批量作业时,我都不需要修改上面的代码行。

请建议我怎样才能做到这一点。

0 投票
3 回答
3576 浏览

oop - “开放扩展,封闭修改”的原则有意义吗?

在我看来,Bob Martin 需要以 O 开头的东西来制作 SOLID,并在一些旧书中找到了这个(可能没用的)开放/封闭原则。

Open/Closed 如何与 Single Responsibility 共存,这表明一个类应该有一个单一的改变理由?

如果我想在一个长寿系统中遵循 Open/Closed,我是否应该拥有数十/数百个课程链,每个课程都扩展了前一个?

0 投票
2 回答
645 浏览

java - Java中开闭原理的应用

我尝试理解 SOLID 原理,因此实现了一些 java 代码片段。我现在关心的是OCP。有以下样品,

我怎样才能创建合适的面包店。假设一位顾客来到面包店并说:“请给我两个蛋糕!”,那么我如何实例化 CakeBakery。当然,我可以创建一个抽象工厂,例如:

但我不想使用 switch 或 if 语句。还有其他可能性还是我的理解完全错误?

0 投票
0 回答
129 浏览

java - 是什么导致 RTTI 违反开闭原则?

供您参考,开闭原则(OCP):https ://www.cs.utexas.edu/users/downing/papers/OCP.pdf

所以我几乎完成了我的 OOP 课程,我对 OCP 以及 RTTI 违反它的原因有疑问。我有一个想法,但我只是想确保我是正确的。

当您使用 RTTI 来推断某些东西是否属于基类(超类型)类型时,RTTI不会equals(o: Object)使 OCP 原理无效,例如在超类中覆盖方法并使用 RTTI 来检查类型o是否相同类型。

是否有类似的情况,RTTI不会使 OCP 无效?

最后,当您在超类型中检查类型的实例时,RTTI是否会使 OCP 无效,从而修改超类型的源代码并使 OCP 无效(显然没有关闭以进行修改)?

0 投票
1 回答
81 浏览

c# - 将参数中的字段传递给外部方法调用是否违反了打开/关闭原则?

在下面的代码中,将私有成员 ,_field作为class Foo外部方法参数 ( Bar.DoSomething(_field)) 传递是否违反了SOLID 编程实践中的打开/关闭原则?

在面向对象编程中,开放/封闭原则指出“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”;也就是说,这样的实体可以允许其行为被扩展而无需修改其源代码。

据我了解,实体应该对扩展开放,但对修改关闭。但是,在这种情况下,在and is_field的构造函数中设置一次。将私有成员传递给外部方法的参数是否违反了开放/封闭原则或其他一些最佳实践?Fooreadonly