Desmitificando el principio de la Ley de Deméter

La ley de Demeter (o el principio de conocimiento mínimo) es una guía de diseño para desarrollar aplicaciones de software. Este principio, que se discutió por primera vez en la Northeastern University en 1987, establece que un objeto nunca debe conocer los detalles internos de otros objetos. Fue diseñado para promover un acoplamiento flexible en los diseños de software.

Tenga en cuenta que el acoplamiento puede definirse como el grado de interdependencia que existe entre los módulos de software y qué tan cerca están conectados entre sí. Cuanto mayor sea el acoplamiento entre los componentes de una aplicación, más difícil será modificarlo y mantenerlo con el tiempo. Siempre es una buena práctica diseñar sistemas que sean más fáciles de probar y mantener al garantizar que los componentes de una aplicación estén acoplados de manera flexible. Puede obtener más información sobre la cohesión y el acoplamiento en mi artículo aquí.

Comprender el principio de la Ley de Deméter

El principio de la Ley de Deméter establece que un módulo no debe tener el conocimiento de los detalles internos de los objetos que manipula. En otras palabras, un componente de software o un objeto no debe tener el conocimiento del funcionamiento interno de otros objetos o componentes. Entendamos la Ley de Deméter con un ejemplo.

Considere tres clases, a saber, A, B y C, y objetos de estas clases, objA, objB y objC, respectivamente. Ahora suponga que objA depende de objB, que a su vez compone objC. En este escenario, objA puede invocar métodos y propiedades de objB pero no objC.

El principio de la Ley de Demeter aprovecha la encapsulación para lograr este aislamiento y reducir el acoplamiento entre los componentes de su aplicación. Esto ayuda a mejorar la calidad del código y promueve la flexibilidad y facilita el mantenimiento del código. El beneficio de adherirse a la Ley de Demeter es que puede crear software que sea fácilmente mantenible y adaptable a cambios futuros.

Considere una clase C que tiene un método M. Ahora suponga que ha creado una instancia de la clase C llamada O. La Ley de Demeter especifica que el método M puede invocar los siguientes tipos de .o una propiedad de una clase debe invocar el siguiente tipo de miembros solamente:

  • El mismo objeto, es decir, el objeto "O" en sí
  • Objetos que se han pasado como argumento al método "M"
  • Objetos locales, es decir, objetos que se han creado dentro del método "M"
  • Objetos globales que son accesibles por el objeto "O"
  • Objetos componentes directos del objeto "O"

Aquí hay una lista de códigos que ilustra una clase y sus miembros que se adhieren al principio de la Ley de Deméter. He mencionado comentarios donde sea aplicable para mayor claridad.

public class LawOfDemeterExample

    {

        //This is an instance in the class scope

        //and hence this instance can be accessed by any members of this class

        AnotherClass instance = new AnotherClass();

       public void SampleMethodFollowingLoD(Test obj)

        {         

            DoNothing(); //This is a valid call as you are calling a method of the same class

             object data = obj.GetData(); //This is also valid since you are calling a method

            //on an instance that has been passed as a parameter           

             int result = instance.GetResult();  //This is also a valid call as you are calling

            //a method on an instance locally created

        }

        private void DoNothing()

        {

            // Write some code here

        }

    }

Aquí están las otras dos clases que necesitaría para compilar el código anterior.

public class AnotherClass

    {

        public int GetResult()

        {

            return -1;

        }

    }

    public class Test

    {

        public object GetData()

        {

            return null;

        }

    }

Ahora, consulte la clase LawOfDemeterExample que se muestra arriba. El código se explica por sí mismo. Quizás ahora se pregunte si la Ley de Deméter se aplica solo a los métodos. La respuesta es no". El principio de la Ley de Deméter se aplica también a las propiedades.

Violaciones del principio de la ley de Demeter

En el primer ejemplo de código explicado anteriormente, comenzamos nuestra discusión sobre este tema adhiriéndonos al principio de la Ley de Deméter. Entendamos lo que sucede cuando no seguimos este principio. Considere este ejemplo de código.

var data = new A().GetObjectB().GetObjectC().GetData();

En este ejemplo, el cliente tendrá que depender de las clases A, B y C. En otras palabras, está acoplado a instancias de las clases A, B y C. Si en el futuro estas clases cambian, tendría problemas como se está exponiendo a cambios que podrían ocurrir en cualquiera de estas clases en el futuro.