# 设计原则与思想 --- 对扩展开放、修改关闭(开闭原则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、可扩展性差的代码同时封装性也会差,违背面向对象设计原则。

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

相关文章
|
运维 监控 数据可视化
GCeasy使用
GCeasy使用
|
Java Maven
Maven国内镜像配置
Maven国内镜像配置
20111 1
|
容器
springboot-自定义注解拦截ip aop和ioc
springboot-自定义注解拦截ip aop和ioc
|
Go Java
mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。   为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。
4652 1
|
前端开发 JavaScript Java
Swagger-UI 介绍及基本使用指南
Swagger-UI 介绍及基本使用指南
14995 2
Swagger-UI 介绍及基本使用指南
|
Prometheus 监控 Kubernetes
站点可靠性工程 SRE 最佳实践 -- 黄金监控信号
站点可靠性工程 SRE 最佳实践 -- 黄金监控信号
500 0
|
Java Maven
Mac安装Maven(图文解说详细版)
Mac安装Maven(图文解说详细版)
Mac安装Maven(图文解说详细版)
|
消息中间件 缓存 监控
四个步骤,教你落地稳定性保障工作
本文将稳定性保障工作归纳为 梳理异常情况->配置监控告警->评估影响面->预定解决方案 四个步骤。从四个步骤详细介绍稳定性保障工作的落地方法。
50140 1
四个步骤,教你落地稳定性保障工作
|
开发工具
STM32第六章-定时器详解
定时器(Timer)最基本的功能就是定时了,比如定时发送 USART 数据、定时采集 AD数据等等。如果把定时器与 GPIO 结合起来使用的话可以实现非常丰富的功能,可以测量输入信号的脉冲宽度,可以生产输出波形。定时器生产 PWM 控制电机状态是工业控制普遍方法,这方面知识非常有必要深入了解。
488 0
STM32第六章-定时器详解
|
SQL 关系型数据库 MySQL
一次并发插入死锁带来的 MySql 锁知识点整理 |牛气冲天新年征文
最近遇到一个由于唯一性索引,导致并发插入产生死锁的场景,在分析死锁产生的原因时,发现这一块还挺有意思的,涉及到MySql中不少的知识点,特此总结记录一下
1393 0
一次并发插入死锁带来的 MySql 锁知识点整理 |牛气冲天新年征文