Какой принцип SOLID подразумевает зависимость от абстракций, а не от конкретных реализаций?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Это принцип инверсии зависимостей, DIP. Смысл в том, что высокоуровневый код не должен напрямую зависеть от низкоуровневых деталей, а оба уровня должны опираться на абстракции. Это снижает связность и упрощает замену реализаций.
Определение:
Dependency Inversion Principle — это принцип SOLID, который требует строить код вокруг интерфейсов, абстрактных классов или других абстракций, а не вокруг конкретных классов. Благодаря этому система становится гибче: реализацию можно менять без переписывания бизнес-логики.
Пример использования:
Допустим, сервис отправляет уведомления. Вместо того чтобы жестко создавать EmailNotifier внутри сервиса, сервис зависит от абстракции Notifier, а конкретный способ доставки подставляется снаружи.
from abc import ABC, abstractmethod
class Notifier(ABC):
@abstractmethod
def send(self, message: str) -> None:
pass
class EmailNotifier(Notifier):
def send(self, message: str) -> None:
print(f"Email: {message}")
class SmsNotifier(Notifier):
def send(self, message: str) -> None:
print(f"SMS: {message}")
class AlertService:
def __init__(self, notifier: Notifier):
self.notifier = notifier
def alert(self, message: str) -> None:
self.notifier.send(message)
service = AlertService(EmailNotifier())
service.alert("Система недоступна")
Пояснение кода:
Код показывает, что AlertService не знает, как именно отправляется сообщение. Он работает только с абстракцией Notifier.
Если нужно сменить канал уведомлений, достаточно передать другой объект, например SmsNotifier, без изменений в AlertService.
Шаги такие: сначала объявляется общий контракт Notifier, затем создаются конкретные реализации, после этого сервис получает нужную реализацию через конструктор и вызывает общий метод send.
Ключевые моменты:
- Речь идет о принципе Dependency Inversion Principle (DIP).
- Зависимость строится от абстракций, а не от конкретных классов.
- Высокоуровневая логика не должна быть привязана к деталям реализации.
- Принцип помогает уменьшить связность и упростить тестирование.
- Часто реализуется через интерфейсы, абстрактные классы и внедрение зависимостей.