敏捷软件开发——开放—封闭原则(OCP)

由来:

怎么样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一版本以后不断推出新的版本呢?bertrand meyer 在1988年提出的著名的开发—封闭原则(the open-closed princle)为我们提供了指引。

遵循开放—封闭原则设计出的模块具有两个主要特征:

1. “对于扩张是开放的”(open for extension)

这以为着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的行为。也就是说,我们可以改变模块的功能。

2. “对于更改是封闭的”(closed for modification)

对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、dll都无需改动。

这两个特征看似矛盾,怎么可能在不改模块源代码的情况下去更改它的行为呢?怎样才能无需对模块进行改动的情况先就改变它的功能呢?

关键是抽象

在c++中,可以创建出固定却能够描述一组任意个可能行为的抽象体。这个抽象体就是抽象基类,而这一组人一个可以能的行为则表现为可能的派生类。

这个基类就是不需要修改的,里面的成员方法(接口)声明为纯虚函数,具体的实现可以在派生类去实现、更改、扩展。

应用OCP,可以把一个功能通用的部分和实现细节部分清晰的分离开。

在实际应用中,设计人员必须对于他设计的模块应该对哪种变化封闭做出判断。他必须猜测出最有可能发生变化的一些行为,然后构造抽象来隔离这些变化。

这需要设计人员具备一些从经验中获得预测的能力, 需要设计人员对应用领域很了解,能够以此来判断各种变化的可能性。然后,他才能设计出合理的OCP。

事实上,很难在第一次设计中就能预测出所有可能的变化,

所以,我们怎么隔离变化呢?

1、只受一次愚弄

有句谚语:“愚弄我一次,应该感到羞愧的是你。再次愚弄到我,应该感到羞愧的是我。”这也是一种有效的对待软件设计的态度,我们会允许自己被愚弄一次。这以为着在我们最初编写代码时,假设不会发生变化。但变化发生时,我们就创建抽象来隔离以后发生同类的变化。简而言之,我们愿意被第一颗子弹击中,然后我们会确保自己不会再被同一只枪发射的其他子弹击中。

2、刺激变化

如果我们决定接受第一颗子弹,那么子弹到来的越早越好,我们就会越早的发现问题,解决问题。我们希望在开发工作展开不就就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。正所谓早发现早解决

因此,我们需要去刺激变化:

*编写测试

*使用很短的迭代周期进行开发

*尽早地、经常性地发布软件。尽可能频繁地把软件展示给客户和使用人员,得到他们的反馈。

总结:

在许多方面,OCP都是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处(灵活性、可重用性以及可维护性)。然而,并不是说只要使用一种面向对象语音 就是 遵循了这个原则,对于应用程序中每个部分都肆意的进行抽象同样不是一个好注意。正确的做法是,开发人员应该仅仅对程序中呈现出 频繁变化的那些部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。

时间: 2024-11-10 17:10:59

敏捷软件开发——开放—封闭原则(OCP)的相关文章

开放封闭原则(OCP)

开放封闭原则 转:http://baike.baidu.com/view/2493421.htm转:http://dev.csdn.net/article/38/38826.shtm 开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心.软件设计本身所追求的目标就是封装变化.降低耦合,而开放封闭原则正是对这一目标的最直接体现.其他的设 计原则,很多时候是为实现这一目标服务的. 关于开发封闭原则,其核心的思想是: 软件实体应该是可扩展,而不可修改的.也就是说,

开放封闭原则OCP

开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心.软件设计本身所追求的目标就是封装变化.降低耦合,而开放封闭原则正是对这一目标的最直接体现.其他的设计原则,很多时候是为实现这一目标服务的. 关于开放封闭原则,其核心的思想是: 软件实体应该是可扩展,而不可修改的.也就是说,对扩展是开放的,而对修改是封闭的. 因此,开放封闭原则主要体现在两个方面: 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况. 对修改封闭,意味着类一旦设计完

敏捷软件开发——单一职责原则(SRP)

定义: 简单来说,单一职责原则(SRP)就是对对一个类而言,应该仅有一个引起它变化的原因. 什么是职责? 在SRP中,职责 =  a reason for change .如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责. 具体的例子可以看敏捷软件开发 p91 . SRP是所有原则找那个最简单的之一,也是最难正确运用的之一.我们会自然地把职责结合在一起.软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离. 不好意思,写的有点简单了?,刚刚看到这部分,后面会有具体的例

设计模式六大原则: 一国两制 -- 开放封闭原则

"一国两制"指的是在中华人民共和国内,国家的主体实行社会主义,香港.澳门和台湾实行资本主义. 中国共产党为解决祖国内地和台湾和平统一的问题以及在香港.澳门恢复行使中国主权的问题而提出的基本国策.即在中华人民共和国内,内地坚持社会主义制度作为整个国家的主体,同时允许台湾.香港.澳门保留资本主义制度. 现代化建设的设计师-邓小平先生一定学过设计模式,他的 开放封闭原则用地炉火纯青啊: - 首先中国大陆的社会主义方针是坚定不移的 - 这时香港.澳门这两个在富人家过惯了的孩子又不肯回来过社会主

敏捷软件开发 – OCP 开放-封闭原则

软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改的. 如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化性的臭味.OCP建议我们应该对系统进行重构,这样以后对系统再进行这样那样的改动时,就不会导致更多的修改.如果正确地应用OCP,那么以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码. OCP概述 遵循开放-封闭原则设计出的模块具有两个主要的特征.它们是: 对于扩展是开放的(open for extension).这意味着模块的行

敏捷软件开发:原则、模式与实践——第9章 OCP:开放-封闭原则

第9章 OCP:开放-封闭原则 软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改. 9.1 OCP概述 遵循开放-封闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为. (2)对于修改是封闭的(closed for modification).对模块进行扩展时,不必改动模块的源代码或者二进制代码.模块的二进制可执行版本,无论是可链接

[书摘]《敏捷软件开发: 原则、模式与实践》第一部分:敏捷开发

面向对象设计的原则 单一职责 开放-封闭 Liskov替换原则 依赖倒置原则 接口隔离原则 重用发布等价原则 共同封闭原则 共同重用原则 无环依赖原则 稳定以来原则 稳定抽象原则 人的重要性 交付产品的关键因素是人,而不是过程.(敏捷 Agile) 人与人之间的交互式复杂的,并且其效果从来都是难以预期,但却是工作中最为重要的方面. ------ Tom DeMacro 和 Timothy Lister<人件> 有凝聚力的团队将具有最强大的软件开发力量. 敏捷软件开发宣言 我们一直在实践中探寻更

敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对LSP的违反导致了OCP的违反: struct Point { double x, y;} public enum ShapeType { square, circle }; public class Shape { private ShapeType type; public Shape(Shape

敏捷软件开发的12个原则

作为一个软件工程师,软件设计和开发是最重要的技能,但是,从整个产品的角度上讲,项目管理能力比开发能力更重要,本文摘自Robert大叔的<敏捷软件开发>,粗体是Robert大叔的话,细体是我的理解. 1.持续.尽早交付有价值的软件以满足客户,是我们优先要做的首要任务. 以逐渐增加功能的方式经常性地交付系统和最终质量之间有非常强的相关性.交付得越频繁,最终产品的质量就越高. 自顶向下地设计软件,按照功能优先级逐步开发,定期交付可运行的版本.这个原则看起来简单,但是对软件设计有非常高的要求,因为随着