Давайте сейчас рассмотрим последний принцип 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. Думаю, всем это будет полезно вспомнить или узнать.