Шаг 141.
Основы Kotlin.
Объявление классов. Рефакторинг NyetHack

    На этом шаге мы проведем рефакторинг созданного приложения.

    Вы узнали про функции классов, свойства, инкапсуляцию и уже проделали некоторую работу, применив эти идеи в NyetHack. Настало время закончить работу и сделать код NyetHack еще чище.

    Сейчас мы будем перемещать фрагменты кода из одного файла в другой. Это поможет нам посмотреть на два файла рядом. К счастью, в IntelliJ уже есть такая возможность.

    Открыв Game.kt, щелкните правой кнопкой мыши на вкладке Player.kt в верхней части окна редактора и выберите Split Vertically (рисунок 1).


Рис.1. Разделяем окно редактора вертикально

    Появится еще одна панель редактора (рисунок 2). (Можно перетаскивать вкладки между панелями редактора, чтобы настроить его под свой вкус.)


Рис.2. Две панели

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

    Найдите переменные, объявленные в функции main() Game.kt, которые, по логике, принадлежат Player. К ним относятся: heathPoints, isBlessed и isImmortal.


Рис.3. Удаляемые переменные

    Превратим их в свойства Player.

    После добавления их в Player.kt убедитесь, что переменные объявлены внутри тела класса Player.

class Player {
    var name = "madrigal"
        get() = field.capitalize()
        private set(value) {
            field = value.trim()
        }

    var healthPoints = 89
    val isBlessed = true
    val isImmortal = false

    fun castFireball(numFireballs: Int = 2) =
            println("A glass of Fireball springs into existence. (x$numFireballs)")
}
Эти изменения приведут к множеству ошибок в Game.kt. К тому времени, как вы закончите, все ошибки будут устранены.

    Свойства heathPoints и isBlessed должны быть доступны в Game.kt. Но к isImmortal никогда не обращаются вне класса Player, поэтому свойство isImmortal следует объявить приватным. Скроем свойство, добавив модификатор private, чтобы гарантировать его недоступность для других классов.

class Player {
    var name = "madrigal"
        get() = field.capitalize()
        private set(value) {
            field = value.trim()
        }

    var healthPoints = 89
    val isBlessed = true
    private val isImmortal = false

    fun castFireball(numFireballs: Int = 2) =
            println("A glass of Fireball springs into existence. (x$numFireballs)")
}


Рис.5. Задание модификатора private

    На следующем шаге мы продолжим рефакторинг приложения.




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