Що таке вкладені умови?
Коротка відповідь
Вкладені умови - це ситуація, коли одна умовна конструкція (наприклад, if/else, switch або тернарний оператор) знаходиться всередині іншої, щоб поетапно приймати рішення на основі залежних перевірок.
Розгорнута відповідь
Що це і навіщо потрібно
Вкладені умови дозволяють виразити деревоподібну логіку: спочатку перевіряється одна умова, і тільки якщо вона істинна, виконуються наступні. Це зручно, коли подальші перевірки мають сенс лише при виконанні попередніх (наприклад, «користувач існує → активний → має роль»).
Приклад 1. Вкладені if/else
function canAccess(user, section) {
if (user) {
if (user.isActive) {
if (user.role === 'admin') {
return true;
} else {
if (section === 'public') {
return true;
} else {
return false;
}
}
} else {
return false;
}
} else {
return false;
}
}Логіка коректна, але читабельність падає через глибоку вкладеність.
Те саме через ранні повернення (guard clauses)
function canAccess(user, section) {
if (!user) return false;
if (!user.isActive) return false;
if (user.role === 'admin') return true;
return section === 'public';
}Ранні повернення зменшують глибину вкладеності, спрощуючи читання і тестування.
Приклад 2. Вкладені switch
function priceFor(type, country) {
switch (type) {
case 'pro':
switch (country) {
case 'US': return 20;
case 'EU': return 18;
default: return 22;
}
case 'basic':
switch (country) {
case 'US': return 10;
case 'EU': return 9;
default: return 11;
}
default:
return 0;
}
}Це валідний підхід, але для великої матриці значень краще використовувати таблицю рішень (об'єкт/мапу), щоб уникнути вкладеності.
const prices = {
pro: { US: 20, EU: 18, default: 22 },
basic: { US: 10, EU: 9, default: 11 },
};
function priceFor(type, country) {
const plan = prices[type];
if (!plan) return 0;
return plan[country] ?? plan.default ?? 0;
}Приклад 3. Вкладений тернарний оператор
const label = isAuthenticated
? (isAdmin ? 'Admin' : 'User')
: 'Guest';Тернарники допустимі для коротких виразів. Уникайте більш ніж 1 рівня вкладеності - переносьте логіку у функцію або використовуйте звичайні if/else.
Де це трапляється на практиці
- Перевірка прав доступу: спочатку факт входу, потім активність, потім роль/повноваження.
- Валідація форм: чи є поле → формат → бізнес-правила.
- Обробка HTTP-запитів: метод → заголовки → тіло.
Поширені помилки
- Надмірна глибина вкладеності, коли можна обійтися ранніми поверненнями або таблицею рішень.
- Змішування перевірок і побічних ефектів усередині гілок, що ускладнює тестування.
- Дублювання однакових перевірок на різних рівнях.
- Відсутність кінцевої гілки (наприклад, default у switch), через що частина кейсів залишається необробленою.
- Надмірне використання вкладених тернарних операторів, що погіршує читабельність.
Рекомендації щодо стилю і архітектури
- Обмежуйте глибину вкладеності 2 рівнями. Якщо глибше - рефакторте.
- Використовуйте guard clauses для раннього виходу з функції і зняття «драбинок» з if/else.
- Виносьте складні умови в іменовані предикати (функції, константи), щоб зробити код самодокументованим.
- Для матриць правил застосовуйте таблиці рішень (об'єкти/мапи), а не вкладені switch/if.
- Слідкуйте за цикломатичною складністю: кожна нова умова додає розгалуження і збільшує кількість тест-кейсів.
Коротка пам'ятка
- Вкладені умови - це умови всередині умов.
- Використовуйте, коли перевірки залежать одна від одної.
- Мінімізуйте глибину за рахунок ранніх повернень, таблиць рішень і виділення предикатів.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.