欢迎来到天天文库
浏览记录
ID:52123675
大小:2.11 MB
页数:34页
时间:2020-04-01
《敏捷软件开发第五讲-开闭原则与里氏替换原则.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第五讲:开闭原则与里氏替换原则目录开放——封闭原则(OCP)OCP编程实例OCP原则实施要点Liskov替换原则Liskov原则实施要点总结开放——封闭原则(OCP)什么是软件开发过程中最不稳定的因素?——答案是需求!需求在软件开发过程中时时刻刻都可能发生变化。那么,如何灵活应对变化是软件结构设计中最重要也是最困难的一个问题。好的设计带来了极大了灵活性,不好的设计则充斥着僵化的臭味。所以我们要遵循——开放封闭原则OCP。开放——封闭原则(OCP)BertrandMeyer,面向对象技术大师,发明了Eiffel语言和按
2、契约设计(DesignbyContract)的思想,名著《面向对象软件构造》的作者,法国工程院院士。目前,他除了担任Eiffel环境和工具开发公司ISE的CTO之外,还是爱因斯坦的母校苏黎世联邦工学院计算机科学系教授,担任软件工程项目主席,同时还在澳大利亚Monash大学任教。他于1988年提出了著名的开放——封闭原则(OCP)。开放封闭原则的现实意义开放封闭原则(OCP,OpenClosedPrinciple)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合。而开放封闭原则正是对这一目标的最
3、直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如后面将介绍的Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。OCP核心的思想是:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。OCP特征软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。OCP有两大特征:对于扩展是开放的(Openforextension)模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求。对于更改是封闭的(Closedformodificat
4、ion)对模块行为扩展时,不必改动模块的源代码或二进制代码。OCP的关键在于抽象OCP的关键在于抽象抽象技术:abstractclass,Interface抽象预见了可能的所有扩展(闭)由抽象可以随时导出新的类(开)范例:手与门如何在程序中模拟用手去开门和关门?行为:开门(open)关门(close)判断门的状态(isOpened)设计实现publicclassDoor{privateboolean_isOpen=false;publicbooleanisOpen(){return_isOpen;}publicvoi
5、dopen(){_isOpen=true;}publicvoidclose(){_isOpen=false;}}publicclassHand{publicDoordoor;voiddo(){if(door.isOpen())door.close();elsedoor.open();}}publicclassSmartTest{publicstaticvoidmain(String[]args){HandmyHand=newHand();myHand.door=newDoor();myHand.do();}}新的需求
6、……需要手去开关抽屉,冰箱……?我们只好去修改程序!解决新的需求:修改设计publicclassHand{publicDoordoor;publicDrawerdrawer;voiddo(intitem){switch(item){case1:if(door.isOpen())door.close();elsedoor.open();break;case2:if(drawer.isOpen())drawer.close();elsedrawer.open();break;}}}publicclassSmartTest
7、{publicstaticvoidmain(String[]args){HandmyHand=newHand();myHand.door=newDoor();myHand.do(1);}}手被改了!主(使用手)程序也被改了!符合OCP的设计方案publicinterfaceExcutable{publicbooleanisOpen();publicvoidopen();publicvoidclose();}新的实现publicclassDoorimplementsExcutable{privateboolean_is
8、Open=false;publicbooleanisOpen(){return_isOpen;}publicvoidopen(){_isOpen=true;}publicvoidclose(){_isOpen=false;}}publicclassHand{publicExcutableitem;voiddo(){if(item.isOpen(
此文档下载收益归作者所有