简述

在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。<百度百科>

最早提出(梅耶开闭原则)

开闭原则最早是出现在软件行业术语里。一个叫伯特兰·迈耶的法国人在他的1988年《面向对象软件构造》中提出。一个类一旦完成,那么只能因为发生错误而修改它,新的特点或者新的功能应该是通过不同的类去实现。他呢主张通过extends的方式去来重写原有的功能,已经实现过的功能应该是封闭的,注意是继承而不一定是实现

重新定义(多态开闭原则)

到了20世纪90年代,开闭原则被广泛的重新定义由于抽象化接口的使用,在这中间实现可以被改变,多种实现可以被创建,并且多态化的替换不同的实现。即我们有一个接口(抽象类)多个不同的实现,应对多个不同的场景,但是约定是一样的!

同样是吃饭比赛,有很多不同的吃法!这个已经接近现在编程的思想了!已经可以面向接口编程!

深入探讨

OCP的两个特点

对外扩展开放(Open for extension)

当我们的需求要改变时,那么我们可以对功能进行扩展,使得满足新的功能。

对内修改关闭

对关注点进行扩展时,不必修改已有的核心代码,而达到扩展新功能的目的。

来源:敏捷软件开发-OCP

上面提到,软件中的对象,从大到小无非就是模块、类、函数。通过开闭原则的思想,即是已经完成的通过测试的软件对象我们不应该是修改它,而是去扩展它!

那么到底什么是修改?在我们平时的开发过程,修改一个类的提交很正常!修改一个方法也很正常!那么怎么定义是扩展还是修改?很显示这种定位是非常的困难!所谓国有国法、家有家规!我们可以借鉴前人的思想来断定一些比较难以界定的问题。

抽象

由程序员的编码经验和所在的业务经验所得出的结论,抽出不可变化的(即共同的),对外扩展出抽象方法!但做到这一点是不容易的,谁也不能100%的确定哪块业务不会更改,哪块业务不会变动!既然不可能,那就向尽可能的方向上去走!就算你是一个小白,当你第二次修改相同的代码块时,应该考虑在不修改原使代码的前提下通过重写、多态、继承、组合等方式重新实现一次?这样才能叠加自身的编程buffer!

通常我们都会认为,只要代码能跑我就不会动,只要能加两行代码我就不会重新的去实现!但是有的时候尽管我们做了很多的过度的设计,也可能他代码写上去一辈子也不会动,但是还是用了某某设计模式去实现它,使得变的扩展性更强!我想这种做法是值提提倡的、因为它给我们自身带来了很多的想法!假如某一天就用上了呢?这谁也说不定!有时候多想想是好的!

关闭修改、对外扩展?

  • 如果某功能有一个bug,那么我们在原来的代码上打补丁,这种修改我认为是被允许的!

  • 如果要开发一个新功能,但是与已经存在的代码80%的实现相同,投机取巧的我加了个入参,然后在原代码里接着写 if else代码块,那么我认为是不可取的!

  • 某一天我要在某个类里加个属性,而不是修改某个属性我也认为是可取的!

  • 还有很多...

大概什么是修改、什么是扩展,我想真的自己切身体会才能明白其中的道理!

聊一聊开闭原则(OCP).的更多相关文章

  1. C#软件设计——小话设计模式原则之:开闭原则OCP

    前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件 ...

  2. 7.10 其他面向对象设计原则1: 开-闭原则OCP

    其他面向对象设计原则1: 开-闭原则OCP  Open-Closed Principle (OCP)5.1 设计变坏的前兆 Signs of Rotting Design  僵硬性 Rigidit ...

  3. 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...

  4. 设计原则:开闭原则(OCP)

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...

  5. 【设计模式】之开闭原则(OCP)

    开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...

  6. 【面向对象设计原则】之开闭原则(OCP)

    开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...

  7. JavaScript 开闭原则OCP

    代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  8. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

  9. 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)

    1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...

随机推荐

  1. postman之断言

    1 (状态码断言)和(返回内容断言)

  2. 使用Cobertura做代码覆盖率测试

    经验总结:首先要把cobertura.jar包含ant的classpath路径中,其次要求它包含在测试用例的classpath中: 使用cobertura做代码覆盖率测试中出现的问题:覆盖率始终为0, ...

  3. Python--数据存储

    新建测试文档测试.txt内容如下: 张三:今天天气真好. 李四:是的,真的太好了. 张三:阳光明媚. 李四:鸟语花香. 王五:装逼现场:请带好安全帽 张三:难得好天气,今天就不偷懒了. 李四:能把乞讨 ...

  4. PHPMailer 远程命令执行漏洞 Writeup

    漏洞概述 1.漏洞简介 PHPMailer 小于5.2.18的版本存在远程代码执行漏洞.成功利用该漏洞后,攻击者可以远程任意代码执行.许多知名的 CMS 例如 Wordpress 等都是使用这个组件来 ...

  5. Longhorn,企业级云原生容器分布式存储 - 备份与恢复

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...

  6. 题解 [NOIP2017 提高组]宝藏

    传送门 这是蓝书上状压的例题啊,怎么会出现在模拟赛里 不过就算原题我也没把握写对 核心思路: 先令\(dp[s]\)为当前状态为\(s\)时的总花费最小值,\(cnt[s][i]\)为这个方案中由根节 ...

  7. Mybatis出现错误org.apache.ibatis.executor.ExecutorException: No constructor found in

    错误显示没有发现构造器. 其实就是重写了构造器后,忘了补写一个默认的空参构造器了.此类的错误还经常出现在spring等这种大量使用反射的框架中.因为这些框架在调用反射的类后会默认调用默认的构造器 解决 ...

  8. 2014 12 27 bestcoder 第一题

    水的不行不行的一道题 也是自己做的第一道题  纪念下 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h ...

  9. mzy git学习,分支以及分支合并(四)

    git 鼓励大量使用分支:最后进行master和分支之间的合并 git branch git branch 查看当前有多少分支,并且将当前在使用的分支用*标注出来. [一定要注意git的分支有从属概念 ...

  10. C程序设计学习笔记(完结)

    时间:2015-4-16 09:17 不求甚解,每有会意,欣然忘食.学习的过程是痛苦的 第1章    程序设计和C语言     第2章    算法--程序的灵魂   -算法的五个特点          ...