Что такое принцип Open/Closed (OCP) и как он применяется в Go?

Ответ

Принцип 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 — она автоматически начнет работать с новым типом.