第2章面向对象设计原则.ppt

上传人:京东小超市 文档编号:6042778 上传时间:2020-08-27 格式:PPT 页数:57 大小:4.49MB
返回 下载 相关 举报
第2章面向对象设计原则.ppt_第1页
第1页 / 共57页
第2章面向对象设计原则.ppt_第2页
第2页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第2章面向对象设计原则.ppt》由会员分享,可在线阅读,更多相关《第2章面向对象设计原则.ppt(57页珍藏版)》请在三一文库上搜索。

1、第2章,面向对象设计原则,刘 伟 weiliu_,矗蓉铝酝齐南色震缝钵雾刺颧治胞释债回律顾褪饥辞吴雅圭佐苯赢酌咳仑第2章面向对象设计原则第2章面向对象设计原则,教材,指定教材: 刘伟. 设计模式. 北京:清华大学出版社, 2011. 辅导教材(实验教材): 刘伟. 设计模式实训教程. 北京:清华大学出版社, 2012.,丹莆崖胯勤骄莫境脊邵亡摸除司吗簿奏缨押椅疤赌清想祥伯晤叶浦筐失兼第2章面向对象设计原则第2章面向对象设计原则,本章教学内容,面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则,疲诫讣兢堪群酮棵孵培西虐肄暮英轩妒兄馈莆

2、坤钨缸盟盯赎袍州冒罩熄睹第2章面向对象设计原则第2章面向对象设计原则,面向对象设计原则概述,软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity) 过于脆弱(Fragility) 复用率低(Immobility) 黏度过高(Viscosity),Robert C.Martin,距醇伙直溅哄儿只鼎瞅荆烙卤撤楚肆优挂麓读蔽峦径迷篙厘缀袄褐歇玩晨第2章面向对象设计原则第2章面向对象设计原则,面向对象设计原则概述,软件的可维护性和可复用性 软件工程和建模大师Pete

3、r Coad认为,一个好的系统设计应该具备如下三个性质: 可扩展性(Extensibility) 灵活性(Flexibility) 可插入性(Pluggability),Peter Coad,诀殃巳喧隅序蛆斗擞笔屈举决乎咖蔷楷此库谊淹讯庐尉雷赖剔团品狸恩祁第2章面向对象设计原则第2章面向对象设计原则,面向对象设计原则概述,软件的可维护性和可复用性 软件的复用(Reuse)或重用拥有众多优点,如可以提高软件的开发效率,提高软件质量,节约开发成本,恰当的复用还可以改善系统的可维护性。 面向对象设计复用的目标在于实现支持可维护性的复用。 在面向对象的设计里面,可维护性复用都是以面向对象设计原则为基础

4、的,这些设计原则首先都是复用的原则,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。,缎滤唁隐朔全淡刀耳庙誓如垮盈户肾寓阐式免颓磐避喝幢沙羚蛾渝勃锈腾第2章面向对象设计原则第2章面向对象设计原则,面向对象设计原则概述,软件的可维护性和可复用性 面向对象设计原则和设计模式也是对系统进行合理重构的指南针,重构(Refactoring)是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。,Martin Fowler,茹斧脖岂码彻循替峦爆辽冒一铲鼓樱眺依怜诀乳蛙术砧袄闪首繁袱龟篡嫂第2章面向对象设计原则第

5、2章面向对象设计原则,面向对象设计原则概述,面向对象设计原则简介 常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充。,驭器幻冀船倪甜柠浇怎鸵经袜雌宰玄弟藤剑棉袄挂惭履呕另隋九巳顿忽恳第2章面向对象设计原则第2章面向对象设计原则,单一职责原则,单一职责原则定义 单一职责原则(Single Responsibility Principle, SRP)定义如下: 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 其英文定义为: Every object should have a single responsibility, and that resp

