Что означает буква 'O' в паттерне SOLID?
Ответ от нейросети
sobes.tech AI
'O' означает Open/Closed Principle (Принцип открытости/закрытости).
Модули (классы, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации. Это означает, что можно добавлять новую функциональность, не изменяя существующий код.
Пример нарушения принципа:
// Пакет shape
type Shape interface {
Type() string
}
type Rectangle struct{}
func (r Rectangle) Type() string {
return "rectangle"
}
type Circle struct{}
func (c Circle) Type() string {
return "circle"
}
// Пакет calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
switch shape.Type() { // Необходимо изменить этот код при добавлении новой фигуры
case "rectangle":
// Логика расчета площади прямоугольника
case "circle":
// Логика расчета площади круга
}
}
return totalArea
}
При добавлении новой фигуры (например, Triangle), потребуется модифицировать функцию CalculateArea в AreaCalculator для обработки нового типа.
Пример соблюдения принципа:
// Пакет shape
type Shape interface {
Area() float64 // Добавляем метод Area() к интерфейсу
}
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height // Логика расчета площади инкапсулирована в структуре
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius // Логика расчета площади инкапсулирована в структуре
}
// Пакет calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
totalArea += shape.Area() // Используем полиморфизм, не зная конкретный тип фигуры
}
return totalArea
}
В этом примере добавление новой фигуры, реализующей интерфейс Shape с методом Area(), не требует изменения кода в AreaCalculator. AreaCalculator открыт для расширения (добавления новых типов Shape), но закрыт для модификации (не требует изменения кода при добавлении новых типов).
Это достигается за счет использования полиморфизма и инкапсуляции логики расчета площади внутри каждого типа фигуры. Принцип способствует созданию более гибкого, поддерживаемого и расширяемого кода.