La descripción de LOD que he visto (por ejemplo, Wikipedia, C2 Wiki) habla sobre métodos de no llamada. Para citar a Wikipedia:¿La Ley de Demeter solo se aplica a los métodos?
La Ley de Demeter de funciones requiere que un método M de un objeto O puede solamente invocar los métodos de los siguientes tipos de objetos:
- O sí
- parámetros de M
- cualquier objeto creado/M instanciados dentro
- objetos componente directa de O
- una variable global, accesible por O, en el ámbito de M
¿Pero qué pasa con el acceso a propiedades, variables o enumeraciones? Por ejemplo, dado esto:
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";
}
¿Hay alguna o todas estas infracciones de LOD? (No haga caso de la variable de acceso directo por ahora, si se puede ..)
void Violate(FirstClass first) {
SecondClass second = first.GetRelatedClass();
var x = second.Property;
var y = second._variable;
var z = FirstClass.InnerEnum.Violated;
}
que no haría las primeras dos (si violaciónes 'oficiales' o no), no es tan seguro acerca de la enumeración sin embargo.
De hecho. La razón por la cual C2 Wiki no habla de variables de instancia, campos, propiedades, enumeraciones, atributos, ranuras, etc. es simplemente porque una gran parte de los miembros de esa comunidad son antiguos Smalltalkers, de todos modos, todos son privados. Los campos, atributos, variables de instancia, ranuras o lo que se les llame son isomorfos a un par de métodos getter/setter de todos modos, y como * are * isomorphic debe ser obvio que el cambio de un campo a un getter no debería cambiar las propiedades de Demeter de cualquier manera.Un campo debe ser simplemente tratado como un método. –