На этом шаге мы рассмотрим преобразование в функции других частей кода.
Продолжим выделение логики из прежней функции 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. Результат работы приложения
На следующем шаге мы рассмотрим создание собственных функций.