Проверяет понимание принципа открытости/закрытости (OCP) из SOLID и умение применять его для расширения поведения без изменения существующего кода.
Принцип открытости/закрытости (Open/Closed Principle, OCP) — один из пяти принципов SOLID. Его суть: программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для изменения. Это значит, что при появлении новой функциональности мы не переписываем существующий код, а добавляем новый, не трогая старый.
Когда код часто меняется в одном месте, растёт риск регрессий: правка может сломать уже работающие сценарии. OCP помогает изолировать изменения и делает систему более предсказуемой и тестируемой.
Плохой пример: класс, который внутри себя содержит if/else по типу оплаты. При добавлении нового способа оплаты придётся менять этот класс.
class PaymentProcessor {
pay(type, amount) {
if (type === 'card') { /* ... */ }
else if (type === 'paypal') { /* ... */ }
// при новом типе — снова правим этот метод
}
}Хороший пример: выделяем абстракцию и добавляем новые реализации, не меняя существующий код.
class PaymentMethod {
pay(amount) { throw new Error('Not implemented'); }
}
class CardPayment extends PaymentMethod {
pay(amount) { /* логика карты */ }
}
class PaypalPayment extends PaymentMethod {
pay(amount) { /* логика PayPal */ }
}
function process(paymentMethod, amount) {
paymentMethod.pay(amount);
}Важно не доводить принцип до абсурда: не нужно создавать абстракцию там, где изменений не ожидается. OCP оправдан, когда поведение действительно будет расширяться.
Итог: применяйте OCP, когда система должна легко расширяться новыми вариантами поведения без правки уже протестированного кода — это снижает риск регрессий и упрощает поддержку.