Java 德米特法不适用于本案?
假设我有一个函数,它接受一个对象列表,比如:Java 德米特法不适用于本案?,java,Java,假设我有一个函数,它接受一个对象列表,比如: class A{ C c; C getC(); } Class C{ boolean propBool; boolean getPropBool(); } public void someThing(List<A> lst){ for(A a : lst){ if(a.getC().getPropBool()){ //do some stuff } } } 这里的方法是什么?取决
class A{
C c;
C getC();
}
Class C{
boolean propBool;
boolean getPropBool();
}
public void someThing(List<A> lst){
for(A a : lst){
if(a.getC().getPropBool()){
//do some stuff
}
}
}
这里的方法是什么?取决于您在该
中执行的操作,如果您这样重写代码
for (A a : lst) {
a.getC().doStuff();
}
在C.doStuff()中检查布尔值并实现逻辑。LoD实际上不是一条定律。这实际上只是一个设计原则。它通常是有用的,但决不是普遍适用的。如果您认为它对您的用例不适用(或没有帮助),您可以忽略它。没有人会因为你违反LoD而起诉你
在您的用例中,您需要确定C
是否是A
的实现细节,以及隐藏它是否是一件好事。得墨忒尔定律不能为你回答这个问题。您需要根据用例的具体需求自行决定
但是,如果您决定C
是A
的一个实现细节,并且它应该被隐藏,那么Demeter定律说您应该实现类似于helper函数的东西。在这种情况下,它并非“极其无用”。它有一个特定的目的。。。这是为了隐藏实现细节。我会这样写:
public class A {
private C c;
private C getC() {...}
public getTheProperty() {
return this.getC().getPropBool();
}
}
class C {
private boolean propBool;
boolean getPropBool();
}
(这是其中一种无法同时使用的情况。LoD适用且辅助对象不是无用的,或者不适用。)
请注意,我们无法就是否应在此处应用LoD向您提供建议。你的例子太抽象了。只有在现实的应用程序设计中才能做出有效的判断。我仍然认为这违反了德米特定律。与其说是“定律”,不如说是“指南”;)不要过火,只要运用常识。如果你遵循这个原则,通常其他一切都会遵循。包括他所谓的“松耦合、高内聚”的“德墨忒尔定律”旨在促进。。附言:你的问题的答案必然是一个意见问题。鉴于这是一个虚构的例子,很难说什么是对的或错的。我认为,如果您关心的是函数采用列表
,但它只关心对象C
,那么您应该采用列表
。或者,如果您的应用程序在Java>8上,那么您可以将其设置为Stream
,然后执行操作(a.Stream().map(v->v.getC())代码>基本上,我真正需要的是C
和C.getPropBool()
,但是C
是a
中的一个字段,我得到了一个列表,一个人说你可以更改参数以接收流
(所以给它一个lst.Stream().map(a::getC)
相反,这更有意义,但是助手只有两行,这将是流。anyMatch(C::getPropBool)
,很难决定这里什么是正确的。因此,如果C不是a的隐藏实现细节,那么这就不是LoD适用的情况。在本例中,您的原始版本是正确的(IMO)。从LoD的角度来看,流解决方案与您的原始版本是等效的。回答很好,您能简要解释一下您所说的实现细节的确切含义吗?
?这就像……您希望API的客户端了解并可能依赖于这一方面……还是不了解。对不起,英语不是我的第一语言,哪个API是w基本上,someThing
函数实际上只需要一个列表
,因为如果你看到的话,它根本不关心A
的任何其他字段,但是我有一个列表
而不是列表
。我仍然不确定实现细节是什么someThing
函数只关心C
,而不关心A
public class A {
private C c;
private C getC() {...}
public getTheProperty() {
return this.getC().getPropBool();
}
}
class C {
private boolean propBool;
boolean getPropBool();
}