当前位置: 首页 > news >正文

OCP开闭原则

OCP,software entities(modules,classes,functions,etc.)should be openfor extension, but closed for modification.

软件实体(模块、类和方法等)应该对扩展开发,对修改关闭。

OCP特点

提高可扩展性:新功能通过添加新的类或模块来实现,而不是修改已有的代码,使得系统更容易扩展和维护。

示例代码

不符合OCP的代码

public class FinancialReporter {  public FinancialReport show(ReportRequester) {  //  }
}

使用 OCP 优化后的代码

public interface FinancialReportPresenter {  FinancialReport show(ReportRequester);  
}  public class ScreenPresenter implements FinancialReportPresenter {  public FinancialReport show(ReportRequester) {  // }  
}  
public class PrintPresenter implements FinancialReportPresenter {  public FinancialReport show(ReportRequester) {  //   }  
}  

实现开闭原则的方法

开闭原则就是解决代码的扩展性问题。为了实现代码的扩展性,我们需要扩展意识、抽象意识和封装意识。在详细设计时,我们需要思考:对于这个功能点,未来可能有哪些需求变更,从而预留扩展点

我们通过多态、依赖注入、基于接口而非实现编程等思想和方法提高代码扩展性。

在设计模式中,策略、适配器、观察者和模板方法模式实践开闭原则。

注意事项

对于短期内可能进行的扩展,需求变更对代码结构影响比较大的扩展,或者实现成本不高的扩展,我们可以事先进行可扩展性设计。其他情况的扩展性设计,都可以等到需要的时候,重构当前代码提高可扩展性。

代码的扩展性与代码的可读性是有冲突的。因此在项目上,要根据项目、团队等情况,综合平衡扩展性和可读性。

不允许修改一行代码?

对于同一个修改,在不同层次,可以是修改,也可以是扩展。例如,在用户类中,添加地址属性。在属性层次是扩展,在类层次,是修改。结论是,不破坏原有代码的正常运行和原有的单元测试,即可认为满足未修改代码。

尽量让修改操作集中在上层代码中,让核心、通用的代码满足开闭原则。这也是DDD设计的原则。

OCP与架构设计

OCP是系统架构设计的主导原则,因此没有按照SOLID顺序进行介绍,而是第一个原则进行说明。主要目标是让系统易扩展,同时限制每次修改所影响的范围。实现方式是通过将系统划分为一系列组件,并且将这些组件间的依赖关系按层次结构进行组织,使得高阶组件不会因低阶组件被修改而受到影响。

参考

《架构整洁之道》-- Robert C.Mattin

《设计模式之美》-- 王争

http://www.xdnf.cn/news/374509.html

相关文章:

  • Xilinx Kintex-7 XC7K325T-2FFG676I 赛灵思 FPGA
  • Kubernetes生产实战(十六):集群安全加固全攻略
  • Visual Studio 2022 远程调试
  • 【字符函数和字符串函数】
  • 类加载机制详解:双亲委派模型与打破它的方式
  • 服务器机架的功能和重要性
  • 遗传算法组卷系统实现(Java版)
  • Linux平台下SSH 协议克隆Github远程仓库并配置密钥
  • Unity.UGUI DrawCall合批笔记
  • Unity Shaders and Effets Cookbook
  • LeetCode 热题 100 138. 随机链表的复制
  • 关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测
  • 数学相关使用笔记
  • libbpf.c:46:10: fatal error:‘libelf.h file not found
  • SpringCloud之Eureka基础认识-服务注册中心
  • 使用lldb查看Rust不同类型的结构
  • Java与Go语言对比教程
  • 【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术
  • Python_day21
  • 深度学习中的目标检测:从 PR 曲线到 AP
  • 常见音频主控芯片以及相关厂家总结
  • SSM框架整合MyBatis-Plus的步骤和简单用法示例
  • LLM大模型入门知识概念
  • 小米创业思考——阅读小记
  • MySQL 中如何进行 SQL 调优?
  • 数据库连接池
  • 04 mysql 修改端口和重置root密码
  • 图像处理篇--- HTTP|RTSP|MJPEG视频流格式
  • MindSpore框架学习项目-ResNet药物分类-模型优化
  • 对话 BitMart 新任 CEO Nenter (Nathan) Chow:技术创新、全球扩张和社区赋能