每当我看到有关得墨meter耳定律的文章时,作者似乎都没有给出如何遵守该定律的可靠例子。他们都解释了这是什么,并展示了一个违法的例子,但这很容易。

可能有很多方法可以遵守该法则(好的设计和计划就是其中之一),但是用很简单的话来说,这是一种可以遵循该法则的方法吗?

假设我有一个具有以下属性的类:

public class Band {

    private Singer singer;
    private Drummer drummer;
    private Guitarist guitarist;
}

我在程序中的某个位置,并且有一个Band类的实例,我想要吉他手的名字,我通常看到的是这样的:
guitaristName = band.getGuitarist().getName();

那似乎并不算太​​糟糕,因为它没有深入到链中,但是Demeter的法则说也许应该这样:
guitaristName = band.getGuitaristName();

我的Band类有一个方法:
public String getGuitaristName() {
    return guitarist.getName();
}

这是您应该遵守的法律吗?

谢谢。

最佳答案

您未在适当的级别上应用LoD:BandGuitarist都应视为同一模块的一部分,并且应基于最大的便利性来确定所遇到的难题。

您的问题是一个更广泛的问题的一个例子,我在有关设计模式等的书籍中经常遇到这个问题:它们试图解释涉及复杂系统设计的范围广泛的原理,这些问题涉及可笑的尺寸过小的问题。结果只是读者的困惑。

实际上您会看到该原理实际上是这样的:您正在使用AsyncHttpClient,这是在Netty之上构建的抽象,这是在Java NIO之上构建的抽象。现在,如果AsyncHttpClient的API迫使您在某个地方直接管理Java NIO对象,该对象的API更加原始,并且处理了AsyncHttpClient完全陌生的概念,那将是打破LoD的一个示例。

10-07 21:05