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

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

相关文章
|
消息中间件 供应链 前端开发
如何开发WMS系统中的销售管理板块(附架构图+流程图+代码参考)
仓库管理系统(WMS)中的销售管理模块是企业高效处理订单、发货及退货的关键环节。本文详解该模块的功能设计、业务流程、开发技巧与实现效果,并提供代码示例,助力企业打造高效销售管理体系。
|
SQL 关系型数据库 API
MCP Server 的开发实践- Alibaba Cloud RDS OpenAPI MCP Server
本文介绍了基于阿里云 RDS OpenAPI 实现的 MCP Server(Model Context Protocol Server)架构与开发实践。该中间件使大语言模型(LLM)可通过自然语言调用 RDS 服务,实现数据库实例的创建、查询、配置等操作。通过 OpenAPI 接入、SQL 执行与大模型交互三大模块的协同工作,MCP Server 实现了 AI 助手对云数据库的自动化管理,提升易用性与安全性。
796 0
|
自然语言处理 JavaScript 开发者
跟随通义灵码一步步升级vue2(ts)项目到vue3版本
本文介绍了如何将基于 TypeScript 的 Vue 2 项目升级到 Vue 3。主要内容包括:依赖升级、配置文件调整、组件代码迁移、状态管理迁移以及优化策略迁移。文章提供了详细的步骤和示例代码,帮助开发者顺利完成升级。特别推荐使用通义灵码工具来加速组件和状态的转写过程。
1442 7
C++ 中 ifstream读取txt文件内容
C++ 中 ifstream读取txt文件内容
1864 0
C++ 中 ifstream读取txt文件内容
|
前端开发 JavaScript 容器
第九章(应用场景篇)Qiankun微前端深度解析与实践教程
第九章(应用场景篇)Qiankun微前端深度解析与实践教程
1289 0
|
机器学习/深度学习 编解码 人工智能
一文尽览 | 计算机视觉中的鱼眼相机模型及环视感知任务汇总!(下)
环视鱼眼摄像机通常用于自动驾驶中的近距离感知,车辆四面的四个鱼眼摄像头足以覆盖车辆周围的360°范围,捕捉整个近距离区域。一些应用场景包括自动泊车、交通拥堵辅助等
一文尽览 | 计算机视觉中的鱼眼相机模型及环视感知任务汇总!(下)
|
数据安全/隐私保护
PNotes – 目前最优秀的桌面便签软件 - imsoft.cnblogs
Pnotes: 下载链接: http://pan.baidu.com/s/1o6FK4SM 密码: n7il 便携版,包含中文语音包,包含十几种合适的皮肤。 更多信息:小众软件 http://www.appinn.com/pnotes/
1358 0
|
SQL 缓存 搜索推荐
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表结构保持最新。
2073 0
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
|
数据可视化 定位技术 API
探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面
探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面
2206 0
|
SQL Java 数据库连接
深入探索MyBatis Dynamic SQL:发展、原理与应用
深入探索MyBatis Dynamic SQL:发展、原理与应用

热门文章

最新文章