Какво означава буквата 'O' в патърна SOLID?
sobes.tech AI
Отговор от 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
}
При добавяне на нова фигура (например, Триъгълник), ще е необходимо да се модифицира функцията 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), но затворен за модификация (не изисква промени при добавяне на нови типове).
Това се постига чрез използването на полиморфизъм и капсулиране на логиката за изчисляване на площта във всеки тип фигура. Този принцип насърчава създаването на по-гъвкав, поддържан и разширяем код.