Шаг 25.
Основы Kotlin.
Условные конструкции. Убираем скобки в выражениях if/else

    На этом шаге мы рассмотрим правило, определяющее отсутствие таких скобок.

    Когда для данного условия требуется вернуть одно значение, допустимо (по крайней мере синтаксически; подробнее см. дальше) опустить фигурные скобки вокруг выражения. Фигурные скобки { } можно опустить, только если ветвь содержит лишь одно выражение - удаление скобок, окружающих ветвь с несколькими выражениями, повлияет на порядок выполнения кода.

    Рассмотрим версию healthStatus без скобок:

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!"
    .    .    .     .
}

    Эта версия условного выражения healthStatus действует точно так же, как версия в вашем коде. Она даже выражает ту же логику, но меньшим количеством кода. Какую версию вы находите более удобной для чтения и понимания? Выбрав версию со скобками (как в вашем примере кода), вы остановитесь на стиле, который предпочли в сообществе языка Kotlin.

    Мы рекомендуем не отбрасывать скобки в условных операторах и выражениях, которые длиннее одной строки. Во-первых, без скобок с ростом количества условий труднее понять, где заканчивается одна ветвь и начинается другая. Во-вторых, если убрать фигурные скобки, новый участник проекта может случайно обновить не ту ветвь или неправильно понять код. Такие риски не стоят экономии пары нажатий клавиш.

    Кроме того, даже притом, что обе версии кода выше, со скобками и без них, действуют совершенно одинаково, это верно не всегда. Если ветвь включает несколько выражений и вы решите убрать фигурные скобки, тогда в этой ветви выполнится только первое выражение. Например:

  var arrowsInQuiver = 2 //стрел в колчане 
  if (arrowsInQuiver >= 5) {
    println("Plenty of arrows") // стрел достаточно
    println("Cannot hold any more arrows") // больше стрел нести нельзя
  }

    Если у героя пять и более стрел, значит, у него их достаточное количество, и нести больше стрел он не может. Если у героя две стрелы, то в консоль ничего не выведется. Без скобок логика меняется:

  var arrowsInQuiver = 2 //стрел в колчане 
  if (arrowsInQuiver >= 5) 
    println("Plenty of arrows") // стрел достаточно
    println("Cannot hold any more arrows") // больше стрел нести нельзя

    Без скобок вторая инструкция println() более не является частью ветви if. "Plenty of arrows" будет напечатано, если arrowsInQuiver больше или равно 5, но "Cannot hold any more arrows" будет выводиться всегда, независимо от количества стрел у героя.

    Для выражений, умещающихся в одну строку, стоит следовать правилу: "Какой способ записи выражения будет проще и понятнее для читателя?" Часто запись однострочных выражений без фигурных скобок делает код проще для чтения. Например, код, описывающий ауру с помощью простого однострочного условного выражения без фигурных скобок, выглядит проще. Вот еще один пример:

  val healthSummary = if (healthPoints != 100) "Need healing!" else "Looking good." 
  // Need healing = требуется лечение, Looking good = все хорошо

    Кстати, если вы думаете: "Хорошо, но мне не нравится синтаксис if/else, даже с фигурными скобками, он такой некрасивый"... не беспокойтесь! Скоро мы перепишем выражение состояния здоровья в последний раз, использовав более компактный и ясный синтаксис.

    На следующем шаге мы рассмотрим интервалы.




Предыдущий шаг Содержание Следующий шаг