JavaRush /Курси /Kotlin SELF /Вкладені if, багаторівнева логіка

Вкладені if, багаторівнева логіка

Kotlin SELF
Рівень 3 , Лекція 2
Відкрита

1. Базовий синтаксис вкладеного if

У реальному житті рідко трапляється ситуація, коли рішення ухвалюють лише за одним критерієм. Зазвичай доводиться перевіряти відразу кілька умов, і вони часто залежать одна від одної. Наприклад, щоб потрапити на концерт, недостатньо просто бути дорослим — інколи потрібно ще й бути в списку запрошених. Саме тут і стає в пригоді так звана багаторівнева логіка, а реалізувати її допомагають вкладені оператори if.

Вкладені умови — це коли один if «живе» всередині іншого. Уявіть собі коробку в коробці: якщо перша коробка відкрилася (умова виконалася), тоді дивимося, що всередині, і, можливо, відкриваємо другу. З погляду коду та логіки це дуже потужний інструмент.

Почнімо з простого:

if (умоваА)
{
    // дії, якщо умоваА — true (істина)
    if (умоваБ)
    {
        // дії, якщо обидві умови істинні
    }
}
Вкладений if усередині іншого if

Якщо ця конструкція нагадує вам коробки одна в одній — ви все розумієте правильно. Вкладений if усередині зовнішнього виконуватиметься лише тоді, коли спрацював зовнішній.

Приклад: вхід до клубу

Спробуймо розвинути наш навчальний застосунок, у якому користувач раніше вводив імʼя та вік. Тепер додамо другий рівень перевірки. Припустімо, щоб потрапити в закритий клуб, потрібно бути віком від 21 року і мати запрошувальний код.

fun main() {
    print("Введіть ваше імʼя: ")
    val name = readln()

    print("Введіть ваш вік: ")
    val age = readln().toInt()

    if (age >= 21) {
        print("Введіть запрошувальний код: ")
        val code = readln()

        if (code == "VIP2026") {
            println("Ласкаво просимо, $name, до VIP-клубу!")
        } else {
            println("Вибачте, неправильний код. Доступ заборонено.")
        }
    } else {
        println("Вибачте, вхід лише з 21 року!")
    }
}

Зверніть увагу: внутрішній if перевіряє код лише тоді, коли вік уже пройшов перевірку. Це заощаджує ресурси (і не нервує охоронця).

2. Скільки рівнів вкладеності допустимо?

Технічно — скільки завгодно. Але на практиці що більше рівнів вкладеності, то важче читати й підтримувати такий код. Зазвичай намагаються не виходити за межі 23 рівнів. Якщо ж у вас зʼявляються «сходинки» з 4 і більше вкладених if, варто замислитися: можливо, логіку можна спростити або винести частину перевірок в окремі функції (але це тема іншої лекції).

Вкладеність умов: ілюстрація

3. Вкладені if і else: пастки та нюанси

Типова помилка новачків: недбале оформлення фігурних дужок.

Коли ви пишете вкладені умови, особливо з else, Kotlin суворо дотримується правил синтаксису. Якщо не додати фігурні дужки {}, то до if або else належить лише перший рядок після них. Це часте джерело прикрих багів.

Приклад із потенційною помилкою:

if (age >= 21)
    if (code == "VIP2026")
        println("Ласкаво просимо!");
else
    println("Неправильний код.");

Багато хто очікує, що else належить до перевірки віку. Насправді ж воно належить до найближчого перед ним if — тобто до перевірки запрошувального коду. Через це повідомлення можуть зʼявлятися не так, як ви очікували. Тому краще завжди ставити фігурні дужки — навіть якщо всередині лише один рядок.

Щоб не було плутанини, покажу ще раз. Компілятор сприймає код вище ось так:

if (age >= 21)
{    
    if (code == "VIP2026")
       println("Ласкаво просимо!");
else
    println("Неправильний код.");
}

Важливо! Ще раз: Якщо в конструкції if-else не розставлені фігурні дужки, else належить до попереднього (найближчого до нього) if.

4. Альтернативи: else if у вкладених умовах

Іноді всередині зовнішнього if хочеться не лише перевірити одну додаткову умову, а й передбачити альтернативу. Наприклад, якщо запрошувальний код не підійшов, можна запропонувати купити квиток. Для цього використовують вкладену конструкцію else if/else:

fun main() {
    print("Введіть ваш вік: ")
    val age = readln().toInt()

    if (age >= 21) {
        print("Введіть запрошувальний код: ")
        val code = readln()

        if (code == "VIP2026") {
            println("Ласкаво просимо до клубу!")
        } else if (code == "GUEST") {
            println("Гостьовий режим: доступ лише до 23:00.")
        } else {
            println("На жаль, доступ неможливий.")
        }
    } else {
        println("Вхід лише з 21 року.")
    }
}

У цьому прикладі ми зробили вкладений вибір між трьома сценаріями: VIP-код, гостьовий код і відмова.

5. Практика: калькулятор знижки з багаторівневою логікою

Напишімо невеликий застосунок: користувачу нараховується знижка в магазині на основі віку та наявності клубної картки.

  • Якщо вік користувача більший або дорівнює 60 — знижка 15 %.
  • Якщо вік менший, але в користувача є клубна картка — знижка 7 %.
  • В інших випадках знижки немає.

Як це оформити?

fun main() {
    print("Введіть ваш вік: ")
    val age = readln().toInt()

    var discount = 0.0

    if (age >= 60) {
        discount = 0.15
    } else {
        print("Чи є у вас клубна картка (так/ні)? ")
        val hasCard = readln()

        if (hasCard == "так") {
            discount = 0.07
        }
    }

    println("Ваша знижка: ${discount * 100}%")
}

Тут ми використали вкладений if усередині гілки else. Якщо вік не підійшов, лише тоді запитуємо про картку.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