1

为了解释我的问题,让我向您展示 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(Demeter 法则)。

但是,如果我执行以下代码,该代码是否违反了 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();
    }
}
4

1 回答 1

2

如果一个对象依赖于由第三个对象提供的另一个对象的行为,则您违反了 LoD。其民粹版本是“不要相信朋友的朋友”

在您的第二个示例中,您有另一个对象,该对象取决于第三方提供的对象,因此是的,这确实违反了“不信任朋友的朋友”,除非仅用selectConstructorInfo于其价值。

值得注意的是,LoD 是为特定项目(Demeter)创建的,并且它最严格的形式可能不适用于任何其他项目。

于 2012-05-08T06:37:17.743 回答