Що означає "переворот залежності" (inversion)?
"Переворот залежності" (Inversion) у принципі Inversion of Control (IoC) означає, що контроль над залежностями і порядком виконання більше не належить об'єкту чи модулю, який їх використовує - цей контроль "перевертається" і передається зовнішній системі (наприклад, фреймворку, контейнеру чи інфраструктурному коду).
Що саме перевертається
Раніше (у традиційному підході) порядок залежностей виглядав так:
Високорівневий модуль залежить від низькорівневого, той залежить від конкретних реалізацій.
Після "перевороту":
Обидва, і високий, і низький рівні, залежать від абстракцій, а не один від одного.
Тобто залежність інвертується: замість того щоб "високорівневий код" диктував, які конкретні реалізації використовувати, тепер це вирішує зовнішній механізм, впроваджуючи потрібні залежності.
Приклад без перевороту залежності
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. Щоб поміняти логер, потрібно переписати код. Тут високорівневий модуль залежить від низькорівневого.
Приклад з переворотом залежності
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:
Модулі високого рівня не повинні залежати від модулів низького рівня. Обидва повинні залежати від абстракцій. Абстракції не повинні залежати від деталей. Деталі повинні залежати від абстракцій.
Підсумок: "Переворот залежності" - це архітектурний прийом, при якому управління залежностями змінює напрямок: замість того щоб модуль напряму створював і контролював свої залежності, він залежить від абстракцій, а конкретні реалізації впроваджуються ззовні. Це створює гнучку, тестовану і легко розширювану систему.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.