Back to questions
Senior
4
В чём ключевое различие между Dependency Inversion и Dependency Injection?
Companies where asked
purrweb
Answer from AI
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.