Что такое SOLID (часть 5). Принцип инверсии зависимостей

Давайте сейчас рассмотрим последний принцип SOLID: принцип инверсии зависимостей (Dependency inversion principle — DIP). Краткое объяснение звучит так «Зависимость должна быть на абстракциях. Нет зависимости на что-то конкретное». Принцип, кстати, был выведен в трудах Роберта Мартина (американский инженер, программист). А теперь, чтобы лучше понять данный принцип, давайте перейдем к примеру.

Пример реализации принципа

Допустим мы пишем приложение для магазина и решаем вопросы с проведением оплат. Вначале это просто небольшой магазин, где оплата происходит только за наличные. Создаем класс Cash и класс Shop.

public class Cash {
    public void doTransaction(BigDecimal amount){
        //logic
    }
}
public class Shop {
    private Cash cash;
    public Shop(Cash cash) {
        this.cash = cash;
    }
    public void doPayment(Object order, BigDecimal amount){
        cash.doTransaction(amount);
    }
}

Вроде все хорошо, но мы уже нарушили принцип инверсии зависимостей, так как мы тесно связали оплату наличными к нашему магазину. И если в дальнейшем нам необходимо будет добавить оплату еще банковской картой и телефоном (а это точно нам понадобится в будущем), то нам придется переписывать и изменять много кода. Мы в нашем коде модуль верхнего уровня тесно связали с модулем нижнего уровня, а нужно чтобы оба уровня зависели от абстракции.

Поэтому создадим интерфейс Payments.

public interface Payments {
    void doTransaction(BigDecimal amount);
}

Теперь все наши классы по оплате будут реализовывать данный интерфейс.

public class Cash implements Payments{
    @Override
    public void doTransaction(BigDecimal amount) {
        //logic
    }
}
public class BankCard implements Payments{
    @Override
    public void doTransaction(BigDecimal amount) {
         //logic
    }
}
public class PayByPhone implements Payments {
    @Override
    public void doTransaction(BigDecimal amount) {
        //logic 
    }
}

Теперь надо перепроектировать реализацию нашего магазина.

public class Shop {
    private Payments payments;

    public Shop(Payments payments) {
        this.payments = payments;
    }

    public void doPayment(Object order, BigDecimal amount){
        payments.doTransaction(amount);
    }
}

Сейчас наш магазин слабо связан с системой оплаты, то есть он зависит от абстракции и уже не важно каким способом оплаты будут пользоваться (наличными, картой или телефоном) все будет работать.

Мы рассмотрели на примерах все принципы SOLID. Думаю, всем это будет полезно вспомнить или узнать. 

Запись опубликована в рубрике Это база с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий