Law of Demeter (LoD) - набор правил проектирования при разработке программного обеспечения, в частности объектно-ориентированных программ, накладывающий ограничения на взаимодействия объектов.
public class Seller {
private PriceCalculator priceCalculator = new PriceCalculator();
public sell(Product products, Wallet wallet) {
Money actualSum = wallet.getMoney(); // закон не нарушается, взаимодействие с объектом параметром метода (п. 3)
Money dSum = priceCalculator.calculate(products); // не нарушается, взаимодействие с методом объекта, от которых объект зависит напрямую (п. 2)
if (actualSum.isLessThan(dSum)) { // нарушение закона, т.к вызывается цепочка
throw new NotEnoughMoneyException(actualSum, dSum);
} else {
Money balance = actualSum.subtract(dSum); // нарушение закона.
wallet.setMoney(balance);
}
}
}
Закон нарушается потому, что из объекта, который приходит в метод параметром (Wallet), мы берём другой объект (actualSum) и позже вызываем на нем метод (isLessThan). То есть в конечном итоге получается цепочка: wallet.getMoney().isLessThan(otherMoney).
Более корректная версия, удовлетворяющая закону выглядела бы так:
public class Seller {
private PriceCalculator priceCalculator = new PriceCalculator();
public sell(Product products, Money moneyForProducts) {
Money requiredSum = priceCalculator.calculate(products); // не нарушается, взаимодействие с методом объекта, от которых объект зависит напрямую (п. 2)
if (moneyForProducts.isLessThan(requiredSum)) { // не нарушается, взаимодействие с объектом параметром метода (п. 3)
throw new NotEnoughMoneyException(moneyForProducts, requiredSum);
} else {
return moneyForProducts.subtract(requiredSum); // не нарушается, взаимодействие с объектом параметром метода (п. 3)
}
}
}
Читайте также: Принципы программирования