Ответ
Принцип Open/Closed (OCP) — это второй принцип SOLID, который гласит:
Программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации.
Это означает, что вы должны иметь возможность добавлять новую функциональность, не изменяя существующий, уже работающий и протестированный код.
В Go этот принцип чаще всего достигается с помощью интерфейсов.
Пример на Go
Представим, что у нас есть система для подсчета общей площади различных геометрических фигур.
import "math"
// 1. Определяем общий интерфейс
type Shape interface {
Area() float64
}
// 2. Реализуем конкретные типы
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 math.Pi * c.Radius * c.Radius
}
// 3. Создаем функцию, которая работает с интерфейсом
// Эта функция ЗАКРЫТА для изменений.
func TotalArea(shapes []Shape) float64 {
var total float64
for _, s := range shapes {
total += s.Area()
}
return total
}
Как работает принцип:
- Закрыто для модификации: Функция
TotalArea
написана один раз и больше не требует изменений. Её логика стабильна. - Открыто для расширения: Если нам понадобится добавить новую фигуру, например,
Triangle
, мы просто создадим новую структуру и реализуем для нее методArea()
. Нам не придется трогать код функцииTotalArea
— она автоматически начнет работать с новым типом.