Menu
CoddyTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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 возвращает отказ. Название книги может содержать пробелы, поэтому это всё, что идёт после id:

Внутри 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