问题标签 [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 回答
778 浏览

c# - 超越开闭原则

我有一个简单的程序,它根据用户提供的鼠标数据绘制几何图形。我有一个处理鼠标跟踪的类(它获取带有鼠标移动历史的列表)和一个名为 Shape 的抽象类。从这个类中,我派生了一些额外的形状,如圆形、矩形等——它们中的每一个都覆盖了抽象的 Draw() 函数。

这一切都很好,但是当我希望用户能够手动切换所需的形状时问题就来了。我得到了鼠标数据,我知道我应该画什么形状。问题是如何让代码“知道”它应该创建哪个对象并将适当的参数传递给构造函数。此时也无法添加新的 Shape 导数,这显然是错误的。

我显然不想提供如下代码:

上面的代码显然违背了开闭原则。问题是我不知道如何克服它。主要的问题是不同的Shape有不同参数的构造函数,这就麻烦多了。

我很确定这是一个常见问题,但我不知道如何解决它。你有什么想法吗?

0 投票
1 回答
1702 浏览

java - 使用 Google Guavas Predicates 将过滤器方法与类分离是一个好的设计吗

今天我在我的博客中写了以下文章,介绍如何使用 Google Guavas Predicates 来增加设计的可扩展性。这让我问自己以下问题:“对这个解决方案的需求是由更深层次的设计缺陷引起的吗?”。是否有另一种“更清洁”的方式来实现这种可扩展性?我只是想得太深了吗?

0 投票
2 回答
480 浏览

java - 访问者模式与开放/关闭原则:如何添加新的可访问对象?

我正在研究访问者模式,我想知道这种模式与开放/封闭原则有何关系。我在几个网站上读到“这是遵循开放/封闭原则的一种方式。 ”(引自维基百科)。

另一个网站上,我了解到这是遵循开放/封闭原则的方式,以便可以轻松地将新访问者添加到您的程序中,以便“在不更改现有代码的情况下扩展现有功能”。同一个网站提到这种访问者模式有一个主要缺点:“如果将一个新的可访问对象添加到框架结构中,则所有实现的访问者都需要修改。 ”使用 Java 的反射框架提供了解决此问题的方法。

现在,这个解决方案不是有点像黑客解决方案吗?我的意思是,我也在其他一些博客上找到了这个解决方案,但是代码看起来更像是一种解决方法!

对于向访问者模式的现有实现添加新可访问对象的问题,是否有另一种解决方案?

0 投票
1 回答
95 浏览

design-patterns - 你还有没有 OCP 的策略模式吗?

我今天参加了关于设计模式的考试。有一个问题我不知道答案,我很好奇。

对或错

我问教授他所说的“关键”是什么意思,并澄清:“没有OCP,你还有策略模式吗?”

你们有什么想法吗?

0 投票
5 回答
3854 浏览

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

DIP 指出:

  • 高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
  • 抽象不应依赖于细节。细节应该取决于抽象。

OCP 规定:

软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

我认为如果我们满足 DIP,它也会涵盖 OCP,那么,为什么我们将这两个原则分开?

0 投票
1 回答
178 浏览

javascript - 切换打开关闭必须在手机上单击两次

我有一个简单的切换事件,在桌面上一切正常,但是当我去电话时,我必须点击两次才能让它打开?

这是我所拥有的:

这里还有一个指向 jsfiddle http://jsfiddle.net/BrentRansom/tfM6E/1/的链接

谢谢

0 投票
1 回答
415 浏览

java - 方法覆盖:相同的参数列表类型(或兼容类型)?

在我用来准备新的 Oracle Certified Professional - Java SE7 Programmer 考试的书中,在处理方法覆盖的部分中,我遇到了以下内容:

覆盖方法应具有与基本版本相同的参数列表类型或兼容类型)。

“兼容类型”是什么意思?我的意思是,只要参数列表类型不同,您就会重载,而不是覆盖。

我只能想到用一个采用相同类型的数组的方法来覆盖一个采用可变参数的方法。编译器发出警告,但仍然编译。

兼容类型是什么意思?这是书上的错误吗?

0 投票
1 回答
149 浏览

design-patterns - 如何尊重原始参数的开/关原则?

为了尊重打开关闭原则,添加参数对象而不是原语是一种很好的模式吗?

假设我有这个界面

如果有一天我需要添加一个参数,我将不得不更改我的界面。有了这个解决方案

我可以在不接触界面的情况下添加任意数量的参数,并且我将能够使用新参数创建 IBar 的新实现。

是反模式吗?

0 投票
2 回答
1934 浏览

java - 为什么枚举中的静态和实例初始化块的行为与类中的不同

在学习 Java 认证测试时,我了解到静态初始化块在加载类时运行一次,按照在源代码中出现的顺序,实例初始化块在每次创建实例时运行,而构造函数中的代码每次运行之后创建一个实例。为了测试我创建了一个带有一些静态和实例初始化块的类以及一个带有打印内容的构造函数。一切都按预期工作——除了我认为“加载”只是在运行时,但我猜它会在创建第一个实例时发生,因为除非我创建至少一个类的实例,否则我根本不会得到任何输出。然后我用枚举尝试了同样的操作,订单全部关闭。首先,初始化块在代码中第一次引用枚举时为枚举所具有的每个值运行一次,其次——标记为静态的初始化块在我认为是实例初始化块之后运行!这与我的预期相反。这是我的问题的细分。

  1. 为什么标记为静态的初始化块在枚举中最后运行?
  2. 枚举可以有实例初始化块吗?
  3. 为什么我认为是实例初始化块的块在加载枚举时只运行一次,而不是每次引用新的枚举值时?
  4. 类静态初始化块在“加载”类时运行。加载是什么意思?在类中实例化对象时是否只发生一次?

谢谢!这让我很困惑。

0 投票
7 回答
1154 浏览

java - 为什么封装似乎与开闭原则相矛盾?

在封装中,想法是通过将变量声明为私有来隐藏类对其变量所做的事情,从而实现 OCP。但是,为什么你要添加 getter 和 setter,然后打开你的变量进行修改?

为什么要经历将变量设置为私有的整个麻烦,然后在它们上添加一个公共设置器?这似乎不是很严格,这是封装的思想之一。