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

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

相关文章
|
3月前
|
uml
开闭原则(对修改封闭,对扩展开放)
开闭原则(对修改封闭,对扩展开放)
23 0
|
5月前
|
程序员
编程原则和模式
编程原则和模式
|
6月前
|
设计模式 Java 关系型数据库
Java设计模式七大原则-开放-关闭原则
Java设计模式七大原则-开放-关闭原则
37 0
|
1月前
|
设计模式 BI
访问器模式--设计模式
访问器模式--设计模式
16 0
|
1月前
|
设计模式 算法
构建器模式--设计模式
构建器模式--设计模式
18 0
|
9月前
|
设计模式
设计模式——开放-封闭原则
设计模式——开放-封闭原则
|
6月前
|
设计模式 Java
JAVA设计模式7:适配者模式,彻底解决两不兼容接口之间的问题
JAVA设计模式7:适配者模式,彻底解决两不兼容接口之间的问题
|
9月前
28个案例问题分析---21---面向对象复用、面向对象实现、立体化权限--思想
28个案例问题分析---21---面向对象复用、面向对象实现、立体化权限--思想
47 0
|
10月前
|
存储 缓存 搜索推荐
复杂系统设计原则与案例
## 一、复杂是软件的本质属性 ### 1.1 复杂是软件的本质属性 正如Brooks所言,软件复杂性是软件固有的属性,这种固有的复杂性主要由4个方面的原因造成的: - 问题域的复杂性 - 管理开发过程的复杂性 - 随处可变的灵活性 - 描绘离散系统行为的问题 上面每一个方面都有极大的挑战,以「问题域的复杂性」为例,现在我们的大型系统中,动不动就几十个应用,组合在一起就是一个复杂的系统,而每个
1321 3
复杂系统设计原则与案例
|
10月前
|
设计模式 安全 Java
设计规则之开闭原则
设计规则之开闭原则
67 0
设计规则之开闭原则