Skip to main content

Що означає "модулі верхнього рівня не повинні залежати від нижнього"?

Фраза «модулі верхнього рівня не повинні залежати від модулів нижнього рівня» означає, що бізнес-логіка (верхній рівень) не повинна напряму залежати від технічних деталей (нижній рівень), таких як БД, файлова система, логування, мережеві клієнти, конкретні 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. Перевага

Верхній рівень стає:

  • незалежним,
  • легко тестованим,
  • переносним,
  • стійким до змін інфраструктури.

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

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

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

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