Что означает принцип открытости/закрытости (O) в SOLID?

«Что означает принцип открытости/закрытости (O) в SOLID?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

O в SOLID означает Open/Closed Principle (OCP) — Принцип открытости/закрытости.

Формулировка: Программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации.

  • Закрыты для модификации: Исходный код стабильной, протестированной сущности не должен изменяться для добавления новой функциональности.
  • Открыты для расширения: Новую функциональность следует добавлять путем создания новых сущностей (через наследование, композицию, реализацию интерфейсов).

Пример нарушения OCP:

class AreaCalculator {
    public double calculateArea(Object shape) {
        if (shape instanceof Rectangle) {
            // ... расчет для прямоугольника
        } else if (shape instanceof Circle) {
            // ... расчет для круга
        }
        // При добавлении новой фигуры нужно МОДИФИЦИРОВАТЬ этот метод!
        throw new IllegalArgumentException("Unknown shape");
    }
}

Пример соблюдения OCP:

// Абстракция, открытая для расширения
interface Shape {
    double area();
}

// Конкретные реализации. Добавление новой фигуры не требует изменения существующего кода.
class Rectangle implements Shape {
    private double width, height;
    @Override
    public double area() { return width * height; }
}

class Circle implements Shape {
    private double radius;
    @Override
    public double area() { return Math.PI * radius * radius; }
}

// Класс закрыт для модификации. Он работает с абстракцией Shape.
class AreaCalculator {
    public double calculateTotalArea(List<Shape> shapes) {
        return shapes.stream()
                     .mapToDouble(Shape::area)
                     .sum();
    }
}

Почему это важно: OCP уменьшает риск появления ошибок в уже работающем коде, облегчает поддержку и делает систему более устойчивой к изменениям.