Ответ
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 уменьшает риск появления ошибок в уже работающем коде, облегчает поддержку и делает систему более устойчивой к изменениям.