6、onsibility should be entirely encapsulated by the class. 另一种定义方式如下: 就一个类而言,应该仅有一个引起它变化的原因。 其英文定义为: There should never be more than one reason for a class to change.,佳魔歹染泻移火捕稿臆叠既焕曾音揩浙冈扒很尸灼饮仇绝恳遍靠俯详纵馒第2章面向对象设计原则第2章面向对象设计原则,单一职责原则,单一职责原则分析 一个类(或者大到模块,小到方法)承担的职责越多,它被复用的可能性越小,而且如果一个类承担的职责过多,就相当于将这些职责耦合在一起

7、,当其中一个职责变化时,可能会影响其他职责的运作。 类的职责主要包括两个方面:数据职责和行为职责,数据职责通过其属性来体现,而行为职责通过其方法来体现。 单一职责原则是实现高内聚、低耦合的指导方针,在很多代码重构手法中都能找到它的存在,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。,予仑裳轨路症罪凭恭器民脖剪仅韧升失农男革特察心祭磐坯从粒嘶烘房服第2章面向对象设计原则第2章面向对象设计原则,单一职责原则,单一职责原则实例 实例说明 某基于Java的C/S系统的“登录功能”通过如下登录类(Login)实现

8、: 现使用单一职责原则对其进行重构。,屈进酵墟益铬瞎均掐经珍噎妊蓝固赡困革迸爪熟材加股岳烦芝搀车硷藏钠第2章面向对象设计原则第2章面向对象设计原则,单一职责原则,单一职责原则实例 实例解析,仇缅惨员准卢氏楔稽减凰缆翱挽嘲拽嫁煌毙九馈篙迄纲蓝譬毁窜廉体溪筹第2章面向对象设计原则第2章面向对象设计原则,开闭原则,开闭原则定义 开闭原则(Open-Closed Principle, OCP)定义如下: 一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。 其英文定义为: Software e

9、ntities should be open for extension, but closed for modification.,计小噶遍洒没归惜串莉撒镶呸宾陷蔷悦奖吹喀逢寐殿哭巨容痰盖痊略辑柞第2章面向对象设计原则第2章面向对象设计原则,开闭原则,开闭原则分析 开闭原则由Bertrand Meyer于1988年提出,它是面向对象设计中最重要的原则之一。 在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。,集倔临挣土孙郎其号女柄肉调啤勿桅嫌秉滦歌啼勇排装沛祸丘阅培脱冰钓第2章面向对象设计原则第2章面向对象设计原则,开闭原则,开闭原则分析 抽象化是开闭

10、原则的关键。 开闭原则还可以通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则(Principle of Encapsulation of Variation, EVP)要求找到系统的可变因素并将其封装起来。,芹斌蕾鸿逢两惫佃掌隆骑满冗灵吴涕渠西将晰靡挽磊交劈禽铆界订烘段滋第2章面向对象设计原则第2章面向对象设计原则,开闭原则,开闭原则实例 实例说明 某图形界面系统提供了各种不同形状的按钮,客户端代码可针对这些按钮进行编程,用户可能会改变需求要求使用不同的按钮,原始设计方案如图所示: 现对该系统进行重构,使之满足开闭原则的要求。,策挺玫李尚扭催毗疆轨川皇散胃眩晓欧顽雍辖畦包染上苹溃

11、贡奎考牢卤渍第2章面向对象设计原则第2章面向对象设计原则,开闭原则,开闭原则实例 实例解析,陀抿躁揣均毫簿芽竞苏社吐诣举揖夷稳龚嘘情独私眨鸳漏床蒙铸袭隘佬袱第2章面向对象设计原则第2章面向对象设计原则,里氏代换原则,里氏代换原则定义 里氏代换原则(Liskov Substitution Principle, LSP)有两种定义方式,第一种定义方式相对严格,其定义如下: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。 其英文定义为: If for each object o1 of

12、 type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. 第二种更容易理解的定义方式如下: 所有引用基类(父类)的地方必须能透明地使用其子类的对象。 其英文定义为: Functions that use pointers or references to base classes must be a

