Pregunta ¿La Ley de Deméter solo se aplica a los métodos?


La descripción de LOD que he visto (por ejemplo, Wikipedia, C2 Wiki) Hablar sobre los métodos de no llamar. Para citar Wikipedia:

La Ley de Demeter para funciones requiere que un método M de un objeto O pueda solo invocar los metodos de los siguientes tipos de objetos:
  - O en sí
  - Parámetros de M
  - cualquier objeto creado / instanciado dentro de M
  - Objetos componentes directos 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";
}

¿Alguna o todas estas violaciones de LOD? (Ignore el acceso directo a la variable por ahora, si puede ...)

void Violate(FirstClass first) {
    SecondClass second = first.GetRelatedClass();
    var x = second.Property;
    var y = second._variable;
    var z = FirstClass.InnerEnum.Violated;
}

Yo no haría las dos primeras (ya sean violaciones "oficiales" o no), aunque no tan seguro acerca de la enumeración.


5
2017-10-21 16:19


origen


Respuestas:


No puedo responder a la pregunta enum: parece recordar que la recomendación estándar no es definir enums dentro de una clase.

Para las propiedades, realmente puede considerar que las propiedades son accesos directos a métodos (getProperty() y setProperty(value)) En ese caso, su respuesta es que los accesos a propiedades son violaciones.

Para los campos (variables), una vez más, la práctica común es no exponerlos sino utilizar propiedades, realmente exponer campos es una violación de la encapsulación.

Sin embargo, en última instancia, la intención de la Ley de Demeter es limitar el conocimiento de la implementación entre clases. Para mí eso significa que todos tus ejemplos son violaciones.


6
2017-10-21 16:30



FWIW ...

La infracción n. ° 1 (x) parece un patrón de ubicación de servicio aproximado, por lo que sospecho que el ejemplo no es una infracción.

La infracción n. ° 2 (y) parece un olor de diseño de clase, pero en general no demuestra nada por encima de lo que demuestra la violación n. ° 1.

No creo que las enumeraciones públicas (z), sin embargo, estén sujetas al alcance, cuenten en contra de LOD aquí.

¿Tienes un mejor ejemplo del mundo real para demostrar tus preocupaciones? Sin un contexto adecuado, los ejemplos de código simple podrían estar bien, o podrían violar los principios de diseño.


1
2017-10-21 16:31