Sobes.tech
Назад к вопросам
Middle+
5

Объясни принцип инверсии зависимостей (Dependency Inversion Principle) и почему прямой вызов методов репозитория из use case нарушает SOLID

Компании, где спрашивали
Яндекс

Ответ от нейросети

sobes.tech AI

Принцип инверсии зависимостей (Dependency Inversion Principle, DIP) говорит, что:

  1. Модули верхнего уровня не должны зависеть от модулей нижнего уровня напрямую.
  2. Оба типа модулей должны зависеть от абстракций (интерфейсов).
  3. Абстракции не должны зависеть от деталей, детали должны зависеть от абстракций.

В контексте use case и репозитория это значит, что бизнес-логика (use case) не должна напрямую вызывать конкретные методы репозитория, реализующего доступ к данным. Вместо этого use case зависит от интерфейса репозитория, а конкретная реализация внедряется извне (через конструктор или DI-контейнер).

Если use case напрямую вызывает методы конкретного репозитория, нарушается SOLID, потому что:

  • Возникает жёсткая связь с конкретной реализацией, что затрудняет тестирование и замену репозитория.
  • Нарушается принцип открытости/закрытости (Open/Closed Principle), так как изменение репозитория требует изменений в use case.

Пример на Go:

type UserRepository interface {
    GetUser(id int) (*User, error)
}

type UserUseCase struct {
    repo UserRepository
}

func NewUserUseCase(r UserRepository) *UserUseCase {
    return &UserUseCase{repo: r}
}

func (uc *UserUseCase) GetUserProfile(id int) (*UserProfile, error) {
    user, err := uc.repo.GetUser(id)
    if err != nil {
        return nil, err
    }
    // бизнес-логика обработки user
    return &UserProfile{/*...*/}, nil
}

Такой подход повышает гибкость и тестируемость кода.