Вопрос проверяет понимание того, как проектировать код так, чтобы его можно было расширять без изменения уже работающей логики.
Принцип Open/Closed означает, что код должен быть открыт для расширения, но закрыт для изменения. Это значит, что новую функциональность нужно добавлять, не переписывая существующий код. Такой подход снижает риск сломать уже работающую систему. Обычно он достигается с помощью абстракций и полиморфизма. Это делает код устойчивым к изменениям требований.
Принцип Open/Closed помогает писать код, который не боится изменений и со временем не превращается в набор хаотичных правок.
Open/Closed Principle гласит: программные сущности должны быть открыты для расширения, но закрыты для изменения.
Важно не запрещать изменения полностью, а:
не менять уже протестированный код
добавлять новую логику через расширение
Это особенно важно в продакшене, где любое изменение может привести к регрессии.
def calculate_discount(user_type, price):
if user_type == "regular":
return price * 0.95
elif user_type == "vip":
return price * 0.9
Проблемы:
при добавлении нового типа пользователя нужно менять функцию
растет количество условий
увеличивается риск ошибки
class DiscountPolicy:
def apply(self, price):
pass
class RegularDiscount(DiscountPolicy):
def apply(self, price):
return price * 0.95
class VipDiscount(DiscountPolicy):
def apply(self, price):
return price * 0.9
Теперь:
новая логика добавляется новым классом
существующий код не меняется
система легко расширяется
бизнес-правила
стратегии обработки данных
системы плагинов
правила валидации
Если при добавлении новой функциональности приходится менять старый код — это сигнал, что принцип Open/Closed нарушен.