Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке вкладені умови?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Вкладені умови** - це ситуація, коли одна умовна конструкція (наприклад, if/else, switch або тернарний оператор) знаходиться всередині іншої, щоб поетапно приймати рішення на основі залежних перевірок. **Ключове:** глибину вкладеності варто обмежувати двома рівнями, використовуючи ранні повернення (guard clauses) або таблиці рішень.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротка відповідь Вкладені умови - це ситуація, коли одна умовна конструкція (наприклад, 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. - Слідкуйте за цикломатичною складністю: кожна нова умова додає розгалуження і збільшує кількість тест-кейсів. ### Коротка пам'ятка - Вкладені умови - це умови всередині умов. - Використовуйте, коли перевірки залежать одна від одної. - Мінімізуйте глибину за рахунок ранніх повернень, таблиць рішень і виділення предикатів.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.