对得墨忒耳原理定律感到困惑
本文关键字:定律 | 更新日期: 2023-09-27 18:33:32
为了解释我的问题,让我向您展示使用C#的示例代码。
interface IConstructorInfoSelector
{
//ConstructorInfo is System.Reflection.ConstructorInfo class.
ConstructorInfo SelectConstructorInfo(Type declaringType);
}
class TestClass
{
private readonly ConstructorInfo _constructorInfo;
public TestClass(IConstructorInfoSelector constructorInfoSelector, Type type)
{
//Let the line to (A)
_constructorInfo = constructorInfoSelector.SelectConstructorInfo(type);
}
public TestClass(ConstructorInfo constructorInfo)
{
_constructorInfo = constructorInfo;
}
public Type GetTypeForConstructor()
{
//Let the line to (B)
return _constructorInfo.DeclaringType;
}
}
在示例中,如果我使用 ctor(IConstructorInfoSelector, Type) 构造 TestClass 并调用 GetTypeForConstructor,它将通过行 (A) 和 (B) 违反 LoD(得墨忒耳定律)。
但是,如果我执行以下代码,代码是否违反 LoD?我认为一方面,它没有违反,因为 (C) 行的 testClass 对象是在方法中初始化的,并且调用了 GetTypeForConstructor 方法,另一方面,它似乎违反了上述情况的原则。综上所述,如果使用返回对象创建另一个对象,则此执行将被视为违反LoD?
class LoDQuestionForTestClass
{
public void DeosThisVoliateTheLoD()
{
IConstructorInfoSelector concreteSelector = ...;
Type testType = ...;
var selectConstructorInfo = concreteSelector.SelectConstructorInfo(testType);
//Let the line to (C)
var testClass = new TestClass(selectConstructorInfo);
var result = testClass.GetTypeForConstructor();
}
}
如果一个对象依赖于第三个对象提供的另一个对象的行为,则违反了 LoD。其民粹主义版本是"不要相信朋友的朋友"
在第二个示例中,您有另一个对象,具体取决于第三方提供的对象,因此是的,这确实违反了"不要信任朋友的朋友",除非selectConstructorInfo
仅用于其价值。
值得注意的是,LoD 是为特定项目 (Demeter) 创建的,并且最严格的形式可能不适用于任何其他项目。