На этом шаге мы рассмотрим назначение и использование теких конструкций.
Теперь оператор if/else не только отображает состояние здоровья игрока, но также добавляет небольшое уточнение.
С другой стороны, код получился немного громоздким, потому что во всех ветвях используются похожие инструкции println(). А теперь представьте, что потребовалось изменить общий формат сообщения о состоянии игрока. Вам придется пройтись по каждой ветке в операторе if/else и изменить сообщение в каждом вызове функции println().
Проблему можно решить, заменив оператор if/else условным выражением. Условное выражение - это почти условный оператор, с той лишь разницей, что результат оператора if/else присваивается переменной, которая будет использоваться в дальнейшем. Обновите вывод о состоянии здоровья, чтобы увидеть, как это работает.
fun main() { . . . . val healthStatus = if (healthPoints == 100) { " is in excellent condition!" } else if (healthPoints >= 90) { " has a few scratches." } else if (healthPoints >= 75) { if (isBlessed) { " has some minor wounds but is healing quite quickly!" } else { " has some minor wounds." } } else if (healthPoints >= 15) { " looks pretty hurt." } else { " is in awful condition!" } // Состояние игрока println(name + " " + healthStatus) }
Рис.1. Использование условного выражения (Game.kt)
Посредством выражения if/else новой переменной healthStatus присваивается строковое значение "is in excellent condition!" и т. п. в зависимости от значения healthPoints. В этом вся прелесть условного выражения. Так как теперь состояние игрока записывается в переменную healthStatus, можно убрать шесть одинаковых по смыслу инструкций println().
Если переменная должна получить значение в зависимости от условия, лучше всего использовать условное выражение. Запомните: условные выражения выглядят проще, если все ветви возвращают значения одного типа (например, строки для healthStatus).
Код, описывающий ауру, также можно упростить с помощью условного выражения. Так и сделаем.
fun main() { . . . . // Аура val auraVisible = isBlessed && healthPoints > 50 || isImmortal val auraColor = if (auraVisible) "GREEN" else "NONE" println(auraColor) . . . . }
Рис.2. Улучшение кода ауры с помощью условного выражения
Запустите код еще раз, чтобы убедиться, что все работает как задумано. Вы увидите такой же вывод, но при этом код стал проще и понятнее.
Возможно, вы заметили, что в условном выражении, возвращающем цвет ауры, исчезли фигурные скобки. Обсудим, почему так произошло.
На следующем шаге мы рассмотрим, куда исчезли скобки в выражениях if/else.