Принцип открытости/закрытости (Open/Closed Principle, OCP) формулируется так: программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации.
Это означает, что:
OCP часто достигается за счет использования абстракций (интерфейсов, абстрактных классов) и полиморфизма. Вместо прямой зависимости от конкретной реализации, модуль зависит от абстракции. Новая функциональность добавляется путем создания новой реализации этой абстракции, а не путем изменения существующих классов.
Пример: До:
swift
В этом случае, для добавления нового формата отчета (например, JSON), нужно модифицировать существующий метод generateReport, что нарушает OCP.
После (с применением OCP):
swift
Теперь для добавления нового формата отчета достаточно создать новый класс, реализующий протокол ReportFormatter. Существующий ReportGenerator при этом не меняется.