聊一聊开闭原则(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):模块的行为的可以扩展的,当应用的需求 ...
随机推荐
- 刚学spark
https://blog.csdn.net/u013019431/article/details/80776662 在jupyter notebook import pysparkhttps:// ...
- 用三个while循环和tkinter实现一个显示屏
用三个while循环和tkinter实现一个显示屏 import tkinter as tk import time # 输入框是跟程序打交道的一个途径,例如程序要求你输入账号密码,那么它就需要提供两 ...
- 武器级工具包 Immunity Canvas 7.26 泄露事件 | 附下载地址
关于Immunity Canvas Immunity CANVAS是Immunity公司的一款商业级漏洞利用和渗透测试工具,包含了480多个以上的漏洞利用,该工具并不开源,其中文版介绍如下: &quo ...
- [1.6W字]浏览器跨域请求的原理, 以及解决方法(可以纯前端实现) #flight.Archives011
Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...
- NOIP 模拟 $23\; \rm 联$
题解 \(by\;zj\varphi\) 区间上的问题,一般都用线段树来解决(但是这题也可以用 \(\rm ODT\)) 对于每段段区间设置三个参数,分别表示这个区间是否只有 \(1\) 或 \(0\ ...
- Specification使用notin
废话不多说直接贴代码 Specification<Employee> employeeSpecification = new Specification<Employee>() ...
- 【spring 注解驱动开发】spring对象的生命周期
尚学堂spring 注解驱动开发学习笔记之 - 生命周期 生命周期 1.生命周期-@Bean指定初始化和销毁方法 2.生命周期-InitializingBean和DisposableBean 3.生命 ...
- Qt 中事件与处理
一.事件与处理程序在运算过程中发生的一些事情:鼠标单击.键盘的按下...这些的事件的监控与处理在Qt中不是以信号的方式处理的.当这些事件发生时会调用QObject类中的功能函数(虚函数),所有的控件类 ...
- 带有附件及图片正文的JavaMail邮件发送
1 package javamail; 2 3 import java.io.UnsupportedEncodingException; 4 import java.util.Properties; ...
- Lyndon 相关的炫酷字符串科技
浅谈从 Lyndon Words 到 Three Squares Lemma By zghtyarecrenj 本文包括:Lyndon Words & Significant Suffixes ...