敏捷软件开发第五讲-开闭原则与里氏替换原则

上传人:平*** 文档编号:26950891 上传时间:2018-01-04 格式:PPT 页数:34 大小:2.11MB
返回 下载 相关 举报
敏捷软件开发第五讲-开闭原则与里氏替换原则_第1页
第1页 / 共34页
敏捷软件开发第五讲-开闭原则与里氏替换原则_第2页
第2页 / 共34页
敏捷软件开发第五讲-开闭原则与里氏替换原则_第3页
第3页 / 共34页
敏捷软件开发第五讲-开闭原则与里氏替换原则_第4页
第4页 / 共34页
敏捷软件开发第五讲-开闭原则与里氏替换原则_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《敏捷软件开发第五讲-开闭原则与里氏替换原则》由会员分享,可在线阅读,更多相关《敏捷软件开发第五讲-开闭原则与里氏替换原则(34页珍藏版)》请在金锄头文库上搜索。

1、第五讲:开闭原则与里氏替换原则,目录,开放封闭原则(OCP)OCP编程实例OCP原则实施要点Liskov替换原则Liskov原则实施要点总结,开放封闭原则(OCP),什么是软件开发过程中最不稳定的因素? 答案是需求!需求在软件开发过程中时时刻刻都可能发生变化。那么,如何灵活应对变化是软件结构设计中最重要也是最困难的一个问题。好的设计带来了极大了灵活性,不好的设计则充斥着僵化的臭味。所以我们要遵循开放封闭原则OCP。,开放封闭原则(OCP),Bertrand Meyer,面向对象技术大师,发明了Eiffel 语言和按契约设计(Design by Contract)的思想,名著面向对象软件构造的作

2、者,法国工程院院士。目前,他除了担任Eiffel环境和工具开发公司ISE的CTO之外,还是爱因斯坦的母校苏黎世联邦工学院计算机科学系教授,担任软件工程项目主席,同时还在澳大利亚Monash大学任教。他于1988年提出了著名的开放封闭原则(OCP)。,开放封闭原则的现实意义,开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合。而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如后面将介绍的Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。O

3、CP核心的思想是:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。,OCP特征,软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。OCP有两大特征:对于扩展是开放的(Open for extension) 模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求。对于更改是封闭的(Closed for modification) 对模块行为扩展时,不必改动模块的源代码或二进制代码。,OCP的关键在于抽象,OCP的关键在于抽象抽象技术:abstract class, Interface抽象预见了可能的所有扩展(闭)由抽象可以随时导出新的

4、类(开),范例:手与门,如何在程序中模拟用手去开门和关门?行为:开门(open)关门(close)判断门的状态(isOpened),设计实现,public class Door private boolean _isOpen=false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; ,public class Hand public Door door; void do() if (door.isOpen() doo

5、r.close(); else door.open(); ,public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHand.door = new Door(); myHand.do(); ,新的需求,需要手去开关抽屉,冰箱?,我们只好去修改程序!,解决新的需求:修改设计,public class Hand public Door door; public Drawer drawer; void do(int item) switch (item) case 1: if (d

6、oor.isOpen() door.close(); else door.open(); break;case 2: if (drawer.isOpen() drawer.close(); else drawer.open(); break; ,public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHand.door = new Door(); myHand.do(1); ,手被改了!主(使用手)程序也被改了!,符合OCP的设计方案,public interface Exc

7、utable public boolean isOpen(); public void open(); public void close();,新的实现,public class Door implements Excutable private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; ,public class Hand public Excutable it

8、em; void do() if (item.isOpen() item.close(); else item.open(); ,public class Drawer implements Excutable private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; ,public class SmartTest public static void main(S

9、tring args) Hand myHand = new Hand(); myHand.item = new Door(); myHand.do(); ,新的需求,需要手去开关冰箱?,为冰箱实现Excutable接口不需要修改任何原有的设计和代码,public class Refrigerator implements Excutable private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close()

10、_isOpen = false;,OCP原则实施要点,预测变化和“贴切的”结构 上述的例子其实并不是完全封闭的,如果手增加了新的动作,例如搬运,很多地方还是会有改动变化。那么原来所选定的抽象对于这种变化来说反到成为一种障碍。 一般而言,无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。没有对于所有的情况都贴切的模型。 设计人员必须对于他们设计的模块应该对哪种变化封闭做出选择。 必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离变化。,OCP原则实施要点,要避免进行多余的抽象 遵循OCP的代价也是昂贵的。创建正确的抽象是要花费时间和精力的。同时这些抽象也增加了软件的复杂性。因此,开闭

11、原则很难被完全实现,只能在某些模块、某种程度上、某个限度内符合OCP的要求。所以可以说,OCP具有理想主义的色彩,是OOD的终极目标。 在项目很紧张的情况下,一般只会对能百分之百预测到的变化经行抽象,而且要是那种会经常发生变化的部分才进行抽象。,OCP原则实施要点,隔离变化的手段1. “只受一次愚弄” 这意味着在我们最初编写代码时,假设变化不会发生;当变化发生时,我们就创建抽象来隔离以后发生的同类变化。2. 刺激变化。我们首先编写测试我们使用很短的迭代周期进行开发一个周期为几天而不是几周我们在加入基础结构之前就开发特性,并且经常性的把那些特性展示给涉众我们首先开发最重要的特性尽早的、经常的发布

12、软件,Liskov替换原则(LSP),LSP(The Liskov Substitution Principle, Liskov替换原则) “若对于类型S的任一对象o1,均有类型T的对象o2存在,使得在T定义的所有程序P中,用o1替换o2之后,程序的行为不变,则S是T的子类型”,如果在任何情况下,子类(或子类型)或实现类与基类都是可以互换的,那么继承的使用就是合适的。为了达到这一目标,子类不能添加任何父类没有的附加约束“子类对象必须可以替换父类对象”,从问题开始!,长方形与正方形假如我们有一个类:长方形(Rectangle)我们需要一个新的类,正方形(Square)问:可否直接继承长方形?,没

13、问题,因为数学上正方形就是长方形的子类!,开始设计:正方形,public class Rectangle private int width; private int height; public void setWidth(int w) width = w; public int getWidth() return width; public void setHeight(int h) height = h; public int getHeight() return height; ,public class Square extends Rectangle public void setWidth(int w) super.setWidth (w); super.setHeight (w); public void setHeight(int h) super.setWidth (h); super.setHeight (h) ; ,设计方案正确吗?,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号