聊一聊开闭原则(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):模块的行为的可以扩展的,当应用的需求 ...
随机推荐
- 中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(上)
前言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~.缩减HC.裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀.但博主始终相信,寒冬之 ...
- 原生js 以ajax(post)的方式传json至php,并让php解析为数组
如题. 比如要把一个json,如 json= {name:"John Rambo", time:"3pm"},,通过js ,传到一个php服务器 fwq.php ...
- jdbc如何注册数据库驱动Driver的?
1. 先看看原生jdbc执行sql的步骤 // 在程序启动的时候需要注册一次mysql驱动,必须引入 mysql-connnector-java 的包 Class.forName("com. ...
- Java8新特性(二)之函数式接口
.subTitle { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); border- ...
- SpringBoot开发十七-事务管理
需求介绍 熟悉事务管理. 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行. 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的 ...
- JavaSE-基础语法
注释 单行注释: //注释 多行注释: /*注释*/ 文档注释: /** 文档注释 */ 标识符与关键字 下图为Java中所有的关键字 所有标识符必须以大小写字母或$或_开头,首字母之后可以用数字 不 ...
- 备战秋招之十大排序——O(nlogn)级排序算法
时间复杂度O(nlogn)级排序算法 五.希尔排序 首批将时间复杂度降到 O(n^2) 以下的算法之一.虽然原始的希尔排序最坏时间复杂度仍然是O(n^2),但经过优化的希尔排序可以达到 O(n^{1. ...
- docker安装sonarqube
目录 一.sonarqube简介 二.安装postgresql数据库 三.sonarqube安装 四.使用教程 五.参考 一.sonarqube简介 SonarQube是管理代码质量的一个开放平台,可 ...
- Ubuntu完全卸载Docker步骤
Ubuntu完全卸载Docker步骤:https://www.jianshu.com/p/c03044dbeaaf
- MYSQL数据库查询索引
1.查看数据库所有索引 SELECT * FROM mysql.`innodb_index_stats` a WHERE a.`database_name` = '数据库名'; 2.查看某一表索引 S ...