Skip to main content

Що означає "залежність від абстракції, а не від реалізації"?

Фраза «залежність від абстракції, а не від реалізації» означає, що модуль повинен працювати через інтерфейс або абстрактний контракт, а не через конкретний клас, який виконує роботу. Іншими словами: клієнт повинен знати, що робить залежність, але не повинен знати, як вона це робить.

Детальніше:

1. Абстракція: це контракт (інтерфейс / базовий клас)

Абстракція визначає набір методів, гарантованих будь-якою реалізацією. Вона описує поведінку, а не конкретний спосіб виконання. Приклад абстракції:

python
class NotificationChannel: def send(self, msg): raise NotImplementedError

2. Реалізація: це конкретний клас, що виконує роботу

Він знає як робити відправку:

python
class EmailChannel(NotificationChannel): def send(self, msg): print("Email:", msg)

3. Клієнт повинен залежати тільки від абстракції

Неправильно:

python
def notify_user(): channel = EmailChannel() # залежить від реалізації channel.send("hello")

Правильно:

python
def notify_user(channel: NotificationChannel): channel.send("hello") # залежить від абстракції

4. Навіщо це потрібно

  • дозволяє підставляти будь-яку реалізацію без зміни клієнтського коду;
  • спрощує тестування (можна підставити мок чи фейкову реалізацію);
  • знижує зв'язаність і робить архітектуру гнучкішою;
  • дозволяє змінювати інфраструктуру без переписування бізнесу.

5. Ознака правильної архітектури

Увесь високорівневий код залежить лише від інтерфейсів. Низькорівневі деталі реалізують ці інтерфейси і можуть вільно замінюватися.

Підсумок: Залежати від абстракції: значить спиратися на контракт. Не залежати від реалізації: значить не прив'язуватися до конкретних способів виконання цього контракту. Це фундамент DIP і один з головних принципів гнучкої архітектури.

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

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

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