Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що означає "переворот залежності" (inversion)?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**"Переворот залежності" (Inversion)** у принципі **Inversion of Control (IoC)** означає, що контроль над залежностями і порядком виконання більше не належить об'єкту чи модулю, який їх використовує - цей контроль "перевертається" і передається зовнішній системі, наприклад фреймворку, контейнеру чи інфраструктурному коду. **Ключове:** переворот залежності - основа принципу Dependency Inversion Principle (DIP) з SOLID: модулі високого рівня не повинні залежати від модулів низького рівня, обидва повинні залежати від абстракцій.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**"Переворот залежності" (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: > Модулі високого рівня не повинні залежати від модулів низького рівня. Обидва повинні залежати від абстракцій. > Абстракції не повинні залежати від деталей. Деталі повинні залежати від абстракцій. --- **Підсумок:** *"Переворот залежності" - це архітектурний прийом, при якому управління залежностями змінює напрямок: замість того щоб модуль напряму створював і контролював свої залежності, він залежить від абстракцій, а конкретні реалізації впроваджуються ззовні. Це створює гнучку, тестовану і легко розширювану систему.*Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.