Skip to main content

Що означає "переворот залежності" (inversion)?

"Переворот залежності" (Inversion) у принципі Inversion of Control (IoC) означає, що контроль над залежностями і порядком виконання більше не належить об'єкту чи модулю, який їх використовує - цей контроль "перевертається" і передається зовнішній системі (наприклад, фреймворку, контейнеру чи інфраструктурному коду).


Що саме перевертається

Раніше (у традиційному підході) порядок залежностей виглядав так:

Високорівневий модуль залежить від низькорівневого, той залежить від конкретних реалізацій.

Після "перевороту":

Обидва, і високий, і низький рівні, залежать від абстракцій, а не один від одного.

Тобто залежність інвертується: замість того щоб "високорівневий код" диктував, які конкретні реалізації використовувати, тепер це вирішує зовнішній механізм, впроваджуючи потрібні залежності.


Приклад без перевороту залежності

python
class FileLogger: def log(self, message): print(f"Log: {message}") class UserService: def __init__(self): self.logger = FileLogger() # конкретна залежність def create_user(self, name): self.logger.log(f"User created: {name}")

UserService напряму залежить від FileLogger. Щоб поміняти логер, потрібно переписати код. Тут високорівневий модуль залежить від низькорівневого.


Приклад з переворотом залежності

python
class Logger: def log(self, message): pass class FileLogger(Logger): def log(self, message): print(f"Log: {message}") class UserService: def __init__(self, logger: Logger): self.logger = logger # залежність від абстракції def create_user(self, name): self.logger.log(f"User created: {name}")

Тепер UserService залежить від інтерфейсу Logger, а не від конкретного FileLogger. Реалізація логера може бути замінена зовнішнім кодом чи контейнером залежностей. Контроль над створенням FileLogger інвертовано - вирішує не UserService, а фреймворк або код, що викликає.


У чому сенс "перевороту"

  • До: код сам створює і керує залежностями (жорстка зв'язність).
  • Після: залежності впроваджуються ззовні (слабка зв'язність).
  • "Переворот" - це перенесення відповідальності: від модуля до зовнішнього контейнера чи абстракції.

Зв'язок з SOLID

Переворот залежності - це основа принципу Dependency Inversion Principle (DIP) з SOLID:

Модулі високого рівня не повинні залежати від модулів низького рівня. Обидва повинні залежати від абстракцій. Абстракції не повинні залежати від деталей. Деталі повинні залежати від абстракцій.


Підсумок: "Переворот залежності" - це архітектурний прийом, при якому управління залежностями змінює напрямок: замість того щоб модуль напряму створював і контролював свої залежності, він залежить від абстракцій, а конкретні реалізації впроваджуються ззовні. Це створює гнучку, тестовану і легко розширювану систему.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.