六大设计原则之迪米特法则 1987年秋天,迪米特法则由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等人普及 。后来,因为经典著作The Pragmatic Programmer而广为人知 。
迪米特法则 (Law of Demeter,LoD)又称为 最少知识原则 (Least KnowledgePrinciple,LKP),是指一个对象类对于其他对象类来说,知道得越少越好 。也就是说,两个类之间不要有过多的耦合关系,保持最少关联性 。
迪米特法则有一句经典语录:只和朋友通信,不和陌生人说话 。也就是说,有 内在关联的类要内聚,没有直接关系的类要低耦合。
就像家里的水管装修,有洗衣机地漏、卫生间地漏、厨房地漏,但它们最终都汇到同一个污水处理系统里 。在平常使用时,我们不会考虑这些水管是怎么关联流向的,只需要考虑最上层的使用即可 。
设计模式中的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子
迪米特法则要求限制软件实体之间通信的宽度和深度,正确使用迪米特法则将有以下两个优点 。
从迪米特法则的定义和特点可知,它强调以下两点:
广义的迪米特法则在类的设计上的体现:
这里用模拟学生、老师、校长之间关系的例子来说明迪米特法则来举例:
老师需要负责具体某一个学生的学习情况,而校长会关心老师所在班级的总体成绩 。
违背原则的方案:
学生类:
老师类:
校长类:
校长想知道一个班级的总分和平均分,是应该找老师要,还是跟每一个学生要再进行统计呢?显然是应该找具体的班主任老师 。我们在实际开发时,容易忽略这样的真实情况
迪米特法则改造方案:
老师类
校长类:
校长类直接调用老师类的接口,并获取相应的信息 。这样一来,整个功能逻辑就非常清晰了 。
在运用迪米特法则时要注意以下 6 点
缺点
迪米特法则是一种面向对象系统设计风格的一种法则,尤其适合做大型复杂系统设计指导原则 。但是也会造成系统的不同模块之间的通信效率降低,使系统的不同模块之间不容易协调等缺点 。
同时,因为迪米特法则要求类与类之间尽量不直接通信,如果类之间需要通信就通过第三方转发的方式,这就直接导致了 系统中存在大量的中介类,这些类存在的唯一原因是为了传递类与类之间的相互调用关系,这就毫无疑问的增加了系统的复杂度 。解决这个问题的方式是: 使用依赖倒转原则,这样就可以使调用方和被调用方之间有了一个抽象层,被调用方在遵循抽象层的前提下就可以自由的变化,此时抽象层成了调用方的朋友 。
文章插图
迪米特法则迪米特法则的定义:
也被称为最少知识原则(Least knowledge Principle,LKP)
也可以表述为 一个对象应该对其他对象有最少的了解,即一个类应该对自己需要耦合或调用的类知道的最少
4层含义:
1、只和朋友交流(Only talk to your immediate friends)
在类之间,什么样的类算作朋友呢?
出现在成员变量、方法的输入输出参数中的类称为成员朋友类 。而出现在方法体内部的类不属于朋友类 。
2、朋友之间也是有距离的
不能暴露太多,否则二次修改的时候,会让影响的范围增大 。
这也要求类间public方法不能肆无忌惮的暴露
3、是自己的就是自己的
如果一个方法在类间关系中,放在自身类中既不增加类间关系,也对本类不产生负面影响就放置在自身类中 。
4、谨慎进行序列化操作
针对RMI(Remote Method Invocation)
最佳实践:
迪米特法则的核心在于类间的解耦,只有弱耦合之后类的复用率才会提高 。其要求的结果就是产生大量的中转或跳转类 。
迪米特法则(LoD) 迪米特原则(Law of Demeter,LoD),也叫最少知识原则(Low knowledge Principle,LKP):
一个对象应该对其他对象有最少的了解 。
迪米特原则对类的低耦合提出了明确的要求:
迪米特原则还有一个解释:Only talk to your immediate friends(只与直接朋友通信) 。
什么叫直接朋友呢?每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系类型有很多,例如:组合,聚合,依赖等 。朋友类也可以这样定义:出现在成员变量,方法的输入输出参数中的类,称为朋友类 。
上体育课,我们经常有这样一个场景:
秒懂生活扩展阅读
- 松狮和泰迪哪个好
- 迪迦奥特曼厉害吗
- 迪拜|在迪拜看到身穿黑袍的女性,为何不能去搭话?导游:别惹麻烦
- 上海好玩的地方适合学生
- 迪士尼早鸟票什么意思
- 李迪迪被打怎么回事?李迪迪为什么会被别人打?
- 上海迪士尼乐园的梦幻世界
- 奔驰c和奥迪a4l怎么选
- 夸迪属于什么档次 夸迪真的那么好用吗
- 潘若迪 prd