La description LOD que j'ai vu (par exemple, Wikipedia, C2 Wiki) parle de ne pas appeler des méthodes. Pour citer Wikipedia:La loi de Demeter ne s'applique-t-elle qu'aux méthodes?
La loi de Déméter pour les fonctions exige qu'une méthode M d'un objet O peut n'invoquer les méthodes des types d'objets suivants:
- O se
- paramètres de M
- tout objet créé/instanciés à l'intérieur de M
- O objets de composante directe de
- une variable globale, accessible par O, dans le champ d'application de M
Mais qu'en est-il de l'accès aux propriétés, aux variables ou aux énumérations? Par exemple, étant donné ceci:
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";
}
Y at-il une ou toutes ces violations LOD? (Ignorer l'accès à une variable directe pour l'instant, si vous le pouvez ..)
void Violate(FirstClass first) {
SecondClass second = first.GetRelatedClass();
var x = second.Property;
var y = second._variable;
var z = FirstClass.InnerEnum.Violated;
}
Je ne ferais pas les deux premiers (si les violations « officielles » ou non), pas tout à fait sûr de l'ENUM bien.
En effet. La raison pour laquelle le C2 Wiki ne parle pas de variables d'instance, de champs, de propriétés, d'enums, d'attributs, d'emplacements, etc. est simplement qu'une grande partie des membres de cette communauté sont de vieux Smalltalkers. Les champs, les attributs, les variables d'instance, les slots ou tout ce qu'ils appellent sont de toute façon isomorphes à une paire de méthodes getter/setter, et comme ils sont * isomorphes, il devrait être évident que les changements de champs ne doivent pas changer. les propriétés Demeter en aucune façon.Un champ devrait être simplement traité comme une méthode. –