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