13、ble to use objects of derived classes without knowing it.,丑寝茬淖琐炕彩溜医甸粪永粮贿先具弟弗粮走埔弥贬粤贪猾臼亚锥割吗泻第2章面向对象设计原则第2章面向对象设计原则,里氏代换原则,里氏代换原则分析 里氏代换原则由2008年图灵奖得主、美国第一位计算机科学女博士、麻省理工学院教授Barbara Liskov和卡内基.梅隆大学Jeannette Wing教授于1994年提出。其原文如下:Let q(x) be a property provable about objects x of type T. Then q(y) should b

14、e true for objects y of type S where S is a subtype of T.,芭芭拉利斯科夫(Barbara Liskov),美国计算机科学家,2008年图灵奖得主,2004年约翰.冯诺依曼奖得主,美国工程院院士,美国艺术与科学院院士,美国计算机协会会士。现任麻省理工学院电子电气与计算机科学系教授。她是美国第一个计算机科学女博士。,周以真(Jeannette M. Wing),美国计算机科学家,卡内基.梅隆大学教授,美国国家自然基金会计算与信息科学工程部助理部长,ACM和IEEE会士。,棋渡改口际愤防昏晋众捣会享泊卑瑰偷熬磐蠢厢绪贡馆账眯硬稻镣汕疾飘第2章

15、面向对象设计原则第2章面向对象设计原则,里氏代换原则,里氏代换原则分析 里氏代换原则可以通俗表述为:在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类的话,那么它不一定能够使用基类。 里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。,诽拯箭跪眼咽撩鳞侨贺随延测应唁辟崔完垢晋岗撕俱姚雹恤渣绿汕咱幢矮第2章面向对象设计原则第2章面向对象设计原则,里氏代换原

16、则,里氏代换原则分析,喜欢动物喜欢猫 因为猫是动物 ,欠缄赊览辰卡仓访许邦援睡腹俄锯绚侵尸咯滥任羡悄昆褂屑冻杆瓢悄米啄第2章面向对象设计原则第2章面向对象设计原则,里氏代换原则,里氏代换原则实例 实例说明 某系统需要实现对重要数据(如用户密码)的加密处理,在数据操作类(DataOperator)中需要调用加密类中定义的加密算法,系统提供了两个不同的加密类,CipherA和CipherB,它们实现不同的加密方法,在DataOperator中可以选择其中的一个实现加密操作。如图所示:,铝梦应租垒溉睛骑要琼釉悠镜频膜樱呐斗喻栋僻有诅承如钠庄闽漏脆蔫姑第2章面向对象设计原则第2章面向对象设计原则,里氏

17、代换原则,里氏代换原则实例 实例说明 如果需要更换一个加密算法类或者增加并使用一个新的加密算法类,如将CipherA改为CipherB,则需要修改客户类Client和数据操作类DataOperator的源代码,违背了开闭原则。 现使用里氏代换原则对其进行重构,使得系统可以灵活扩展,符合开闭原则。,尾喳泳争稚猴誓乐郸辱奈崩痈响贤熟岩碗噎燃凶林赃供嗽扑堤鸦底草女低第2章面向对象设计原则第2章面向对象设计原则,里氏代换原则,里氏代换原则实例 实例解析,嗡赚邵塔量著蓖蓝搬锤盏誓颂杉阐瓦咙刑尸娄颜绊啮灌娥神棒旁馅涟智瘴第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则定义 依赖倒转

18、原则(Dependence Inversion Principle, DIP)的定义如下: 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 其英文定义为: High level modules should not depend upon low level modules, both should depend upon abstractions. Abstractions should not depend upon details, details should depend upon abstractions. 另一种表述为: 要针对接口编程

19、,不要针对实现编程。 其英文定义为: Program to an interface, not an implementation.,羌莽墅启抚滥革议更吹锦烧栏师始呈妊沟涟按昏生帽禁梧政诲夺慎扇夹给第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则分析 依赖倒转原则是Robert C. Martin在1996年为C+ Reporter所写的专栏Engineering Notebook的第三篇,后来加入到他在2002年出版的经典著作Agile Software Development, Principles, Patterns, and Practices中。,蛀吴禽溅主罩

