问题标签 [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 投票
4 回答
207 浏览

java - 异常和错误报告顺序

哪些规则适用于以下代码:

资产已启用。

为什么会报 IllegalArgumentException 而不是 AssertionError?是否有适用于这种情况的规则?

编辑: 对不起!在这个例子中应该有 assert ( false )

0 投票
1 回答
206 浏览

wcf - WCF 派生类型和违反 Open/Closed 原则

我有一个在 WCF 服务调用中使用的基类,

我从中派生,每次派生时都必须添加[KnownType(typeof(MyDerivedClass))]属性,并且每次我都违反了开放/封闭原则。反正有没有派生这样的类以在 WCF 中使用,而不必每次都向父类添加属性?

0 投票
1 回答
1891 浏览

oop - “开放/封闭原则”和“依赖倒置原则”有什么区别?

我阅读了有关 SOLID 的文章,但我看不出 OCP 和 DIP 之间有什么区别。看看这个 OCP 的例子:

持有 OCP 的代码也满足 DIP。谁能给我一个包含OCP而不是DIP的代码示例?

0 投票
1 回答
653 浏览

java - 使用 MVP 模式和 OO 原则

我试图在使用 MVP 模式的场景中应用面向对象编程的原则。我有 4 个解决方案,最后两个我更喜欢。然而,大多数解决方案都打破了某些原则,如 SRP、IOC / DIP、开闭原则等。

简而言之,我希望查看者和演示者可以有一个可选的行为。此行为允许查看器拥有一个窗口或包含在一个面板中。在我看来,查看者应该了解 JFrame 和侦听器,当查看者支持所选窗口行为时,窗口演示者应该执行一些额外的操作。

你能帮我找到适合这种情况的最佳设计吗?我相信这些例子会说明需要。

解决方案 1 - 类似适配器

解决方案 2 - 使用继承

解决方案 3 - 使用窗口处理程序

解决方案 4

谢谢

0 投票
1 回答
183 浏览

c# - 如何重构此代码以使其符合 Open-Close 原则?

这个问题实际上来自这个链接。

假设我有这样的问题:


书店购买和销售两种类型的书籍:(1) 非技术类{Title, Author, Price} (2) 技术类{Title, Author, Price, CD}

此外,客户在购买技术书籍时会获得一张 CD。CD 对象定义为 CD {Title, Price}。

一本非技术书籍的价格将只是这本书的价格。一本技术书籍的价格将是书籍和 CD 价格的总和。

创建一个 C# 程序以显示以下信息:


如何在保持开闭原则的同时显示技术书籍和非技术书籍的价格?

派生 Shop-class 没有任何意义。

如果我编写如下代码:

我认为它不会保留 OCP。

那该怎么办?

0 投票
1 回答
5800 浏览

c# - 使验证通用

我有以下 C# 代码。这里的验证被保存在类之外以满足开放-封闭原则。这工作正常。但挑战是——验证不是通用的。它特定于员工类(例如 DateOfBirthRuleForEmployee)。如何使所有对象的验证通用(DateOfBirthRuleForAnyObject)。

注意:Make Generic <==> Make Type-Independent

注意:我也有 NameLengthRuleForEmployee 验证。未来可能会有新的验证。

编辑

通用方法示例:在 LINQ 中使用“OfType”

代码

0 投票
1 回答
659 浏览

c# - 基于类型调用 DAL 方法

我正在开发一个应用程序,我需要根据调用类的泛型类型调用两种数据方法之一。例如,如果 T 是 Foo 类型,我将调用 data.GetFoo():

如果 T 是 Bar 类型,我将调用 data.GetBar():

在此之前,我只需要一个 DAL 方法,因为所有类型都以相同的方式检索。我现在需要调用两种方法之一,具体取决于 T 的类型。

我试图避免这样的事情:

这违反了 OCP。有没有一种优雅的方式来处理这个问题,所以我可以摆脱我的 if 语句?

编辑 - 这就是类型的样子

这些 Foos 和 Bars 是用于 Linq-to-SQL 的 DBML 项。

0 投票
4 回答
134 浏览

c# - 寻找如何实现简单的多态性

我有一个非常基本的问题(我不知道为什么我无法思考)。

我正在尝试做一些多态性。

我的界面如下所示:

我也有一些实现这个接口的插件类

所以我有主类,我希望它调用所有插件

但我希望它保存 OCP(开闭原则),所以如果我将来添加另一个插件类,主类不会改变。

这是主要课程

0 投票
2 回答
145 浏览

design-patterns - 我们如何将 OCP 与委托一起使用?

有很多在继承的帮助下使用 OCP 的示例。但我很困惑我们如何将 OCP 与委派一起使用。任何人都可以分享任何样品吗?

0 投票
3 回答
352 浏览

php - Open/Closed 原则 - 如何调用新版本?

我正在尝试掌握开放/封闭原则(在我的 PHP 案例中,但这并不会真正产生影响)。

我理解它的方式是一个类永远不会开放修改。仅用于错误修复。如果我想向该类添加新代码,那么我必须创建一个新代码并扩展“旧”类。这是我可以添加新代码的唯一方法。

在某种程度上,我可以看到这样做的好处。因为基本上你创建了某种版本控制系统,旧代码总是可以工作,但你也可以随时尝试使用新类。

但这在实践中如何运作?我的意思是,假设我有以下课程:

所以我可能在某个地方实例化了这个类:

但后来我决定在该对象中使用另一种方法是件好事。所以我也可以做点别的。根据 OCP,我无法修改课程。所以我必须创建一个新的,延伸到旧的,对吗?

第一个问题。我如何称呼新班级?因为它实际上并不是一个完整的新对象。喜欢。用户对象是用户对象。我不能仅仅因为它需要另一种方法就突然给它起一个完全不同的名字。无论如何,我创建了新类:

现在这也意味着我必须更改实例化“MyObject”类的代码行并将其替换为“MyNewObject”类,对吧..?如果这在不止一个地方完成,那么我必须搜索我的源代码......(想想控制器类中的一个方法,它几乎总是使用'​​new'关键字来实例化某些类)。

这同样适用于继承。我必须找到继承旧类的每个类,并且必须用新类替换它。


所以基本上我的问题是:

您如何命名具有新方法的新类?只是因为我添加了一些新功能,并不意味着我可以给这个类一个全新的名字......

如果“旧”类是从多个地方实例化(或继承)的呢?然后我必须找到所有这些地方......哪里有收获?