本文档解释了开放/封闭原则(OCP),SOLID 原则中的第二条原则,及其在 JavaScript 中的应用。开放/封闭原则指出,软件实体应“对扩展开放,对修改关闭”。本页面涵盖了针对 JavaScript 的实现模式、示例和最佳实践。有关其他 SOLID 原则的信息,请参阅 SOLID 原则或具体原则:单一职责原则、里氏替换原则、接口隔离原则和依赖倒置原则。
开放/封闭原则最初由 Bertrand Meyer 提出,它指出:
软件实体(类、模块、函数等)应“对扩展开放,对修改关闭”。
这意味着:
在 JavaScript 中,由于该语言的动态特性以及缺乏严格的接口或类型检查,该原则尤为重要。
在 JavaScript 中,开放/封闭原则可以通过多种技术来实现:
README 提供了一个关于 OCP 违规和纠正的绝佳示例,涉及 HTTP 请求适配器。
在有问题的实现中,HttpRequester 类直接检查适配器的名称属性,并为每种适配器类型包含不同的逻辑。
这违反了开放/封闭原则,因为:
fetchAdapter),我们需要修改 HttpRequester 类。HttpRequester 必须了解每种适配器的实现细节。HttpRequester。改进后的实现通过让每个适配器实现一个通用接口来遵循 OCP。
此设计遵循 OCP,因为:
HttpRequester 已关闭修改——添加新适配器时无需更改它。request 方法的新类来添加新适配器。在 JavaScript 中,在不修改基类行为的情况下扩展类是一种常见的 OCP 模式。
来源:README.md1441-1447 README.md1494-1527
策略模式是 JavaScript 中实现 OCP 的另一种方式。
此模式允许在不修改上下文类的情况下添加新策略,类似于上面的 HTTP 适配器示例。
要有效地应用开放/封闭原则于 JavaScript,请注意以下几点:
| 反模式 | 更好的方法 |
|---|---|
| 带 if/else 分支的类型检查 | 多态方法 |
| 硬编码的依赖项 | 依赖注入 |
| 直接修改现有类 | 通过继承或组合进行扩展 |
| 组件之间的紧耦合 | 通过接口实现松耦合 |
| 基于类型的 switch 语句 | 策略模式 |
来源:README.md1441-1447 README.md1494-1527
开放/封闭原则与其他 SOLID 原则协同工作。
在 JavaScript 中实现 OCP 存在一些独特的挑战:
来源:README.md1441-1447 README.md1494-1527
开放/封闭原则是一项基本的设计指南,有助于创建更易于维护和更灵活的 JavaScript 代码。通过设计对扩展开放但对修改关闭的组件,您可以:
遵循 OCP 需要一些初步的设计工作,但从长远来看,通过提高代码稳定性和适应性,它会带来丰厚的回报。