德米特定律是否仅适用于方法?

Gra*_*ton 5 c# oop law-of-demeter

我见过的LOD描述(例如,Wikipedia,C2 Wiki)谈论的不是调用方法.引用维基百科:

函数的Demeter定律要求对象O的方法M 只能调用以下类型对象的方法:
- O本身
- M的参数
- 在M
-O的直接组件对象中创建/实例化的任何对象
- 全局变量可由O访问,在M的范围内

但是访问属性,变量或枚举呢?例如,鉴于此:

class FirstClass {
    public SecondClass GetRelatedClass() {
        return new SecondClass();
    }

    public enum InnerEnum {
        Violated,
        NotViolated
    }
}

class SecondClass {
    public int Property {get; set;}
    public string _variable = "Danny Demeter";
}
Run Code Online (Sandbox Code Playgroud)

是否存在任何/所有LOD违规行为?(暂时忽略直接变量访问,如果可以..)

void Violate(FirstClass first) {
    SecondClass second = first.GetRelatedClass();
    var x = second.Property;
    var y = second._variable;
    var z = FirstClass.InnerEnum.Violated;
}
Run Code Online (Sandbox Code Playgroud)

我不会做前两个(无论是否是'官方'违规行为),但对于枚举不太确定.

Chr*_*fer 6

我无法回答关于枚举的问题 - 我似乎记得标准建议不是在类中定义枚举.

对于属性,您可以将属性视为方法(getProperty()setProperty(value))的快捷方式.在这种情况下,您的答案是属性访问是违规.

对于字段(变量),再一次,通常的做法不是暴露它们而是使用属性,实际暴露字段是违反封装的.

但最终,德米特定律的目的是限制类之间的实现知识.对我而言,这意味着您的所有示例都是违规行为.