使用函数的得墨忒耳法则来解耦
来源:互联网 发布:新网域名转入万网 编辑:程序博客网 时间:2024/05/22 09:41
迪米特原则
编写“羞怯”的代码:
包含两层意思,一个是不向别人暴露你自己,不会没必要的向其他模块暴露任何事情;另一个是不与太多人打交道,不依赖于其他模块实现的模块。
不与太多人打交道,说的就是要降低与别人的耦合,比如你的模块A依赖于一个模块B的功能,那么你就仅仅调用这个模块B的功能,而不要调用这个模块的实现中出现的模块C的功能,因为,一旦B的模块实现方式改变,那么C可能不存在,或者C出现了变动,那么它的影响就不仅仅是B,还有A也受到了影响。而如果A只调用B,则即使B的实现去掉了C模块,那么只要B的接口不变,那么A是不受影响的,或者如果C变了,那么由于A只调用B,则C的变动影响的只会是B,而不会影响A。因此,耦合性强的系统,改变代码将会变得非常困难,牵一发而动全身。
函数的得墨忒耳法则试图使任何给定程序中的模块之间的耦合减至最少,它设法阻止你为了获得对第三个对象的方法的访问而进入某个对象。
法则规定:某个对象的任何方法都应该只调用属于以下情况的方法:
1.这个对象自己拥有的方法;
2.传入该方法的参数的方法;
3.该方法创建的对象的方法;
4.该对象直接拥有的对象的方法;
代码如下:
class
A{
private
B b =
new
B();
private
void
methodE(){}
public
void
methodA(C c){
D d =
new
D();
methodE();
//1这个对象自己拥有的方法,可调用
c.print();
//2传入该方法的参数的方法,可调用
d.invert();
//3该方法创建的对象的方法,可调用
b.kill();
//4该对象直接拥有的对象的方法,可调用
F f = b.getF();
f.rock();
//5 <span style="color: #ff0000;">该对象依赖对象的实现的模块,不可调用。</span>
}
}
当然,得墨忒耳定律中,由于不建议调用依赖模块B的实现的模块C,因此,你不得不编写大量的包装方法,这些方法只是把请求转发给被委托者。存在运行时代价和空间开销,如果你很在乎这些,那么你不得不在性能和可维护性灵活性之间做个平衡,比如为了性能而使某些模块紧密耦合。呵呵,有时为了性能不得不‘反规范化’,就像在数据库设计中,为了提高访问速度,避免联合查询,而对某些字段采用冗余一样。
附件:维基百科对“得墨忒耳定律”的解释
得墨忒耳定律(Law of Demeter,缩写LoD)也叫做“最少知识原则”,是一种开发软件的设计原理,特别是面向对象的程序设计,得墨忒耳定律是松耦合的一种特殊情况。该指导原则是1987年末在美国东北大学发明的,该原则可以简单地概括为以下方式之一:
1每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元;
2每个单元只能和它的朋友交谈:不能和陌生单元交谈;
3只和自己直接的朋友交谈。 这个原理的名称来源于希腊神话中的农业女神,孤独的得墨忒耳。
ps: Law of Demeter, 中文翻译 迪米特 或者 得墨忒耳 法则,貌似翻译为前者的比较多,但是程序员修炼之道中翻译为后者。
- 使用函数的得墨忒耳法则来解耦
- 函数的得墨忒耳法则
- 函数的得墨忒耳法则
- 函数的得墨忒耳法则(转)
- 得墨忒耳法则(迪米特法则)
- 得墨忒耳法则
- 使用__doPostBack函数的一点小心得
- fgets函数的小心得
- 011 复合函数的极限运算法则
- 多元复合函数的求导法则
- 高数 02.02函数的求导法则
- 墨菲定律、二八法则、马太效应、手表定理、“不值得”定律等左右人生的金科玉律。
- 使用递归的四条基本法则
- 使用递归的四条基本法则
- 十二大著名法则 三、不值得定律
- 镜子法则--看得人泪流满面!
- 关于构造函数的几点心得
- 讲得好的核函数
- Exception in thread "main" java.lang.RuntimeException: Stub!
- java中编码方式的总结
- 黑客入侵里约政府官网抗议奥运:比赛会伤害城市
- 【53】字符流中第一个不重复的字符
- HDOJ 1042 N!
- 使用函数的得墨忒耳法则来解耦
- 杭电多校赛 contests 4 Rower Bo
- 去除数字里多余的零
- FreeMarker 文件中不能调用JAVA静态函数
- elasticsearch源码分析之客户端(三)
- Android Telephony分析(七) ---- 接口扩展(异步转同步)
- 点击ListView中某个Item按钮,并且修改这个item的内容
- C#连接Oracle数据库(直接引用dll使用)
- 神经网络学习的原理与在OpenCV中的应用