Шаг 35.
Основы Kotlin.
Функции. Рефакторинг функций

    На этом шаге мы рассмотрим преобразование в функции других частей кода.

    Продолжим выделение логики из прежней функции main() в отдельные функции, используя возможность выделения функций. Начнем с рефакторинга кода, определяющего цвет ауры. Выделите код, начиная со строки, где определяется видимость ауры, до строки, где заканчивается оператор if/else, проверяющий булево значение, которое мы хотим вывести:


Рис.1. Выделение необходимого фрагмента

    Далее выберите команду Extract Function. Это можно сделать, щелкнув правой кнопкой мыши на выделенном коде и выбрав Refactor | Function..., как вы делали ранее. Можно просто выбрать в меню Refractor | Extract/Introduce | Function...


Рис.2. Другой способ преобразования в функцию

    Можно использовать сочетание клавиш Ctrl+Alt+M.

    Какой бы способ вы ни выбрали, появится диалоговое окно, как на рисунке 3.


Рис.3. Задание имени функции

    Присвойте новой функции имя auraColor.


Если вы хотите посмотреть на итоговый код, наберитесь терпения: мы увидим его после того, как вы выделите еще несколько функций.

    Далее, выделите в новую функцию логику, которая выводит состояние игрока. Выберите две функции println() в main():


Рис.4. Выделение двух функций println()

    Выделите их в функцию с именем printPlayerStatus. Файл Game.kt теперь выглядит так:

fun main() {
    val name = "Madrigal"
    var healthPoints = 89
    val isBlessed = true
    val isImmortal = false

    // Аура
    val auraColor = auraColor(isBlessed, healthPoints, isImmortal)


    val healthStatus = formatHealthStatus(healthPoints, isBlessed)

    // Состояние игрока
    printPlayerStatus(auraColor, isBlessed, name, healthStatus)
}

private fun printPlayerStatus(auraColor: String, isBlessed: Boolean, name: String, 
       healthStatus: String) {
    println("(Aura: $auraColor) " +
            "(Blessed:  ${if (isBlessed) "YES" else "NO"})")
    println("$name $healthStatus")
}

private fun auraColor(isBlessed: Boolean, healthPoints: Int, 
       isImmortal: Boolean): String {
    val auraVisible = isBlessed && healthPoints > 50 || isImmortal
    val auraColor = if (auraVisible) "GREEN" else "NONE"
    return auraColor
}

private fun formatHealthStatus(healthPoints: Int, isBlessed: Boolean): String {
    val healthStatus = when (healthPoints) {
        100 -> "is in excellent condition!"
        in 90..99 -> "has a few scratches."
        in 75..89 -> if (isBlessed) {
            "has some minor wounds but is healing quite quickly!"
        } else {
            "has some minor wounds."
        }
        in 15..74 -> "looks pretty hurt."
        else -> "is in awful condition!"
    }
    return healthStatus
}
Файл с проектом можно взять здесь.

    Запустите NyetHack. Вы увидите знакомое состояние героя и цвет его ауры:

  (Aura: GREEN) (Blessed: YES)
  Madrigal has some minor wounds, but is healing quite quickly!


Рис.5. Результат работы приложения

    На следующем шаге мы рассмотрим создание собственных функций.




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