Що означає "залежність від абстракції, а не від реалізації"?
Фраза «залежність від абстракції, а не від реалізації» означає, що модуль повинен працювати через інтерфейс або абстрактний контракт, а не через конкретний клас, який виконує роботу. Іншими словами: клієнт повинен знати, що робить залежність, але не повинен знати, як вона це робить.
Детальніше:
1. Абстракція: це контракт (інтерфейс / базовий клас)
Абстракція визначає набір методів, гарантованих будь-якою реалізацією. Вона описує поведінку, а не конкретний спосіб виконання. Приклад абстракції:
class NotificationChannel:
def send(self, msg):
raise NotImplementedError2. Реалізація: це конкретний клас, що виконує роботу
Він знає як робити відправку:
class EmailChannel(NotificationChannel):
def send(self, msg):
print("Email:", msg)3. Клієнт повинен залежати тільки від абстракції
Неправильно:
def notify_user():
channel = EmailChannel() # залежить від реалізації
channel.send("hello")Правильно:
def notify_user(channel: NotificationChannel):
channel.send("hello") # залежить від абстракції4. Навіщо це потрібно
- дозволяє підставляти будь-яку реалізацію без зміни клієнтського коду;
- спрощує тестування (можна підставити мок чи фейкову реалізацію);
- знижує зв'язаність і робить архітектуру гнучкішою;
- дозволяє змінювати інфраструктуру без переписування бізнесу.
5. Ознака правильної архітектури
Увесь високорівневий код залежить лише від інтерфейсів. Низькорівневі деталі реалізують ці інтерфейси і можуть вільно замінюватися.
Підсумок: Залежати від абстракції: значить спиратися на контракт. Не залежати від реалізації: значить не прив'язуватися до конкретних способів виконання цього контракту. Це фундамент DIP і один з головних принципів гнучкої архітектури.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.