Приклад порушення DIP
Порушення DIP виникає тоді, коли модуль високого рівня напряму залежить від конкретної реалізації модуля нижнього рівня. Це робить систему жорсткою, погано тестованою і важко змінюваною.
Ось типовий приклад порушення:
Приклад порушення DIP
class MySqlOrderRepository:
def save(self, order):
print("Збереження замовлення в MySQL")
class OrderService:
def __init__(self):
self.repo = MySqlOrderRepository() # порушення DIP
def create_order(self, order):
self.repo.save(order)Чому це порушення DIP:
- Високорівневий модуль залежить від низькорівневого
OrderService: бізнес-логіка.MySqlOrderRepository: інфраструктура. Бізнес-логіка знає про технічні деталі, що порушує DIP. - Не можна замінити реалізацію без переписування OrderService Хочемо перейти на Postgres? Потрібно змінювати конструктор:
self.repo = PostgresRepository()Це ламає принцип відкритості/закритості і робить код крихким. 3. Складно тестувати OrderService Не можна підставити фейковий репозиторій чи мок: він жорстко зашитий. Тести неможливі без реальної БД. 4. Бізнес-код залежить від деталей, які часто змінюються Репозиторій, драйвери, бібліотека з'єднань змінюються. Бізнес-логіка повинна бути стабільною. Пряма зв'язка ламає архітектуру.
Підсумок
OrderService повинен залежати від абстракції, а не від конкретного класу.
У цьому прикладі бізнес-логіка жорстко прив'язана до MySQL: це пряме порушення принципу інверсії залежностей.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.