Зависимость — это когда одна сущность не может работать без другой. Например, разработчик не может написать программу без компьютера.
Зависимость в программировании (dependency) означает, что один программный компонент не работает без другого. Например, класс «программист» — без класса «компьютер».
Пример. Представь холодильник. Когда его дверца открывается, внутри включается свет. Для этого в холодильнике есть лампочка. Если она не работает, свет в холодильнике не загорится. Получается, свет связан с лампочкой — это зависимость.
Этот пример легко переложить на язык Java. Пусть холодильнику в коде соответствует класс Fridge, а лампочке — HorizontLamp. Класс лампочки называется так, потому что её произвели на заводе «Горизонт».
В классе холодильника есть метод openDoor(). Он открывает дверцу. А класс лампочки содержит метод switchLightOn(), который включает свет.
Чтобы включить свет при открытии дверцы, нужно вызвать метод switchLightOn() для объекта HorizontLamp внутри класса Fridge:
public class HorizontLamp {
// метод, который включает лампочку
public void switchLightOn() {
System.out.println("Лампочка загорелась");
}
}
public class Fridge {
// метод открывает двери
public void openDoor() {
// объект класса HorizontLamp
HorizontLamp horizontLamp = new HorizontLamp();
// включается свет
horizontLamp.switchLightOn();
}
}
Чтобы в одном классе использовать методы другого, нужно создать в нём объект этого другого класса. Чтобы «холодильник» включил свет, в методе openDoor() создали экземпляр «лампочки».
// создали объект класса HorizontLamp
HorizontLamp horizontLamp = new HorizontLamp();
Класс Fridge зависит от HorizontLamp, потому что не сможет без него работать. Поэтому класс Fridge называют зависимым, а класс HorizontLamp — зависимостью.
У кода с зависимостями есть недостатки. Представь: завод «Горизонт» нужно заменить на «СуперЛампочка». Объект класса HorizontLamp меняется на объект класса SuperLamp.
Ещё может произойти так, что конструктор класса HorizontLamp изменится. Например, у него появится параметр — мощность лампочки.
В обоих случаях нужно переписать код класса Fridge, ведь лампочка находится прямо в нём.
Инъекция зависимостей (англ. Dependency Injection, или DI) — это принцип построения кода.
В основе принципа лежит такая идея:
<aside> 💡 Когда ты создаёшь зависимость внутри зависимого объекта, появляются сложности. → Значит, нужно вынести создание зависимости из объекта в другое место. → Тогда зависимость можно будет внедрить в объект в готовом виде.
</aside>