Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що означає "модулі верхнього рівня не повинні залежати від нижнього"?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Фраза **«модулі верхнього рівня не повинні залежати від модулів нижнього рівня»** означає, що бізнес-логіка (верхній рівень) не повинна напряму залежати від технічних деталей (нижній рівень), таких як БД, файлова система, логування, мережеві клієнти, конкретні API тощо. **Ключове:** верхній рівень повинен залежати тільки від абстракцій і контрактів, а деталі підключаються ззовні, тож бізнес-логіка залишається стабільною і гнучкою.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняФраза **«модулі верхнього рівня не повинні залежати від модулів нижнього рівня»** означає, що **бізнес-логіка (верхній рівень) не повинна напряму залежати від технічних деталей (нижній рівень)**, таких як БД, файлова система, логування, мережеві клієнти, конкретні API тощо. Детальніше: ### 1. Верхній рівень - це бізнес-правила Це класи і модулі, які визначають *що* застосунок робить: - розрахунок вартості, - обробка замовлень, - валідація, - ухвалення рішень. Ці модулі повинні бути стабільними і рідко змінюватися. ### 2. Нижній рівень - це інфраструктура і деталі реалізації Це класи, які відповідають за *як*: - конкретна база даних (MySQL, Postgres), - конкретна бібліотека HTTP, - конкретний логер, - конкретний кеш, - формат зберігання даних. Вони змінюються частіше, ніж бізнес-код. ### 3. Проблема прямої залежності Якщо бізнес-логіка залежить, наприклад, від `MySqlOrderRepository`, то: - перехід на Postgres вимагає переписування бізнес-коду; - заміна бібліотеки HTTP вимагає переписування бізнес-коду; - написати unit-тест важко, бо всередині - конкретні деталі. Бізнес-логіка стає крихкою і важко обслуговуваною. ### 4. DIP говорить: залежати потрібно від абстракцій Замість: ```python class OrderService: def __init__(self): self.repo = MySqlOrderRepository() ``` Повинно бути: ```python class OrderService: def __init__(self, repo: OrderRepositoryInterface): self.repo = repo ``` Тепер OrderService залежить лише від **контракту**, а не від конкретної реалізації. ### 5. Деталі повинні залежати від абстракцій, а не навпаки MySqlOrderRepository повинен *реалізовувати* інтерфейс: ```python class MySqlOrderRepository(OrderRepositoryInterface): ... ``` І вже зовнішня система (DI-контейнер, конфігурація) вирішує, яку реалізацію підставити. ### 6. Перевага Верхній рівень стає: - незалежним, - легко тестованим, - переносним, - стійким до змін інфраструктури. Підсумок: **«Модулі верхнього рівня не повинні залежати від нижнього» означає, що бізнес-логіка повинна залежати тільки від абстракцій і контрактів, а не від конкретних технічних деталей. Деталі підключаються ззовні, а сама бізнес-логіка залишається стабільною і гнучкою.**Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.