Зависимость — это когда одна сущность не может работать без другой. Например, разработчик не может написать программу без компьютера.
Зависимость в программировании (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>