Закон Деметры

Закон Деметры


freelanceland
Работа для фрилансеров

Law of Demeter (LoD) - набор правил проектирования при разработке программного обеспечения, в частности объектно-ориентированных программ, накладывающий ограничения на взаимодействия объектов.

Принципы закона

  • объект может взаимодействовать:
    • со своими же методами
    • с объектами от которых напрямую зависит (2)
    • с объектами, которые приходят в метод в качестве параметра (3)
    • с созданными объектами
    • с глобальными переменными
  • избегать:
    • цепочки вызовов методов другого объекта, который вернулся при вызове метода объекта

Примеры Закона Деметры на PHP

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)
        }
    }
}


Читайте также: Принципы программирования

Популярное

Шпаргалка по командам MySQL
Проверка ИНН по контрольной сумме PHP/JavaScript
PHP, округление до 10 или 100 в большую или меньшую сторону

Возврат к списку