每当我看到有关得墨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:Band
和Guitarist
都应视为同一模块的一部分,并且应基于最大的便利性来确定所遇到的难题。
您的问题是一个更广泛的问题的一个例子,我在有关设计模式等的书籍中经常遇到这个问题:它们试图解释涉及复杂系统设计的范围广泛的原理,这些问题涉及可笑的尺寸过小的问题。结果只是读者的困惑。
实际上您会看到该原理实际上是这样的:您正在使用AsyncHttpClient
,这是在Netty
之上构建的抽象,这是在Java NIO之上构建的抽象。现在,如果AsyncHttpClient
的API迫使您在某个地方直接管理Java NIO对象,该对象的API更加原始,并且处理了AsyncHttpClient
完全陌生的概念,那将是打破LoD的一个示例。