电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

34页
  • 卖家[上传人]:我***
  • 文档编号:145860901
  • 上传时间:2020-09-24
  • 文档格式:PPT
  • 文档大小:1.39MB
  • / 34 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、第五讲:开闭原则与里氏替换原则,目录,开放封闭原则(OCP) OCP编程实例 OCP原则实施要点 Liskov替换原则 Liskov原则实施要点 总结,开放封闭原则(OCP),什么是软件开发过程中最不稳定的因素? 答案是需求!需求在软件开发过程中时时刻刻都可能发生变化。那么,如何灵活应对变化是软件结构设计中最重要也是最困难的一个问题。好的设计带来了极大了灵活性,不好的设计则充斥着僵化的臭味。所以我们要遵循开放封闭原则OCP。,开放封闭原则(OCP),Bertrand Meyer,面向对象技术大师,发明了Eiffel 语言和按契约设计(Design by Contract)的思想,名著面向对象软件构造的作者,法国工程院院士。目前,他除了担任Eiffel环境和工具开发公司ISE的CTO之外,还是爱因斯坦的母校苏黎世联邦工学院计算机科学系教授,担任软件工程项目主席,同时还在澳大利亚Monash大学任教。他于1988年提出了著名的开放封闭原则(OCP)。,开放封闭原则的现实意义,开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标

      2、就是封装变化、降低耦合。而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,例如后面将介绍的Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。 OCP核心的思想是: 软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。,OCP特征,软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。OCP有两大特征: 对于扩展是开放的(Open for extension) 模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求。 对于更改是封闭的(Closed for modification) 对模块行为扩展时,不必改动模块的源代码或二进制代码。,OCP的关键在于抽象,OCP的关键在于抽象 抽象技术:abstract class, Interface 抽象预见了可能的所有扩展(闭) 由抽象可以随时导出新的类(开),范例:手与门,如何在程序中模拟用手去开门和关门? 行为: 开门(open) 关门(close) 判断门的状态(isOpened),设计实现,public class

      3、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() door.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 (ite

      4、m) case 1: if (door.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 Excutable public boolean isOpen(); public void open(); public void close(); ,新的实现,public class Door implements Excutable private boolean _isOpen = false; public boolean isOpen() return

      5、_isOpen; public void open() _isOpen = true; public void close() _isOpen = false; ,public class Hand public Excutable item; 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(String args) Hand myHand = new Hand(); myHand.item = new Door(); myHand.do(); ,新的需

      6、求,需要手去开关冰箱?,为冰箱实现Excutable接口 不需要修改任何原有的设计和代码,public class Refrigerator implements Excutable private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; ,OCP原则实施要点,预测变化和“贴切的”结构 上述的例子其实并不是完全封闭的,如果手增加了新的动作,例如搬运,很多地方还是会有改动变化。那么原来所选定的抽象对于这种变化来说反到成为一种障碍。 一般而言,无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。没有对于所有的情况都贴切的模型。 设计人员必须对于他们设计的模块应该对哪种变化封闭做出选择。 必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离变化。,OCP原则实施要点,要避免进行多余的抽象 遵循OCP的代价也是昂贵的。创建正确的抽象是要花费时间和精力的。同

      7、时这些抽象也增加了软件的复杂性。因此,开闭原则很难被完全实现,只能在某些模块、某种程度上、某个限度内符合OCP的要求。所以可以说,OCP具有理想主义的色彩,是OOD的终极目标。 在项目很紧张的情况下,一般只会对能百分之百预测到的变化经行抽象,而且要是那种会经常发生变化的部分才进行抽象。,OCP原则实施要点,隔离变化的手段 1. “只受一次愚弄” 这意味着在我们最初编写代码时,假设变化不会发生;当变化发生时,我们就创建抽象来隔离以后发生的同类变化。 2. 刺激变化。 我们首先编写测试 我们使用很短的迭代周期进行开发一个周期为几天而不是几周 我们在加入基础结构之前就开发特性,并且经常性的把那些特性展示给涉众 我们首先开发最重要的特性 尽早的、经常的发布软件,Liskov替换原则(LSP),LSP(The Liskov Substitution Principle, Liskov替换原则) “若对于类型S的任一对象o1,均有类型T的对象o2存在,使得在T定义的所有程序P中,用o1替换o2之后,程序的行为不变,则S是T的子类型”,如果在任何情况下,子类(或子类型)或实现类与基类都是可以互换的,

      8、那么继承的使用就是合适的。为了达到这一目标,子类不能添加任何父类没有的附加约束 “子类对象必须可以替换父类对象”,从问题开始!,长方形与正方形 假如我们有一个类:长方形(Rectangle) 我们需要一个新的类,正方形(Square) 问:可否直接继承长方形?,没问题,因为数学上正方形就是长方形的子类!,开始设计:正方形,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 se

      9、tHeight(int h) super.setWidth (h); super.setHeight (h) ; ,设计方案正确吗?,public static void resize(Rectangle r) while (r.getHeight() = r.getWidth() r.setHeight(r.getHeight() + 1); System.out.println(“Its OK.); ,Rectangle r1 = new Rectangle(); r1.setHeight(5); r1.setWidth(15); resize(r1);,Rectangle r2 = new Square(); r2.setHeight(5); r2.setWidth(15); resize(r2);,使用父类(长方形)时,程序正常运行 使用子类(正方形)时,程序陷入死循环 设计出问题了?继承出问题了?,违背LSP原则,Square类针对height、width添加了Rectangle所没有的附加的约束 违背了LSP原则 带来潜在的设计问题(使用resize方法时,子类出错!),怎么办?,在可能的情况下,由抽象类(接口)继承,解决方案,IS-A关系的思考?,鸵鸟是鸟吗?是 鸵鸟有翅膀,鸟也有翅膀 鸵鸟有喙,鸟也有喙 但是 鸟.getFlySpeed() 鸵鸟.getRunSpeed() 有着不同 结论:IS-A应当是关于行为的。 LSP清晰的指出,OOD中ISA关系是就行为方式而言的,行为方式是可以进行合理假设的,是客户程序所依赖的。,IS-A关系的思考(续),对于动物学家 只关心鸟的生理特征,对他们来说,鸵鸟就是鸟 对于养鸟人 关心鸟的行为特征,鸵鸟不是鸟 他们都正确 考虑一个特定设计是否恰当时,不能完全孤立地看这个解决方案,应该根据设计的使用者提出的合理假设来

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

      点击阅读更多内容
    TA的资源
  • 2020届中考英语备考复习-作文课件

    2020届中考英语备考复习-作文课件

  • 2019年中考英语复习-专题十五-交际运用(试卷部分)课件

    2019年中考英语复习-专题十五-交际运用(试卷部分)课件

  • 2019届二轮复习-高中英语-情态动词和虚拟语气课件

    2019届二轮复习-高中英语-情态动词和虚拟语气课件

  • 2019届一轮复习苏教版物质的跨膜运输课件

    2019届一轮复习苏教版物质的跨膜运输课件

  • 2019年北师大版英语单元复习课件::Unit17Laughter课件北师大版选修6

    2019年北师大版英语单元复习课件::Unit17Laughter课件北师大版选修6

  • 2021届新中考物理冲刺备考复习-力-弹力-重力课件

    2021届新中考物理冲刺备考复习-力-弹力-重力课件

  • 2019届一轮复习人教版种群的特征和数量变化课件

    2019届一轮复习人教版种群的特征和数量变化课件

  • 2020年高考地理一轮复习--等高线地形图-课件

    2020年高考地理一轮复习--等高线地形图-课件

  • 2019版高考英语一轮复习-Unit-1-Living-well课件

    2019版高考英语一轮复习-Unit-1-Living-well课件

  • 2019届一轮复习人教版孟德尔的遗传定律——基因分离定律课件

    2019届一轮复习人教版孟德尔的遗传定律——基因分离定律课件

  • 2019届高三第二轮复习专题二万有引力定律及其应用课件

    2019届高三第二轮复习专题二万有引力定律及其应用课件

  • 2020最新部编版语文五年级上册23-鸟的天堂课件含课后练习

    2020最新部编版语文五年级上册23-鸟的天堂课件含课后练习

  • 2020版高考(浙江)一轮复习:第7讲-细胞呼吸课件

    2020版高考(浙江)一轮复习:第7讲-细胞呼吸课件

  • 2020年新教材高中英语UNIT4HISTORYANDTRADITIONSSectionⅢDiscoveringUsefulStructures课件必修第二册

    2020年新教材高中英语UNIT4HISTORYANDTRADITIONSSectionⅢDiscoveringUsefulStructures课件必修第二册

  • 2019届高考历史二轮复习阶段三专题十三罗斯福新政与当代资本主义的新变化课件2

    2019届高考历史二轮复习阶段三专题十三罗斯福新政与当代资本主义的新变化课件2

  • 2019版高考生物二轮复习-专题三-细胞的生命历程-考点9-细胞分裂过程图像和坐标曲线的识别课件

    2019版高考生物二轮复习-专题三-细胞的生命历程-考点9-细胞分裂过程图像和坐标曲线的识别课件

  • (通史版)2021版高考历史一轮复习第4部分高考讲座(三)2高考非选择题(12分开放探究题)规范答题讲练课件

    (通史版)2021版高考历史一轮复习第4部分高考讲座(三)2高考非选择题(12分开放探究题)规范答题讲练课件

  • 2019届高三地理复习第五讲--《区际联系与区域协调发展》课件

    2019届高三地理复习第五讲--《区际联系与区域协调发展》课件

  • 2021人教部编版历史九年级上册习题课件:第18课美国的独立

    2021人教部编版历史九年级上册习题课件:第18课美国的独立

  • 2020学年新教材高中英语Unit1FoodforthoughtPeriodTwoStartingout课件

    2020学年新教材高中英语Unit1FoodforthoughtPeriodTwoStartingout课件

  • 点击查看更多
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.