Menu
Coddy logo textTech

Книги и читатели

Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 50 из 57.

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

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

Модель данных использует то, чему был посвящён этот раздел. Book и Member находятся каждый в своём файле. Поле borrower книги можно читать отовсюду, но изменять его можно только через lendTo и giveBack, а объект участника предоставляет идентификаторы своих займов в виде доступного только для чтения List. Библиотека хранит оба типа объектов в закрытых картах, поэтому изменять их могут только её собственные методы:

class Book(val id: Int, val title: String) {
    var borrower: String? = null
        private set
    val isAvailable: Boolean
        get() = borrower == null
    fun lendTo(name: String) { borrower = name }
}

Внутри main:

val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")

Вывод:

false ada

handle(line) разделяет команду и использует when для её первого слова. Каждая ветвь возвращает свои ответы в виде List<String>, поэтому такая команда, как REPORT, может ответить несколькими строками, а ранний return возвращает отказ. Название книги может содержать пробелы, поэтому оно включает всё, что идёт после идентификатора:

Внутри main:

val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")

Вывод:

7: The Hobbit
challenge icon

Задание

Легко

Реализуйте Library.handle(line) для первых двух команд:

  • ADD_BOOK <id> <title>: сохраните новую доступную книгу и выведите ответ added book 1: Dune; если идентификатор уже занят, выведите ответ book 1 exists.
  • JOIN <name>: добавьте участника и выведите ответ welcome ada; если имя уже существует, выведите ответ ada is already a member.

Предоставленный код передаёт каждую входную строку в library.handle(line) и выводит каждый возвращённый ответ в отдельной строке. Имена участников состоят из одного слова в нижнем регистре, идентификаторы книг являются целыми числами, а ввод содержит только описанные на данный момент команды. Для любой другой команды выводится ответ unknown command.

Ваш код должен находиться в файлах Book.kt, Member.kt и Library.kt. В Main.kt содержится предоставленный код ввода/вывода, и его нельзя изменять.

Попробуйте сами

fun main() {
    // Предоставленный код ввода/вывода: оставьте его как есть
    val input = generateSequence(::readLine).toList()
    val library = Library()
    for (line in input) {
        for (reply in library.handle(line)) println(reply)
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Песочница Kotlin