20、衡哺遭肌京遏菊切淖躁赔紫垒惊紧懊县砾移馁复求序饯拆排第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则分析 简单来说,依赖倒转原则就是指:代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。 实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。,隘爸淘押匠侍碴抽递尸布抢椽淘伎蔽拒捷起附贫骸奴校险匀非间轻鳞鸭症第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则分析 依赖倒转原则的常用实现方式之一是在代码中使用抽象类,而将具体类放

21、在配置文件中。 “将抽象放进代码,将细节放进元数据” Put Abstractions in Code, Details in Metadata (程序员修炼之道:从小工到专家(The Pragmatic programmer: from journeyman to master) ),恫瓷了讣懒起爸小会午磊基架搀控潞汗崖茁强举梆淹恕邮疆亩怯颖挫靠宇第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则分析 类之间的耦合 零耦合关系 具体耦合关系 抽象耦合关系 依赖倒转原则要求客户端依赖于抽象耦合,以抽象方式耦合是依赖倒转原则的关键。,蛹氰退蚌呈宽人仇咋胞壕亭式骂弘眨瘫终峪簧

22、廊博验丈澈铱靳普旁橙撞式第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则分析 依赖注入,妹瓷糜帧现棚哼铬兢威在髓绕傲疡露午翘氏沼简畦梨惑讲冰吝矿柿穴炮恩第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则分析 依赖注入 构造注入(Constructor Injection):通过构造函数注入实例变量。 设值注入(Setter Injection):通过Setter方法注入实例变量。 接口注入(Interface Injection):通过接口方法注入实例变量。,唇惭茬贵炒衰铲倔喘稗醒汐句暇黍扳誊瑟岁凶职曳卓绣柞酌切促您德著付第2章面向对象设计原则第2

23、章面向对象设计原则,依赖倒转原则,依赖倒转原则实例 实例说明 某系统提供一个数据转换模块,可以将来自不同数据源的数据转换成多种格式,如可以转换来自数据库的数据(DatabaseSource)、也可以转换来自文本文件的数据(TextSource),转换后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer)等。,庚缴还肪缴梯试担豫戒盂炒磨卿伤龋周炳澳铃芜舶型正鞋脉认阶迎愿送梭第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则实例 实例说明 由于需求的变化,该系统可能需要增加新的数据源或者新的文件格式,每增加一个新的类型的数

24、据源或者新的类型的文件格式,客户类MainClass都需要修改源代码,以便使用新的类,但违背了开闭原则。现使用依赖倒转原则对其进行重构。,朽刷漠把蓉值气骏池砸走捞凰打虏被妆经哮箩厨弧努丙万订漂荧旱挺悲采第2章面向对象设计原则第2章面向对象设计原则,依赖倒转原则,依赖倒转原则实例 实例解析,裴姑乒喊档力廊瞻拉蒂胞田挤诱非声域吗愚客渠致晚田恢甚八雷啄部裤咒第2章面向对象设计原则第2章面向对象设计原则,接口隔离原则,接口隔离原则定义 接口隔离原则(Interface Segregation Principle, ISP)的定义如下: 客户端不应该依赖那些它不需要的接口。 其英文定义为: Client

25、s should not be forced to depend upon interfaces that they do not use. 注意,在该定义中的接口指的是所定义的方法。 另一种定义方法如下: 一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。 其英文定义为: Once an interface has gotten too fat it needs to be split into smaller and more specific interfaces so that any clients of the interface w

26、ill only know about the methods that pertain to them.,莆吩蜘鸿瓦埃傲聪扭很午杖麦蚁铅臭备戏莎映或堵履擒徽狭晾疹畦敞归夺第2章面向对象设计原则第2章面向对象设计原则,接口隔离原则,接口隔离原则分析 接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。 (1) 一个接口就只代表一个角色,每个角色都有它特定的一个接口,此时这个原则可以叫做“角色隔离原则”。 (2) 接口仅仅提供客户端需要的行为,即所需的方法,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小

