开放-封闭原则(OCP)
- 对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码.
- 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为.
- Open:模块的行为是可以扩展的,即可以改变模块的功能.
- Close:对模块进行扩展时,不必改动DLL,Code,lib等.
- 封闭创建于抽象的基础之上.
- 关键是抽象.
- 抽象基类: 固定,能够描述一组任意个可能行为的抽象体.
- 派生类: 一组任意个可能的行为的表现.
- 模块操作抽象体.所以模块的依赖是一个固定(对修改封闭的)的抽象体.然后,通过从这个抽象体派生,可以扩展此模块的行为.


- 该结构的问题:
- 很可能会需要在switch中进行if/else判断.导致理解和发现所有需要增加对新增类型进行判断的难度.
- 同时,在给Type枚举添加成员时,由于所有的子类都依赖于该枚举,所以必须编译所有子类DLL.

- 再新增新类型时,只需要派生一个具有新功能的子类,并且实现相应的方法.同时更改main之类的new子类的地方.
- 而不再需要再改动系统既存的任何代码.
- 该结构的问题:
- 预测变化和"贴切的"结构.
- 如果预测到了某种变化,那么就可以设计一个抽象来隔离它.
- 无论模块多么的封闭,都存在以下无法对之封闭的变化.即没有对所有情况都贴切的模型.
- 所以,我们从经验中预测最有可能发生的变化的种类,然后构造抽象来隔离那些变化.
- 遵循OCP原则的代价很大,并且抽象本身也会增加设计的复杂性.开发人员也只能处理有限数量的抽象.
- 防止Hook.
- hook本身需要支持和维护,当不使用它们时就具有了不必要的复杂性的臭味.
- 只受一次愚弄.最初我们编写代码时,假设变化不会发生.当变化真的发生时,我们创建抽象来隔离以后发生的同类变化.
- 刺激变化,来尽早地查明可能发生的变化.
总结. 我们通过抽象来实现封闭,通过重载/hook来实现扩展.
只有当我们预测到了某种变化发生的可能性,或者某种变化已经发生时,才会创建抽象来应对以后同类的变化.
抽象会带来复杂性和成本.拒绝不成熟的抽象,和抽象本身一样重要.
[Agile Software Development(Principles,Patterns,and Pracitices)]
开放-封闭原则(OCP)的更多相关文章
- 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则
单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...
- 开放封闭原则(OCP)
开放封闭原则 转:http://baike.baidu.com/view/2493421.htm转:http://dev.csdn.net/article/38/38826.shtm 开放封闭原则(O ...
- 1开放封闭原则OCP
一.什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体 应当对扩展开放,则修改关闭. 在设计一个模块时,应当使得这个模块可以在不被修 改的前提下被扩展.也就是 ...
- 设计模式学习--面向对象的5条设计原则之开放封闭原则--OCP
一.OCP简介(OCP--Open-Closed Principle):Software entities(classes,modules,functions,etc.) should be open ...
- C++ 设计模式 开放封闭原则 简单示例
C++ 设计模式 开放封闭原则 简单示例 开放封闭原则(Open Closed Principle)描述 符合开放封闭原则的模块都有两个主要特性: 1. 它们 "面向扩展开放(Open Fo ...
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...
- Observer观察者模式与OCP开放-封闭原则
目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...
- (转) 面向对象设计原则(二):开放-封闭原则(OCP)
原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...
- 开放-封闭原则(OCP)
怎样的升级才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则(The Open-Closed Principle, OCP)为我们提供了指引.软件 ...
随机推荐
- 将表中数据生成SQL语句
在开发过程中,经常需要我们对表中的数据进行转移,如果在同台机器,可以使用SQL自带的导入数据,但是如果想让所有的数据生成可执行的SQL语句,它的移植性最强了.首先要设计一个存储过程.具体如下: CRE ...
- [Angular2 Router] Understand the Angular 2 Base href Requirement
The <base href=”/”/> you define will determine how all other assets you plan on loading treat ...
- Qt多线程学习:创建多线程
[为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题 ...
- iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果
8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...
- iOS开发——项目实战OC篇&类QQ黏性按钮(封装)
类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中 ...
- JavaWeb学习总结
http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/ http://www.cnblogs. ...
- LinkedHashMap介绍
转载:http://uule.iteye.com/blog/1522291 jdk1.7API文档链接:http://tool.oschina.net/apidocs/apidoc?api=jdk_7 ...
- 去除重复命令uniq
命令uniq经常用于去除一个文本中的重复行.用sort命令也可以去除重复行,但二者有较大区别:用sort去除重复行时,sort将整个文本中的多个重复行去除,仅保留一行,而uniq会将多个连续重复的行去 ...
- 最少javascript代码完成一个2048游戏
原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: &l ...
- 保持查询语法指示的联接顺序Option(Force order)
Option(Force order) 今天和大家分享一下 SQL中强制执行联接顺序Option(Force Order) 一.SQL本身SQL引擎优化已经做的非常好了,但是也有默认的多表连接引擎效果 ...