深入理解设计原则之开闭原则(OCP)
系列文章目录
C++高性能优化编程系列
深入理解设计原则系列
深入理解设计模式系列
高级C++并发线程编程
OCP:开闭原则
- 系列文章目录
- 1、开闭原则的定义和解读
- 2、如何理解“对扩展开放,对修改关闭”
- 3、实现开闭原则的方法
- 4、如何在团队协作中保证开闭原则的实现?
1、开闭原则的定义和解读
开闭原则(Open Closed Principle, OCP),又称为对扩展开放、对修改关闭原则。开闭原则即是SOLID原则中最难理解、最难掌握的,又是最有用的。
之所以说开闭原则最难理解,是因为“怎样的代码改动才被定义为扩展?怎样代码的改动才被定义为修改 ?怎样才算满足或违反开闭原则?修改代码就一定意味着违反开闭原则吗?等问题都比较难理解。
之所以说开闭原则最难掌握,是因为如何做到对扩展开放,对修改关闭?如何在项目中灵活应用开闭原则,避免在追求高扩展的同时影响代码的可读性等问题都很难掌握。
之所以说开闭原则最有用,是因为扩展性是衡量代码质量的重要标准。在22种经典设计模式中,大部分设计模式都是为了解决代码的扩展性问题而产生的,它们主要遵守的设计原则就是开闭原则。
2、如何理解“对扩展开放,对修改关闭”
软件实体(模块、类方法等)应该“对扩展开放,对修改关闭”,详细表述为:添加一个新功能时应该是在已有的代码基础上扩展代码(新增模块、类方法等),而非修改已有的代码(修改模块、类方法等)
3、实现开闭原则的方法
在编写代码时,我们要多花点时间思考:对于当前这段代码,未来可能有哪些需求变更,如何设计代码结构,事先预留了扩展点,在未来进行需求变更时,不需要改动代码整体结构,新的代码能够灵活地插入到扩展点上,完成需求变更,从而实现代码的最小改动。
以下是一些实现开闭原则的方法:
- 使用抽象类或接口来定义抽象的操作,实现类继承或实现抽象类或接口来实现具体操作。这样,在需要添加新功能时,只需要定义新的实现类,并实现抽象操作即可,而不需要修改已有的代码。
- 利用多态特性,将需要修改的代码和被修改的代码分离开,通过父类或接口操作来隐藏具体实现,从而避免修改已有的代码。
- 使用依赖倒置原则,依赖于抽象而不是具体实现,从而减少代码耦合性,使得在增加新功能时不会影响到其他部分的代码。
- 模块化设计,将不同功能的代码分离开来,通过定义接口之间的依赖关系,使得修改一个模块时不会影响到其他模块的代码。
- 使用设计模式,如策略模式、装饰器模式等,在不修改已有代码的基础上,动态地添加行为或功能。
综上所述,实现开闭原则的关键在于采用抽象、多态、依赖倒置、基于接口而非实现编程等方式,使得软件系统具有良好的扩展性和灵活性,在新需求出现时能够更加容易地进行修改和扩展。并且我们需要时间具备扩展意识、抽象意识、封装意识。
4、如何在团队协作中保证开闭原则的实现?
在团队协作中保证开闭原则的实现,可以考虑以下几点:
- 定期进行代码审查:定期进行代码审查可以帮助团队成员更好地了解彼此代码的实现方式,从而避免代码实现上的冲突以及对开闭原则的违反。
- 将代码拆分成独立的模块:在开发过程中,应该将代码拆分成独立的模块,每个模块应该实现自己独立的功能,同时,每个模块应该遵循开闭原则来保证模块的可扩展性。
- 利用接口和抽象类:在代码设计和实现过程中,可以利用接口和抽象类来实现开闭原则,这样,在需要扩展功能时,只需要实现接口或者抽象类即可,而不需要修改原有的代码实现。
- 利用设计模式:在团队协作中,可以尝试使用常见的设计模式(例如工厂模式、策略模式、观察者模式等)来实现开闭原则,这样可以避免对已有的代码实现进行修改,从而保证代码的可维护性和可扩展性。
以上几点可以帮助团队在协作过程中更好地遵循开闭原则,从而实现代码的可维护性和可扩展性。
相关文章:
深入理解设计原则之开闭原则(OCP)
系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 OCP:开闭原则 系列文章目录1、开闭原则的定义和解读2、如何理解“对扩展开放,对修改关闭”3、实现开闭原则的方法4、如何在团队协作中保证开闭原则的实…...
【学习随笔】
2022/11/13 HTML :讲完了 css:讲完了 作业:编写登陆界面、整理一下sql优化,对于mybatis不熟练的继续练习 关于MySQL优化的问题? 思路总结:主要考虑数据库优化与SQL语句优化。 1,数据库优化,包括存储引擎的优化&…...
【多路IO复用】select
select: 1.select:当被监听的 fd(文件描述符)就绪后会返回,但是我们无法知道具体是哪些 fd 就绪了,只能遍历所有的 fd。通常来说某一时刻,就绪的 fd 并不会很多,但是使用 select 必须要遍历所有…...
cuda编程学习——基础知识介绍!干货向(三)
本文主要内容为介绍CUDA编程前的一些基础知识 参考资料: 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 文章、讲解视频同步更新公众《AI知识物语》,B站:出门吃三碗饭 1:并行计算 并行程序可以分为 指令并行࿱…...
30 VueComponent 事件的绑定
前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 用例如下, 我们这里核心关注 事件的处理流程 问题的调试 整个…...
作用域及作用域链
作用域 隔离变量的集合 作用域最大的用处就是隔离变量,不同作用域内的同名变量不会有命名冲突。 作用域类型 全局作用域,函数作用域和块级作用域。 1)全局作用域,在整个代码文件中都可以访问的作用域。 2)函数作用域…...
深入解析Linux C/C++ 编程中的内存泄漏问题
深入解析Linux C/C 编程中的内存泄漏问题 I. 前言 (Introduction)1.1 文章目的与内容概述 (Purpose and Overview of the Content)1.2 重要性和实用性的说明 (Significance and Practicality Explanation)1.3 数据结构与内存泄漏的基本概念 (Basic Concepts of Data Structure …...
【爬虫第三章】 Python基础
预计更新一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 3…...
电力系统的虚假数据注入攻击和MTD系统研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【阿里云】阿里云OSS对象存储— 开通OSS服务、搭建OSS环境、快速入门
目录 一、开通OSS服务 二、搭建OSS环境 1、创建Bucket存储空间 2. 创建文件夹上传图片 3. RAM 访问控制 三、快速入门 1.下载SDK 2.创建存储空间[可选] 3.上传图片 一、开通OSS服务 二、搭建OSS环境 1、创建Bucket存储空间 选择 Bucket列表,进行Bucket创建…...
代理对象Proxy是什么
Proxy是ES6(ECMAScript 2015)引入的一个特性,它是一种用于创建代理对象的构造函数。代理对象可以用来拦截并自定义对目标对象的操作。 通过使用Proxy,您可以在目标对象上设置各种拦截器(称为"陷阱"…...
会话跟踪cookie和session
什么是会话跟踪技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可能包含多次请求和响应。 会话跟踪:一种维护浏览器状态的方法,服务器需…...
ACS Cent. Sci 2018 | 数据驱动的分子连续表征的自动化学设计
原文标题:Automatic Chemical Design Using a Data-Driven Continuous Representation of Molecules 代码:https://github.com/aspuru-guzik-group/chemical_vae 原文链接:https://pubs.acs.org/doi/10.1021/acscentsci.7b00572 Automatic…...
安卓Termux搭建web服务器【公网远程手机Android服务器】
文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许多基本操作,不需要root权限Termux就…...
【大数据之Hive】二、Hive安装
Hive安装部署(最小化部署) 安装部署Hive(最小化只用于本机测试环境中,不可用于生产环境),并运行。 步骤: (1)把apache-hive-3.1.3-bin.tar.gz解压到/opt/module/目录下&…...
三大特性之多态
文章目录 静态的多态动态的多态虚函数虚函数的重写(覆盖)利用虚函数重写实现多态重写的两个例外1.协变2.析构函数的函数名不同 C11的override和final 重载,重写(覆盖),重定义(隐藏)抽…...
单调队列优化dp
文章目录 单调队列优化dp烽火传递修剪草坪绿色通道琪露诺旅行问题Watching Fireworks is Fun瑰丽华尔兹股票交易 单调队列优化dp 文章首发于我的个人博客:欢迎大佬们来逛逛 单调队列优化dp的建模形式:这是窗口右滑动的情况 对于窗口左滑动的也是同理。…...
【低压配电漏电继电器660V/LLJ-100H/AC220V 中性点漏电保护 JOSEF】
LLJ-F(S)系列漏电继电器 系列型号: LLJ-10F(S)漏电继电器LLJ-15F(S)漏电继电器LLJ-16F(S)漏电继电器 LLJ-25F(S)漏电继电器LLJ-30F(S)漏电继电器LLJ-32F(S)漏电继电器 LLJ-60F(S)漏电继电器LLJ-63F(S)漏电继电器LLJ-80F(S)漏电继电器 LLJ-100F(S)漏电继电器LLJ-120…...
[数据结构习题]栈——中心对称链
[数据结构习题]栈——中心对称链 👉知识点导航💎:【数据结构】栈和队列 👉[王道数据结构]习题导航💎: p a g e 70.4 page70.4 page70.4 本节为栈和链表综合练习题 题目描述: 🎇思路…...
AMD Software Adrenalin Edition 23.5.1驱动发布,快速获取驱动
AMD新驱动赶在五月天发布!AMD Software Adrenalin Edition 23.5.1驱动 ,为部分游戏带来支持,以及为重要的软件带来修复。驱动人生带大家一览AMD WHQL 23.5.1驱动的优化内容。 游戏方面,AMD WHQL 23.5.1主要为游戏《指环王&#x…...
将Taotoken作为统一AI网关整合进企业现有微服务架构的实践思路
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 将Taotoken作为统一AI网关整合进企业现有微服务架构的实践思路 在构建以AI能力驱动的现代应用时,中型及以上的企业常面…...
网盘直链下载助手:九大主流平台高速下载终极指南
网盘直链下载助手:九大主流平台高速下载终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …...
PagerLayoutManager:让Android网格分页布局实现变得简单高效的终极方案
PagerLayoutManager:让Android网格分页布局实现变得简单高效的终极方案 【免费下载链接】pager-layoutmanager [暂停维护]Android 网格分页布局。 项目地址: https://gitcode.com/gh_mirrors/pa/pager-layoutmanager PagerLayoutManager是一款专为Android开发…...
工业级SCADA革命:FUXA零代码可视化平台如何重塑工业监控决策
工业级SCADA革命:FUXA零代码可视化平台如何重塑工业监控决策 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA 在工业4.0和数字化转型浪潮中,传统SCADA…...
Steam Achievement Manager:5分钟掌握游戏成就管理终极技巧
Steam Achievement Manager:5分钟掌握游戏成就管理终极技巧 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager&#x…...
UI-TARS桌面版:用自然语言控制电脑的智能GUI助手终极指南
UI-TARS桌面版:用自然语言控制电脑的智能GUI助手终极指南 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop…...
ESP32嵌入式GUI开发终极指南:使用lv_port_esp32构建专业级单色屏应用
ESP32嵌入式GUI开发终极指南:使用lv_port_esp32构建专业级单色屏应用 【免费下载链接】lv_port_esp32 LVGL ported to ESP32 including various display and touchpad drivers 项目地址: https://gitcode.com/gh_mirrors/lv/lv_port_esp32 在资源受限的ESP32…...
从一次PR被拒说起:我是如何用Git Upstream优雅同步Gitee Fork仓库的
从一次PR被拒说起:我是如何用Git Upstream优雅同步Gitee Fork仓库的 那天下午,当我满怀期待地打开Gitee通知,看到的却是项目维护者冰冷的回复:"PR存在大量冲突,请先同步最新代码"。作为一个刚接触开源贡献的…...
黑龙江移远科技,是懂预算、懂场景、更懂服务的专业服务商
很多人误以为移远科技只是简单卖设备的贸易公司,实则不然。依托全品牌货源优势、极致性价比、五星贴心服务、专属方案定制,企业早已从传统销售商,升级为综合性通讯安防解决方案服务商,全方位解决客户采购难、选型难、售后难、预算…...
机器学习可持续性实践指南:从模型优化到绿色AI的工程落地
1. 项目概述:当机器学习遇见可持续性 在过去的十年里,我亲眼见证了机器学习从实验室的“黑科技”演变为驱动各行各业的核心引擎。从推荐系统到自动驾驶,模型的复杂度和规模呈指数级增长,随之而来的是一个我们无法回避的现实&#…...
