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

Чем Dependency Inversion отличается от Dependency Injection?

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

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

sobes.tech AI

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

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

Проще говоря:

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

Пример на Go:

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

// Деталь, реализующая интерфейс
 type EmailNotifier struct {}

 func (e EmailNotifier) Notify(message string) {
     fmt.Println("Sending email:", 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)
 }

Здесь DIP — UserService зависит от интерфейса Notifier, а DI — EmailNotifier передается в UserService извне.