Расскажи про паттерн Dependency Inversion (последний принцип SOLID) и про композицию.
Answer from AI
sobes.tech AI
Принцип Dependency Inversion (DIP) — это один из пяти принципов SOLID, который гласит:
- Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Это значит, что вместо того, чтобы напрямую создавать и использовать конкретные реализации, мы работаем через интерфейсы или абстрактные классы. Это повышает гибкость, облегчает тестирование и поддержку кода.
Пример на Go:
// Абстракция
type Notifier interface {
Notify(message string)
}
// Конкретная реализация
type EmailNotifier struct {}
func (e EmailNotifier) Notify(message string) {
fmt.Println("Email sent:", message)
}
// Модуль верхнего уровня
func SendAlert(n Notifier, msg string) {
n.Notify(msg)
}
// Использование
email := EmailNotifier{}
SendAlert(email, "System down!")
Композиция — это способ построения сложных объектов из простых, путем включения одного объекта в другой. В отличие от наследования, композиция позволяет гибко комбинировать поведение без жесткой иерархии.
Например, вместо того, чтобы создавать класс "Квадрат", наследующийся от "Прямоугольника", можно создать структуру, которая содержит поле с типом "Прямоугольник" и расширяет его функциональность.
Композиция часто используется вместе с DIP, чтобы внедрять зависимости через поля структур или параметры функций, а не через наследование.