Question

La description LOD Je l'ai vu (par exemple, Wikipedia , C2 Wiki ) parler de ne pas appeler des méthodes. Pour citer Wikipedia:

  

La loi de Déméter pour les fonctions exige qu'une méthode M d'un objet O peut uniquement appeler les méthodes des types d'objets suivants:
  - O lui-même
  - les paramètres de M
  - tout objet créé / instancié au sein de M
  - O objets composant direct
  - une variable globale, accessible par O, dans le champ d'application de M

Mais qu'en est-accès aux propriétés, variables ou é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 a-t / toutes ces violations de LOD? (Ignorer l'accès 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.

Était-ce utile?

La solution

Je ne peux pas répondre à la question de ENUM -. Je me souviens que la recommandation standard est de ne pas définir énumérations à l'intérieur d'une classe

Pour les propriétés, vous pouvez vraiment envisager des propriétés comme des raccourcis vers des méthodes (getProperty() et setProperty(value)). Dans ce cas, votre réponse est que la propriété des accès sont des violations.

Pour les champs (variables), une fois encore, la pratique courante est de ne pas les exposer, mais plutôt à utiliser les propriétés, ce qui expose vraiment des champs est une violation de l'encapsulation.

En fin de compte, l'intention de la loi de Déméter est de limiter la connaissance de la mise en œuvre entre les classes. Pour moi, cela signifie que tous vos exemples sont des violations.

Autres conseils

FWIW ...

Violation # 1 (x) ressemble à un modèle d'emplacement de service difficile, donc je pense que l'exemple n'est pas une violation.

Violation # 2 (y) ressemble à une odeur de conception de classe, mais généralement ne montre pas tout ce qui précède que la violation # 1 montre.

Je ne pense pas que les énumérations publiques (z), mais ils sont scope, compterait contre LOD ici.

Avez-vous un meilleur exemple du monde réel pour démontrer vos préoccupations? Sans contexte, des exemples simples de code pourrait être ok, ou ils pourraient violer les principes de conception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top