让我们从维基百科开始:
更正式地说,函数的德米特定律要求有一种方法m一个物体的O只能调用以下类型对象的方法:
- O itself
- m的参数
- m 内创建/实例化的任何对象
- O 的直接组件对象
- 全局变量,可通过 O 访问,范围为 m
Rule 1:
public class ClassOne {
public void method1() {
method2();
}
public void method2() {
}
}
Rule 2:
public class ClassOne {
public void method1(ClassTwo classTwo) {
classTwo.method2();
}
}
class ClassTwo {
public void method2() {
}
}
规则 3:
public class ClassOne {
public void method1() {
ClassTwo classTwo = new ClassTwo();
classTwo.method2();
}
}
class ClassTwo {
public void method2() {
}
}
规则 4(感谢@juharr):
public class ClassOne {
private ClassTwo classTwo;
public void method1() {
classTwo = new ClassTwo();
classTwo.method2();
}
}
class ClassTwo {
public void method2() {
}
}
Rule 5:
?
谁能帮我解决规则 5 吗?
德米特法则不是暗示链接是不好的吗?
User.getName().getLastName();
这导致高耦合。
“只说,不问”不是类似的原则吗?
这就是一切吗?我是不是搞错了什么?你怎么能遵守德墨忒尔法则呢?
“告诉不要问”有点不同。
Demeter:不要为了得到什么而去做最后的事情。
TDA:不要从另一个对象检索“信息”然后对此做出决定。简单的例子:
if (someList.size() == 0) { bla
vs.
if (someList.isEmpty()) { bla
在这两种情况下,您都在调用其他对象的方法;但有一个关键的区别:第一个调用向您公开了另一个对象的“内部”状态;然后你就可以做出一些决定。鉴于,在“TDA”改进的第二个版本中;您将“状态评估”留在该其他对象中;从而以某种方式减少耦合。
但仅供记录:第二个例子still根据该列表的状态做出决定。从这个角度来说,这只是一个slightly比选项 1 更好的版本。理想情况下,您不需要此类检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)