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)
我不会做前两个(无论是否是'官方'违规行为),但对于枚举不太确定.
我无法回答关于枚举的问题 - 我似乎记得标准建议不是在类中定义枚举.
对于属性,您可以将属性视为方法(getProperty()和setProperty(value))的快捷方式.在这种情况下,您的答案是属性访问是违规.
对于字段(变量),再一次,通常的做法不是暴露它们而是使用属性,实际暴露字段是违反封装的.
但最终,德米特定律的目的是限制类之间的实现知识.对我而言,这意味着您的所有示例都是违规行为.