Sobes.tech
Назад к вопросам
Senior
3

В чём ключевое различие между Dependency Inversion и Dependency Injection?

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

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

sobes.tech AI

Dependency Inversion (принцип инверсии зависимостей) — это один из принципов SOLID, который гласит, что высокоуровневые модули не должны зависеть от низкоуровневых, оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей, детали должны зависеть от абстракций.

Dependency Injection — это конкретный паттерн или техника, реализующая принцип Dependency Inversion. Это способ передачи зависимостей (объектов) в класс или функцию извне, а не создания их внутри.

Иными словами:

  • Dependency Inversion — это концепция или принцип проектирования.
  • Dependency Injection — способ реализации этой концепции, когда зависимости передаются извне.

Пример на Go:

// Абстракция
 type Notifier interface {
    Notify(message string)
}

// Конкретная реализация
 type EmailNotifier struct {}

func (e EmailNotifier) Notify(message string) {
    fmt.Println("Sending email with message:", message)
}

// Высокоуровневый модуль
 type UserService struct {
    notifier Notifier // зависит от абстракции
}

// Dependency Injection через конструктор
func NewUserService(n Notifier) *UserService {
    return &UserService{notifier: n}
}

func (s *UserService) RegisterUser(name string) {
    // логика регистрации
    s.notifier.Notify("User registered: " + name)
}

Здесь принцип Dependency Inversion соблюдается за счет зависимости от интерфейса Notifier, а Dependency Injection — через передачу конкретной реализации EmailNotifier в конструктор UserService.