Ley de Démeter - Tensho97/Aprende-a-Aprender GitHub Wiki

La Ley de Démeter es un principio básico de la programación orientada a objetos.

Formalmente, la Ley de Demeter dice que un método de un objeto solo puede llamar a métodos de:

  1. El propio objeto.
  2. Un argumento del método.
  3. Cualquier objeto creado dentro del método.
  4. Cualquier propiedad/campo directo del propio objeto.

“Habla solo con tus amigos cercanos. No hables con extraños.”

Ejemplos: Aquí vamos a ver algunos ejemplos de la ley en acción

Primer ejemplo:

public final class NetworkConnection {
    public void close() {
        sendShutdownMessage(); // PERMITIDO?
    }
    private void sendShutdownMessage() {
        ...
    }
}

El método sendShutdownMessage() obviamente está permitido, porque está contemplado en el punto # 1. Cualquier método puede ser llamado en el objeto actual.

Segundo ejemplo:

public final class NetworkConnection {
    private Socket socket;
    public void close() {
        socket.close(); // PERMITIDO?
    }
}

Eso también está permitido, porque está reflejado en el punto # 3 (pues socket es una variable de instancia de esta clase).

Pero, ¿qué hay de este tercer ejemplo?

public final class NetworkConnection {
    public void send(Person person) {
        sendBytes(person.getName().getBytes());
        sendBytes(person.getPhoto().getBytes();
        ...
    }
}

Esto es una violación de la Ley de Démeter. El método recibe el parámetro person, por lo que se permiten todas las llamadas a métodos de este objeto. Sin embargo, llamar a cualquiera de los métodos (en este caso getBytes()) en el objeto devuelto por cualquier método como getName() o getPhoto() no está permitido.

Suponiendo que los getters estándar, estos objetos ya son objetos existentes en las variables de instancia de otros objetos, por lo tanto, son exactamente el tipo de objetos a los que este método no debería tener acceso.

Beneficios de cumplir la Ley de Démeter

  • Se reducen las dependencias entre clases y el acoplamiento.
  • Se vuelve más sencillo reutilizar las clases.
  • El código es más fácil de probar.
  • El código es más mantenible, más flexible a los cambios.

Lo curioso de esta Ley es que casi nadie la usa, o al menos nunca llega a cumplirse al 100 % en la mayoría de los casos donde se intenta aplicar; ya sea por desconocimiento o porque a la larga a los programadores no les suele parecer práctica. Sin embargo, intentar seguirla podría incrementar la calidad de nuestros códigos.



Autora: Andrea