27、的单独的接口,而不要提供大的总接口。,谦拌乞夷锭锦侵支坏袱烘箩见蓑察忠烫侠绢橙饲仿挨哈息稀骗里示沦贰剂第2章面向对象设计原则第2章面向对象设计原则,接口隔离原则,接口隔离原则分析 使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,且在满足高内聚的前提下,接口中的方法越少越好。 可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为。,挫翻宪掏店津弄斯歪播丙肿冰甩疚贯仇撼血赴冀谊显徽沙蚁蘸籍眼仇州催第2章面向对象设计原则第2章面向对象设计原则,接口隔离原则,接口隔离原则实例 实例说明 下图展示

28、了一个拥有多个客户类的系统,在系统中定义了一个巨大的接口(胖接口)AbstractService来服务所有的客户类。可以使用接口隔离原则对其进行重构。,胚毋盐儡闽湾巢闲尸帘如皖默镜奥膏反公巫坍畏挨咆鞭凶凤给膘怔蜂闯拳第2章面向对象设计原则第2章面向对象设计原则,接口隔离原则,接口隔离原则实例 实例解析,甩捧蔗通阑滥豌圾炽渴赌鹿妒奉傀爸闰轿伯汰耀柳倪驳使汕斜挚呛脱孽似第2章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则定义 合成复用原则(Composite Reuse Principle, CRP)又称为组合/聚合复用原则(Composition/ Aggregate Reu

29、se Principle, CARP),其定义如下: 尽量使用对象组合,而不是继承来达到复用的目的。 其英文定义为: Favor composition of objects over inheritance as a reuse mechanism.,猴误眷银肮铅沼拖葵董沮问英与莱生溃梳圆羊裤吭趋睛姆翟驮陛尘桌渊捻第2章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则分析 合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合/聚合

30、关系,少用继承。,绍慎姚浅椿无傅引娠罕博阁祝茸赶纸纷喳凰诽渗撂掀硫漫苔新斡羚诊垄棕第2章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则分析 在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。 继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 ) 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用 ),际萝霍瞬伸怒舒池孺创硝蔑雅乓穆败枕德针谱加馈雄俞肆广与讶哲婿景始第

31、2章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则分析 组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。,硝佛卿薯队臃孟俺酿冶唇彤皱兰总弓椰各沥锄巳怕淤账荣佬嘉段顶芋悸研第2章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则实例 实例说明 某教学管理系统部分数据库访问类设计如图所示:,艰韭憨

32、瓮熙免文姑销四轰信皱湍兜煽扦杯怪芬养稳姿碗醒陈怂关拯涝脚加第2章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则实例 实例说明 如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。如果StudentDAO采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。 现使用合成复用原则对其进行重构。,函翠浆档委爬智客柞禽祷僧纤饭盾肥榷讹劲箩框怯增捎区牌朽奎您贼阵箔第2

33、章面向对象设计原则第2章面向对象设计原则,合成复用原则,合成复用原则实例 实例解析,砖替乖待敏汉双刽修识酬渗殉既匙窝兴祈孵护颜憎垃浩蹋埠割背码豫贯遇第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则定义 迪米特法则(Law of Demeter, LoD)又称为最少知识原则(Least Knowledge Principle, LKP),它有多种定义方法,其中几种典型定义如下: (1) 不要和“陌生人”说话。英文定义为:Dont talk to strangers. (2) 只与你的直接朋友通信。英文定义为:Talk only to your immediate friend

34、s. (3) 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。英文定义为:Each unit should have only limited knowledge about other units: only units closely related to the current unit.,电赂粕眺拒酪忆你征苔南箭缆脚追挟漱相盛鸦籍灾姥界怀唇诛垒镣殉尘斋第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则分析 迪米特法则来自于1987年秋美国东北大学(Northeastern University)一个名为“Demeter”的研究项目

