# 设计原则与思想 --- 对扩展开放、修改关闭(开闭原则OCP)

简介: # 设计原则与思想 --- 对扩展开放、修改关闭(开闭原则OCP)

1.如何理解“对扩展开放、修改关闭”?



SOLID 原则并非单纯的 1 个原则,而是由 5 个设计原则组成的,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,依次对应 SOLID 中的 S、O、L、I、D 这 5 个英文字母。


开闭原则的英文全称是 Open Closed Principle,简写为 OCP。它的英文描述是:software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification。我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”.


添加一个新的功能,应该是通过在已有代码基础上扩展代码(新增模块、类、方法、属性等),而非修改已有代码(修改模块、类、方法、属性等)的方式来完成。


关于定义,我们有两点要注意。第一点是,开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。第二点是,同样的代码改动,在粗代码粒度下,可能被认定为“修改”;在细代码粒度下,可能又被认定为“扩展”。


2. 如何做到“对扩展开放、修改关闭”?



我们要时刻具备扩展意识、抽象意识、封装意识(偏顶层的指导思想)。在写代码的时候,我们要多花点时间思考一下,这段代码未来可能有哪些需求变更,如何设计代码结构,事先留好扩展点,以便在未来需求变更的时候,在不改动代码整体结构、做到最小代码改动的情况下,将新的代码灵活地插入到扩展点上。


很多设计原则、设计思想、设计模式,都是以提高代码的扩展性为最终目的的。特别是 23 种经典设计模式,大部分都是为了解决代码的扩展性问题而总结出来的,都是以开闭原则为指导原则的。最常用来提高代码扩展性的方法有:多态、依赖注入、基于接口而非实现编程,以及大部分的设计模式(比如,装饰、策略、模板、职责链、状态)。


3. 讨论区记录



@下雨天

对拓展开放是为了应对变化(需求),对修改关闭是为了保证已有代码的稳定性;最终结果是为了让系统更有弹性!


@辣么大

开闭原则:基于接口或抽象实现“封闭”,基于实现接口或继承实现“开放”(拓展)。通过“抽象-具体”体现了开闭原则,增加了软件的可维护性。


@Kingram

为什么要遵循开闭原则?


1、修改原有复杂的业务代码本来就存在一定的风险,同时耗费精力,可能影响到别的你不知道的地方,导致程序运行故障。


2、修改代码同时单元测试也要跟着修改,浪费时间精力。


3、可扩展性差的代码同时封装性也会差,违背面向对象设计原则。

补充:但是注意不要过度设计呦

相关文章
|
缓存 人工智能 并行计算
diffusers SD推理加速方案的调研实践总结(1)
diffusers SD推理加速方案的调研实践总结
619 13
C++ 中 ifstream读取txt文件内容
C++ 中 ifstream读取txt文件内容
1714 0
C++ 中 ifstream读取txt文件内容
|
SQL Java 数据库连接
深入探索MyBatis Dynamic SQL:发展、原理与应用
深入探索MyBatis Dynamic SQL:发展、原理与应用
|
前端开发 JavaScript 容器
第九章(应用场景篇)Qiankun微前端深度解析与实践教程
第九章(应用场景篇)Qiankun微前端深度解析与实践教程
1003 0
|
缓存 Java 开发者
一文详解Spring Bean循环依赖
本文主要梳理了Spring解决bean循环依赖的思路。
44014 31
|
存储 缓存 资源调度
Monorepo,大型前端项目管理模式实践
阅读本文您将了解到:什么是 monorepo、为什么要 monorepo、如何实践 monorepo。
9031 50
Monorepo,大型前端项目管理模式实践
|
关系型数据库 数据库 数据格式
全文检索技术--理论篇
全文检索技术 什么是全文检索技术? 数据分类,一共分为两种:结构化数据和非结构化数据 通俗上讲,做开发的同学应该对结构化的数据已经非常的了解。
4357 0
|
存储 人工智能 算法
极智AI | 一文看懂winograd卷积加速算法
本文详细解释了 winograd 算法加速卷积的实现原理。
1681 1
|
Prometheus 监控 Kubernetes
站点可靠性工程 SRE 最佳实践 -- 黄金监控信号
站点可靠性工程 SRE 最佳实践 -- 黄金监控信号
672 0