OCP开闭原则

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

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

OCP特点

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

示例代码

不符合OCP的代码

java 复制代码
public class FinancialReporter {  
    public FinancialReport show(ReportRequester) {  
        //  
    }
}

使用 OCP 优化后的代码

java 复制代码
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

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

相关推荐
frank006007120 天前
戴尔 17G 服务器 E610 OCP千兆网卡驱动安装
服务器·网络·开闭原则
进击的CJR21 天前
MySQL 8.0 OCP 英文题库解析(十八)
android·mysql·开闭原则
进击的CJR21 天前
MySQL 8.0 OCP 英文题库解析(十四)
android·mysql·开闭原则
进击的CJR21 天前
MySQL 8.0 OCP 英文题库解析(十五)
数据库·mysql·开闭原则
进击的CJR21 天前
MySQL 8.0 OCP 英文题库解析(十九)
数据库·mysql·开闭原则
进击的CJR1 个月前
MySQL 8.0 OCP 英文题库解析(十)
mysql·adb·开闭原则
博睿谷IT99_1 个月前
Oracle OCP与MySQL OCP认证如何选?
mysql·oracle·开闭原则
进击的CJR1 个月前
MySQL 8.0 OCP 英文题库解析(十一)
mysql·adb·开闭原则
小哈里1 个月前
【DBA】MySQL经典250题,改自OCP英文题库中文版(2025完整版)
数据库·mysql·dba·开闭原则·ocp
进击的CJR1 个月前
MySQL 8.0 OCP 英文题库解析(八)
数据库·mysql·开闭原则