聊一聊开闭原则(OCP).
简述
在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。<百度百科>
最早提出(梅耶开闭原则)
开闭原则最早是出现在软件行业术语里。一个叫伯特兰·迈耶的法国人在他的1988年《面向对象软件构造》中提出。一个类一旦完成,那么只能因为发生错误而修改它,新的特点或者新的功能应该是通过不同的类去实现。他呢主张通过extends
的方式去来重写原有的功能,已经实现过的功能应该是封闭的,注意是继承而不一定是实现
重新定义(多态开闭原则)
到了20世纪90年代,开闭原则被广泛的重新定义由于抽象化接口的使用,在这中间实现可以被改变,多种实现可以被创建,并且多态化的替换不同的实现。即我们有一个接口(抽象类)多个不同的实现,应对多个不同的场景,但是约定是一样的!
同样是吃饭比赛,有很多不同的吃法!这个已经接近现在编程的思想了!已经可以面向接口编程!
深入探讨
OCP的两个特点
对外扩展开放(Open for extension)
当我们的需求要改变时,那么我们可以对功能进行扩展,使得满足新的功能。
对内修改关闭
对关注点进行扩展时,不必修改已有的核心代码,而达到扩展新功能的目的。
来源:敏捷软件开发-OCP
上面提到,软件中的对象,从大到小无非就是模块、类、函数。通过开闭原则的思想,即是已经完成的通过测试的软件对象我们不应该是修改它,而是去扩展它!
那么到底什么是修改?在我们平时的开发过程,修改一个类的提交很正常!修改一个方法也很正常!那么怎么定义是扩展还是修改?很显示这种定位是非常的困难!所谓国有国法、家有家规!我们可以借鉴前人的思想来断定一些比较难以界定的问题。
抽象
由程序员的编码经验和所在的业务经验所得出的结论,抽出不可变化的(即共同的),对外扩展出抽象方法!但做到这一点是不容易的,谁也不能100%的确定哪块业务不会更改,哪块业务不会变动!既然不可能,那就向尽可能的方向上去走!就算你是一个小白,当你第二次修改相同的代码块时,应该考虑在不修改原使代码的前提下通过重写、多态、继承、组合等方式重新实现一次?这样才能叠加自身的编程buffer!
通常我们都会认为,只要代码能跑我就不会动,只要能加两行代码我就不会重新的去实现!但是有的时候尽管我们做了很多的过度的设计,也可能他代码写上去一辈子也不会动,但是还是用了某某设计模式去实现它,使得变的扩展性更强!我想这种做法是值提提倡的、因为它给我们自身带来了很多的想法!假如某一天就用上了呢?这谁也说不定!有时候多想想是好的!
关闭修改、对外扩展?
如果某功能有一个bug,那么我们在原来的代码上打补丁,这种修改我认为是被允许的!
如果要开发一个新功能,但是与已经存在的代码80%的实现相同,投机取巧的我加了个入参,然后在原代码里接着写
if else
代码块,那么我认为是不可取的!某一天我要在某个类里加个属性,而不是修改某个属性我也认为是可取的!
还有很多...
大概什么是修改、什么是扩展,我想真的自己切身体会才能明白其中的道理!
聊一聊开闭原则(OCP).的更多相关文章
- C#软件设计——小话设计模式原则之:开闭原则OCP
前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件 ...
- 7.10 其他面向对象设计原则1: 开-闭原则OCP
其他面向对象设计原则1: 开-闭原则OCP Open-Closed Principle (OCP)5.1 设计变坏的前兆 Signs of Rotting Design 僵硬性 Rigidit ...
- 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...
- 设计原则:开闭原则(OCP)
1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...
- 【设计模式】之开闭原则(OCP)
开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...
- 【面向对象设计原则】之开闭原则(OCP)
开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...
- JavaScript 开闭原则OCP
代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则
单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...
- 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)
1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...
随机推荐
- UNIX环境高级编程APUE练习3.2-不用fcntl实现dup2的功能
1 题面 编写与dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理. 2 基本思路 不能用fcntl,能够返回一个文件描述符的只有open和dup.而open会创建一个新的文件表 ...
- thunderbird发送纯文本邮件
向邮件列表中发邮件时,要求邮件格式必须是纯文本格式的,在thunderbird中,邮件格式(plain text或者html格式)在[工具->账户设置->[账户名称]->通讯录]下的 ...
- 用SamInside破解Windows登录密码
用小马PE的USB-HDD+格式制作启动优盘: 笔记本启动时按ESC键,选择USB启动: 进入WinPE后,将%SystemRoot%/system32/config全部拷贝出来(WinXP这个文件夹 ...
- MATLAB—信号与系统中的应用
文章目录 一. 理论知识 1.线性系统的响应 2.微分方程的解 Ⅰ.经典解 Ⅱ.完全响应 3.零输入响应 4.零状态响应 5.冲激响应 6.阶跃响应 7.卷积求零状态响应 二.连续信号的MATLAB描 ...
- MySQL 条件查询
查询条件 having having的功能和where一样,都是用来筛选查询,不同的是,where在分组之前用,having必须在分组之后使用. # 查询每个部门大于30岁的平均工资,并且保留平均工资 ...
- noip38
T1 有个朴素的暴力,枚举每一个子矩形,复杂度 \(O(n^{2}m^{2})\),观察数据范围,n很小,考虑枚举行,对于 \(m\) 用 \(two\;pointers\) 来维护. 先预处理出每一 ...
- NOIP 模拟 $15\; \text{影子}$
题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...
- liunx上安装nacos
下载nacos wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz 启动服务 ...
- 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...
- 【java虚拟机】jvm内存模型
作者:pengjunlee原文链接:https://blog.csdn.net/pengjunlee/article/details/71909239 目录 一.运行时数据区域 1.程序计数器 2.J ...