Back to questions
Senior
4
Чем Dependency Inversion отличается от Dependency Injection?
Companies where asked
purrweb
Answer from AI
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 извне.