Blog de Gonzalo

Ley de demeter

La Ley de Demeter, también se conoce como Principio de menor conocimiento, es un principio de diseño que intenta limitar el acoplamiento entre componentes mediante la aplicación de unas reglas muy simples. El principal objetivo de la Ley Demeter es reducir el acoplamiento entre clases, traduciéndose en una mejora en el mantenimiento del código. Lo hace disminuyendo el nivel de dependencia que tiene una clase con respecto a la estructura interna de otra clase que desconoce porque no es una "conocida" suya. Dicho así puede resultar un poco confuso, pero la idea es fácil: no hay que encadenar llamadas sobre los valores de retorno de los métodos.
Veamos un ejemplo:


public function calculatePrice(Product $product, int $units): float
{
    $promotions = $product->currentPromotion();
    $discountPct = $promotion->discountPct();
    //...
}

En el ejemplo anterior se puede ver que uno de los parámetros es de tipo Product, es decir, que Product es "conocido" por nuestra clase pero luego vemos que dentro del método se obtiene el objeto promotions a través del producto y ese objeto ya no es "conocido" por nuestra clase.
Para hacer esto bien cumpliendo la Ley de Demeter habrçia que hacer:

public function getProductCurrentPromotion(Product $product): Promotion
{
   return $product->currentPromotion();
}

public function calculatePrice(Product $product, Promotion $promotion, int $units): float
{
    $promotions = $product->currentPromotion();
    $discountPct = $promotion->discountPct();
    //...
}