Проверяет умение заменять разрастающиеся if/else и switch на расширяемые паттерны проектирования, что важно для поддерживаемого кода.
Когда логика обрастает десятками if/else if или switch, каждая новая ветка требует правки одного и того же метода. Это нарушает принцип открытости/закрытости: код открыт для расширения, но закрыт для изменения. Решение — заменить условие полиморфизмом: каждая ветка становится отдельным классом или функцией с общим интерфейсом, а выбор нужной реализации выполняется через фабрику или словарь.
Определяем общий интерфейс, реализуем его для каждого варианта и храним реализации в реестре. Клиентский код просто вызывает метод, не зная деталей.
interface Handler {
handle(data: string): string;
}
class JsonHandler implements Handler {
handle(data: string) { return JSON.parse(data); }
}
class XmlHandler implements Handler {
handle(data: string) { return parseXml(data); }
}
const handlers: Record<string, Handler> = {
json: new JsonHandler(),
xml: new XmlHandler(),
};
function process(format: string, data: string) {
const handler = handlers[format];
if (!handler) throw new Error('Unknown format');
return handler.handle(data);
}Дополнительно можно использовать паттерн «Цепочка обязанностей», если условия проверяются последовательно, или «Команду», если каждая ветка — самостоятельное действие.
Итог: полиморфная замена условий делает код расширяемым, тестируемым и читаемым — применяйте её, когда количество веток превышает 3–4 или они часто меняются.