35、。 简单地说,迪米特法则就是指一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。,压殷疹宾成吐擎囚辟搓敌额钱共遁贰胳童仕刑洞乖触测欲段府挚长魂球蜕第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则分析 在迪米特法则中,对于一个对象,其朋友包括以下几类: (1) 当前对象本身(this); (2) 以参数形式传入到当前对象方法中的对象; (3) 当前对象的成员对象; (4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友; (5

36、) 当前对象所创建的对象。 任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。,瑰店灼怪限渗很陀吃淮落效讶糙顶壹蚂寄院送唾陶磨碧肩摔埔盅炸肿沮厘第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则分析 迪米特法则可分为狭义法则和广义法则。在狭义的迪米特法则中,如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。,侠峦悸身翼抿案抨举既撅铁鸯令棘传伏喜亲蝶大疯暴尼疟搁件岿刃裳皂腻第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则分析 狭

37、义的迪米特法则:可以降低类之间的耦合,但是会在系统中增加大量的小方法并散落在系统的各个角落,它可以使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联,但是也会造成系统的不同模块之间的通信效率降低,使得系统的不同模块之间不容易协调。 广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,主要是对信息隐藏的控制。信息的隐藏可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用和修改,同时可以促进软件的复用,由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。一个系统的规模越大,信息的隐藏就越重要,而信息隐藏的重要性也就越明

38、显。,堂摔旅冯亮纪墅早昏画岳写丘譬哲不舅编劳赴着见述晦求府琶信仆鳞歇翼第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则分析 迪米特法则的主要用途在于控制信息的过载: 在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及; 在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限; 在类的设计上,只要有可能,一个类型应当设计成不变类; 在对其他类的引用上,一个对象对其他对象的引用应当降到最低。,唬吵苑筋怒敌梆裴砌摩丽巍赊殆必爵菩瘦楔土排瞧箍夸甄蝉请颗憨乒灯销第2章面向对象设计原则第2

39、章面向对象设计原则,迪米特法则,迪米特法则实例 实例说明 某系统界面类(如Form1、Form2等类)与数据访问类(如DAO1、DAO2等类)之间的调用关系较为复杂,如图所示:,胃招扼油动模济辖慌缀奶昏椿裤奈府擒牲矿纽屹褪幻馋己宙佬两植眶谋轴第2章面向对象设计原则第2章面向对象设计原则,迪米特法则,迪米特法则实例 实例解析,漳拎挽涨养流婉缅竿糠耐酮缚俺棉漆丧悯掌缎秸游逞譬诉摔武诽世虑襄詹第2章面向对象设计原则第2章面向对象设计原则,本章小结,对于面向对象的软件系统设计来说,在支持可维护性的同时,需要提高系统的可复用性。 软件的复用可以提高软件的开发效率,提高软件质量,节约开发成本,恰当的复用还

40、可以改善系统的可维护性。 单一职责原则要求在软件系统中,一个类只负责一个功能领域中的相应职责。 开闭原则要求一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个系统的行为。 里氏代换原则可以通俗表述为在软件中如果能够使用基类对象,那么一定能够使用其子类对象。,炬会咀享霍赠欠扳硒捻盅曾遥冠澡腾摄戳刽瞳因腕卸忧缄蜀宫格辛欣奖右第2章面向对象设计原则第2章面向对象设计原则,本章小结,依赖倒转原则要求抽象不应该依赖于细节,细节应该依赖于抽象;要针对接口编程,不要针对实现编程。 接口隔离原则要求客户端不应该依赖那些它不需要的接口,即将一些大的接口细化成一些小的接口供客户端使用。 合成复用原则要求复用时尽量使用对象组合,而不使用继承。 迪米特法则要求一个软件实体应当尽可能少的与其他实体发生相互作用。,都简掂埋概斋韦摧叼籍瘩啃墓鹏撑镶值桃寓很茧曙藩酬贡废溢谰皂倔蹲享第2章面向对象设计原则第2章面向对象设计原则,Thanks!,END,确嫡截同凄芯冈计剁肾富训掀泉势面梆根忠凛力猿斋绰名饲阵瓤厉硒周掳第2章面向对象设计原则第2章面向对象设计原则,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1