Sobes.tech
Назад к вопросам
Junior — Middle
56

Какой принцип 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).
  • Зависимость строится от абстракций, а не от конкретных классов.
  • Высокоуровневая логика не должна быть привязана к деталям реализации.
  • Принцип помогает уменьшить связность и упростить тестирование.
  • Часто реализуется через интерфейсы, абстрактные классы и внедрение зависимостей.