Skip to main content

Що таке вкладені умови?

Коротка відповідь

Вкладені умови - це ситуація, коли одна умовна конструкція (наприклад, 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.
  • Слідкуйте за цикломатичною складністю: кожна нова умова додає розгалуження і збільшує кількість тест-кейсів.

Коротка пам'ятка

  • Вкладені умови - це умови всередині умов.
  • Використовуйте, коли перевірки залежать одна від одної.
  • Мінімізуйте глибину за рахунок ранніх повернень, таблиць рішень і виділення предикатів.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.