让我们从维基百科开始:
More formally, the Law of Demeter for functions requires that a method m of an object O may only invoke the methods of the following kinds of objects:
- O itself
- m's parameters
- Any objects created/instantiated within m
- O's direct component objects
- A global variable, accessible by O, in the scope of m
规则 1:
public class ClassOne {
public void method1() {
method2();
}
public void method2() {
}
}
规则 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() {
}
}
规则 5:
?
谁能帮我解决规则 5?
Demeter 法则不是暗示链接是不好的吗?
User.getName().getLastName();
这会导致高耦合。
“告诉,不要问”不是类似的原则吗?
这就是一切吗?我错了什么吗?你怎么能遵守得墨忒耳法则呢?
最佳答案
“告诉不要问”有点不同。
得墨忒耳:不要为了得到某事而从中得到某事,从而在最终的事情上做某事。
TDA:不要从另一个对象中检索“信息”然后据此做出决定。简单示例:
if (someList.size() == 0) { bla
对比
if (someList.isEmpty()) { bla
在这两种情况下,您都在调用其他对象的方法;但是有一个关键的区别:第一个调用向您公开了另一个对象的“内部”状态;然后你做出一些决定。鉴于,在“TDA”改进的第二个版本中;您将“状态评估”留在其他对象中;从而以某种方式减少耦合。
但仅作记录:第二个示例仍然根据该列表的状态做出决定。从这个角度来看,它只是比选项 1 稍微更好的版本。理想情况下,您不需要此类检查。
关于java - 什么是得墨忒耳法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925357/