我见过的 LOD 描述(例如Wikipedia、C2 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;
}
我不会做前两个(无论是否“官方”违规),但对枚举不太确定。