java - 什么是得墨忒耳法则?

标签 java c# oop law-of-demeter

让我们从维基百科开始:

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:

  1. O itself
  2. m's parameters
  3. Any objects created/instantiated within m
  4. O's direct component objects
  5. 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/

相关文章:

java - 运行 MT4J 时出错

没有图标的 JavaFX 对话框

c# - 如何循环遍历所有目录中的所有文件并仅获取文件的类型?

java - 我需要帮助在 Java 中复制一个对象

javascript - 设计模式: extending jQuery objects with chaining + namespacing

python - 如何定义当用户在 TextInput 中输入文本并在 Kivy 中按 Enter 时会发生什么?

java - 线程中出现异常 "main"java.lang.IndexOutOfBoundsException

java - 为什么 Android Studio 不自动导入正确的包 android.support.v4.app.Fragment

c# - await 方法中的取消 token

c# - IL 代码与 IL 程序集 : is there a difference?