(53)--14-8 面向对象设计原则 迪米特法则 面向对象与UML.pdf
-
资源ID:96640247
资源大小:597.79KB
全文页数:20页
- 资源格式: PDF
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
(53)--14-8 面向对象设计原则 迪米特法则 面向对象与UML.pdf
面向对象与面向对象与UML Object-Oriented and UML 面向对象设计原则面向对象设计原则 Object-Oriented Design Principles -3-3-面向对象的基本设计原则面向对象的基本设计原则(1)LSP:Liskov(里氏里氏)替换原则替换原则 Liskov Substitution Principle(2)OCP:开放:开放-封闭原则封闭原则 Open-Close Principle(3)SRP:单一职责原则:单一职责原则 Single Responsibility Principle(4)ISP:接口隔离原则:接口隔离原则 Interface Segregation Principle (5)DIP:依赖倒置原则:依赖倒置原则 Dependency Inversion Principle(6)CARP:组合组合/聚合复用原则聚合复用原则 Composite/Aggregate Reuse Principle(7)LOD(LKP):迪米特法则迪米特法则(最少知道原则最少知道原则)Law of Demeter(Least Knowledge Principle)LOD 迪米特法则迪米特法则(Law of Demeter)或或LKP 最少知道原则最少知道原则)(Least Knowledge Principle)迪米特法则定义迪米特法则定义 迪米特法则迪米特法则(Law of Demeter,LoD)又称为又称为最少知识原则最少知识原则(Least Knowledge Principle,LKP):一个对象应该对其他对象保持最少的一个对象应该对其他对象保持最少的了解。了解。问题由来:问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。改变时,对另一个类的影响也越大。解决方案:解决方案:尽量降低类与类之间的耦合,实现低耦合。尽量降低类与类之间的耦合,实现低耦合。解决途径:解决途径:使用迪米特法则。使用迪米特法则。LOD 迪米特法则迪米特法则 对迪米特法则有多种定义方法,其中几种典型定义如下:对迪米特法则有多种定义方法,其中几种典型定义如下:(1)不要和“陌生人”说话。不要和“陌生人”说话。(2)只与只与直接朋友直接朋友通信。通信。(3)每个软件单元对其它单元尽可能少了解,而且仅限于那些与自己密切相每个软件单元对其它单元尽可能少了解,而且仅限于那些与自己密切相关的单元关的单元。最常用的表述最常用的表述 迪米特法则是迪米特法则是对软件实体之间通信的限制,对软件实体之间通信的限制,它要求限制软件实体之间通它要求限制软件实体之间通信的宽度和深度。体现在信的宽度和深度。体现在一个软件实体应当尽可能少的与其它实体发生一个软件实体应当尽可能少的与其它实体发生相互作用。相互作用。迪米特法则分析迪米特法则分析 在迪米特法则中,对于一个对象(某人),其在迪米特法则中,对于一个对象(某人),其朋友朋友包括以下几类:包括以下几类:(1)当前对象本身当前对象本身(this);(2)以参数形式传入到当前对象方法中的对象;以参数形式传入到当前对象方法中的对象;(3)当前对象的成员对象;当前对象的成员对象;(4)如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;(5)当前对象所创建的对象,调用方法时返回的对象(返回值是对象)。当前对象所创建的对象,调用方法时返回的对象(返回值是对象)。任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”否则就是“陌生人”。每个对象都会与其他对象有耦合关系,只要两个对象之间有每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系耦合关系,就表明这两个对象之间是,就表明这两个对象之间是朋友关系朋友关系。耦合耦合的方式很多,依赖、关联、组合、聚合等。的方式很多,依赖、关联、组合、聚合等。对象中的成员变量、方法参数、方法返回值中的对象称为直接的朋友对象中的成员变量、方法参数、方法返回值中的对象称为直接的朋友,而,而出现在成员方法中的局部对象则不是直接的朋友出现在成员方法中的局部对象则不是直接的朋友。也就是说,陌。也就是说,陌生的类对象最好不要作为局部变量出现在类的内部。生的类对象最好不要作为局部变量出现在类的内部。迪米特法则分析迪米特法则分析 迪米特法则分析迪米特法则分析 迪米特法则可分为迪米特法则可分为狭义法则狭义法则和和广义法则广义法则。狭义的迪米特法则狭义的迪米特法则 如果两个类之间不必彼此直接通信,那么这两个类就不应当发如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以如果其中的一个类需要调用另一个类的某一个方法的话,可以通过通过第三者转发这个调用第三者转发这个调用。yradnuoB sseccA A tcejbOC tcejbOB tcejbOA tcejbO 1.某人与一个朋友组成自己的朋友圈某人与一个朋友组成自己的朋友圈,两个人都需要与一个圈外的陌生,两个人都需要与一个圈外的陌生人发生相互作用,如图人发生相互作用,如图1。2.朋友与陌生人若是朋友,组成朋友朋友与陌生人若是朋友,组成朋友的朋友圈,如图的朋友圈,如图2。某人某人 朋友朋友 陌生人陌生人 某人的朋友圈某人的朋友圈 图图1 图图2 某人某人 朋友朋友 陌生人陌生人 某人的朋友圈某人的朋友圈 朋友的朋友圈朋友的朋友圈 3.迪米特法则迪米特法则建议某人建议某人不要直接不要直接与陌生人直接发生相互作用与陌生人直接发生相互作用,而,而是是通过朋友与之发生间接的相互通过朋友与之发生间接的相互作用作用,如图,如图3。某人某人 朋友朋友 陌生人陌生人 某人的朋友圈某人的朋友圈 朋友的朋友圈朋友的朋友圈 图图3 3.迪米特法则迪米特法则建议某人建议某人不要直不要直接与陌生人直接发生相互作用接与陌生人直接发生相互作用,而是,而是通过朋友与之发生间接通过朋友与之发生间接的相互作用的相互作用,如图,如图3。图图3 某人某人 朋友朋友 陌生人陌生人 某人的朋友圈某人的朋友圈 朋友的朋友圈朋友的朋友圈 此时,此时,“朋友朋友”实际上起到了实际上起到了将将“某人某人”对对“陌生人陌生人”的调的调用转发给用转发给“陌生人陌生人”的作用。的作用。这种传递叫做这种传递叫做调用转发调用转发。所谓。所谓调用转发,需要隐藏调用转发,需要隐藏“陌生人陌生人”的存在,使得的存在,使得“某人某人”仅知道仅知道“朋友朋友”,而不知道,而不知道“陌生陌生人人”。Someone +operation1(Friend friend)Friend +operationg2():void+provide():Stranger Stranger +operation3():void-stranger:Stranger 实例实例1:不满足迪米特法则的系统设计:不满足迪米特法则的系统设计 Someone与与Friend是朋友,而是朋友,而Friend与与Stranger是朋友。是朋友。public class Someone public void operation1(Friend friend)Stranger stranger=friend.provide();stranger.operation3();public class Friend private Stranger stranger =new Stranger();public void operation2()/public Stranger provide()return stranger;public class Stranger public void operation3()/Someone的的operation1方法方法不满足迪不满足迪米特法则米特法则。因为这个方法引用了。因为这个方法引用了Stranger对象对象,而,而Stranger对象不是对象不是Someone的直接朋友。的直接朋友。计算机与控制工程学院计算机与控制工程学院 郭艳燕郭艳燕 Someone +operation1(Friend friend)Friend +operationg2():void+forward():void Stranger +operation3():void-stranger:Stranger 实例实例1:使用迪米特法则进行改造使用迪米特法则进行改造 Someone与与Friend是朋友,而是朋友,而Friend与与Stranger是朋友。是朋友。public class Someone public void operation1(Friend friend)friend.forward();public class Friend private Stranger stranger =new Stranger();public void operation2()/public void forward()stranger.operation3()public class Stranger public void operation3()/Someone的的operation1方法方法满足迪满足迪米特法则,因为只米特法则,因为只与与直接朋友直接朋友Friend对象对象打交道。打交道。Forward方法实方法实现了调用转发现了调用转发 与改造前相比,在与改造前相比,在Someone与与Stranger之间的联系已经没有了。之间的联系已经没有了。Someone不需要不需要知道知道Stranger的存在就可以做同样的事情,的存在就可以做同样的事情,通过它直接朋友的调用转发就可以做到。通过它直接朋友的调用转发就可以做到。计算机与控制工程学院计算机与控制工程学院 实例实例1 使用迪米特法则进行改造后带来的优势:使用迪米特法则进行改造后带来的优势:使用了调用转发,使得调用的具体细节被隐藏在使用了调用转发,使得调用的具体细节被隐藏在Friend内部,从而使内部,从而使Someone与与Stranger之间的直接联系被省略掉了。之间的直接联系被省略掉了。使得系统内部的耦合度降低。在系统的某一个类需要修改时,例如使得系统内部的耦合度降低。在系统的某一个类需要修改时,例如Stranger,仅,仅仅会直接影响到这个类的朋友们仅会直接影响到这个类的朋友们Friend,而不会直接影响到其余部分,而不会直接影响到其余部分Someone。Someone +operation1(Friend friend)Friend +operationg2():void+forward():void Stranger +operation3():void-stranger:Stranger Someone +operation1(Friend friend)Friend +operationg2():void+provide():Stranger Stranger +operation3():void-stranger:Stranger 不符合迪米特不符合迪米特法则的设计法则的设计 符合迪米特符合迪米特法则的设计法则的设计 狭义的迪米特法则狭义的迪米特法则(LoD)的优缺点的优缺点 遵循类之间的迪米特法则会使一个系统的局部设计简化,因为每个局遵循类之间的迪米特法则会使一个系统的局部设计简化,因为每个局部都不会与远距离的对象有直接的关联;部都不会与远距离的对象有直接的关联;但也会造成不同模块之间的但也会造成不同模块之间的通信效率降低,会使系统的不同模块之间不容易协调。通信效率降低,会使系统的不同模块之间不容易协调。遵循迪米特法则遵循迪米特法则可以降低类之间的耦合,可以降低类之间的耦合,但是会在系统中增加大量的但是会在系统中增加大量的小方法并散落在系统的各个角落小方法并散落在系统的各个角落。这些方法仅传递间接的调用,与系。这些方法仅传递间接的调用,与系统的商务逻辑无关。统的商务逻辑无关。当设计师试图从一张类图中看出总体的架构时,当设计师试图从一张类图中看出总体的架构时,这些小方法会造成迷惑和困扰。这些小方法会造成迷惑和困扰。使用迪米特法则时应注意的问题使用迪米特法则时应注意的问题 迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系。的依赖,因此的确可以降低耦合关系。但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生联系。然会通过一个“中介”来发生联系。过分的使用迪米特法则,会产生大量这样的中介和传递类,导致系统过分的使用迪米特法则,会产生大量这样的中介和传递类,导致系统复杂度变大。复杂度变大。所以在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚所以在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚低耦合。低耦合。狭义迪米特法则的改进方法狭义迪米特法则的改进方法 改进办法:与依赖倒置原则互补使用改进办法:与依赖倒置原则互补使用 引入一个抽象的类型引用“抽象陌生人”对象,使“某人”依赖于引入一个抽象的类型引用“抽象陌生人”对象,使“某人”依赖于“抽象陌生人”,亦即将“抽象陌生人”变成“朋友”。“抽象陌生人”,亦即将“抽象陌生人”变成“朋友”。只要新的具体的“陌生人”具有相同的抽象类型,那么某人就无法区只要新的具体的“陌生人”具有相同的抽象类型,那么某人就无法区分它们,从而允许“陌生人”的具体实现可独立于“某人”而变化。分它们,从而允许“陌生人”的具体实现可独立于“某人”而变化。设计模式中的外观模式(门面模设计模式中的外观模式(门面模式)和中介者模式实际上就是迪式)和中介者模式实际上就是迪米特法则的实际应用。米特法则的实际应用。广义的迪米特法则广义的迪米特法则(LoD)广义的迪米特法则:广义的迪米特法则:用于控制信息的过载用于控制信息的过载,强调对,强调对信息隐藏的控制,信息隐藏的控制,充分体现封装的概念充分体现封装的概念。一一个模块设计得好坏的一个重要的标志就是个模块设计得好坏的一个重要的标志就是该模块在多大的程度上将该模块在多大的程度上将自己的内部数据与实现有关的细节隐藏起来自己的内部数据与实现有关的细节隐藏起来。强调信息隐藏的重要性:强调信息隐藏的重要性:可以使各个子系统之间脱耦,从而允许它们可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用和修改,同时可以促进软件的复用。独立地被开发、优化、使用和修改,同时可以促进软件的复用。一个系统的规模越大,信息的隐藏就越重要。一个系统的规模越大,信息的隐藏就越重要。一一个类对自己依赖的类知道的越少越好,对于被依赖的类来说,个类对自己依赖的类知道的越少越好,对于被依赖的类来说,无无论论 逻辑逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的供的public方法,不对外泄漏任何细节信息。方法,不对外泄漏任何细节信息。广义的迪米特法则广义的迪米特法则(LoD)在运用迪米特法则到系统的设计中时在运用迪米特法则到系统的设计中时,要注意以下几要注意以下几点点:(1)在类的划分上,应当尽量创建松耦合的类在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及。成太大波及。(2)在对其它类的引用上,一在对其它类的引用上,一个对象对其它对象的引用应当降到最低个对象对其它对象的引用应当降到最低-尽量尽量降低一个类的访问权限。降低一个类的访问权限。如果一个类可以设置成如果一个类可以设置成packageprivate(默认包默认包内访问)内访问),就不应当将它设置成就不应当将它设置成public。(3)在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限数的访问权限。广义的迪米特法则广义的迪米特法则(LoD)(4)在类的设计上,)在类的设计上,优先考虑将一个优先考虑将一个类设计成不变类(类实例的属性类设计成不变类(类实例的属性是不可改变的)。是不可改变的)。一个对象与外界的通信大体可以分为:改变这个对象一个对象与外界的通信大体可以分为:改变这个对象的状态的和不改变这个对象的状态的。如果一个对象的内部状态根本就的状态的和不改变这个对象的状态的。如果一个对象的内部状态根本就是不可能改变的,那么它与外界的通信自然就少了。是不可能改变的,那么它与外界的通信自然就少了。(5)尽量限制局部变量的有效范围。尽量限制局部变量的有效范围。需要一个变量的时候才声明它,需要一个变量的时候才声明它,可以有效的限制局域变量的有效范围。可以有效的限制局域变量的有效范围。本章小结本章小结