5

我见过的 LOD 描述(例如WikipediaC2 Wiki)谈论不调用方法。引用维基百科:

函数的得墨忒耳定律要求对象 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";
}

是否有任何/所有这些 LOD 违规?(如果可以的话,暂时忽略直接变量访问......)

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

我不会做前两个(无论是否“官方”违规),但对枚举不太确定。

4

2 回答 2

6

我无法回答枚举问题——我似乎记得标准建议不是在类中定义枚举。

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

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

但归根结底,得墨忒耳法则的目的是限制类之间的实现知识。对我来说,这意味着你所有的例子都是违规的。

于 2010-10-21T16:30:22.417 回答
1

FWIW...

Violation #1 (x) 看起来像一个粗略的服务位置模式,所以我怀疑这个例子不是违规。

Violation #2 (y) 看起来像是一种类设计的味道,但通常不会显示出任何超出违反 #1 所显示的内容。

我认为公共枚举 (z),无论它们的范围如何,都不会在此处计入 LOD。

你有更好的现实世界的例子来证明你的担忧吗?如果没有适当的上下文,简单的代码示例可能没问题,或者它们可能违反设计原则。

于 2010-10-21T16:31:25.140 回答