【发布时间】:2016-06-25 19:42:09
【问题描述】:
让我们从维基百科开始:
更正式地说,函数的得墨忒耳定律要求对象 O 的方法 m 只能调用以下类型对象的方法:
- O 本身
- m的参数
- 在 m 中创建/实例化的任何对象
- O 的直接组件对象
- 一个全局变量,可以被 O 访问,在 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 条规则?
德墨忒耳法则不是暗示链接是不好的吗?
User.getName().getLastName();
这会导致高耦合。
“告诉,不要问”不是类似的原则吗?
这就是一切吗?我错了吗?你怎么能遵守得墨忒耳法则?
【问题讨论】:
-
规则 4 是如果
ClassOne有一个类型为ClassTwo的私有字段(组件),那么您可以从ClassOne中的方法调用该字段上的方法。 -
我知道这是 Java 问题,但所有规则(包括规则 5)都可以在 Kotlin 中定义 gist.github.com/panell/5e1a75746b41f69cf6e2093388e100fc
标签: java c# oop law-of-demeter