对得墨忒耳原理定律感到困惑

本文关键字:定律 | 更新日期: 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) 创建的,并且最严格的形式可能不适用于任何其他项目。