Вопрос проверяет умение расширять поведение системы без изменения уже существующего кода.
Принцип Open–Closed означает, что код должен быть открыт для расширения, но закрыт для изменения. Это значит, что новое поведение добавляется через расширение, а не через правку существующих классов. Такой подход снижает риск поломать уже работающий код. Обычно принцип реализуется через протоколы, наследование и композицию. Он особенно важен при развитии и масштабировании проекта.
Принцип Open–Closed помогает писать код, устойчивый к изменениям требований.
Open–Closed Principle (OCP) — программные сущности должны быть открыты для расширения и закрыты для изменения.
Изменение существующего кода:
может сломать старую функциональность
требует повторного тестирования
усложняет поддержку
func calculate(price: Double, type: String) -> Double {
if type == "discount" {
return price * 0.9
} else if type == "tax" {
return price * 1.2
}
return price
}
При добавлении нового типа расчёта придётся менять функцию.
protocol PriceCalculator {
func calculate(price: Double) -> Double
}
class DiscountCalculator: PriceCalculator {
func calculate(price: Double) -> Double {
price * 0.9
}
}
Теперь новые правила добавляются через новые реализации.
протоколы вместо switch и if
dependency injection
расширения через extension
OCP особенно полезен в долгоживущих проектах, где требования часто меняются. Он снижает количество правок в существующем коде и делает архитектуру более гибкой.