Книги и читатели
Часть раздела Объектно-ориентированное программирование путешествия по 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 adahandle(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Задание
ЛегкоРеализуй 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)
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПервичные конструкторыБлоки init и валидацияВторичные конструкторыПовторение — читательский билет4Наследование
Открытые классы и подклассыПереопределение членовsuper и конструкторыАбстрактные классыПовторение — каталог сотрудников7Специальные классы
Классы данныхКлассы перечисленийЗапечатанные иерархииequals, hashCode, toStringПовторение — трекер заказов10Паттерны проектирования. Часть 2
Делегирование с помощью byПаттерн декораторПаттерн строительПаттерн состояние2Свойства и инкапсуляция
Пользовательские аксессорыМодификаторы видимостиПриватные сеттерыlazy и lateinitПовторение — банковский счёт5Интерфейсы
Объявление интерфейсовМетоды по умолчаниюМножественные интерфейсыИнтерфейсы как типыПовторение — способы оплаты8Обобщения
Обобщённые функцииОбобщённые классыОграничения типовВариативность с in и outПовторение — очередь с приоритетом11Проект: Управление библиотекой
Книги и читателиВыдача книг3Объекты и компаньоны
Объявления объектовОбъекты-компаньоныКонстанты с constОбъектные выраженияПовторение — билетная касса6Полиморфизм
Динамическая диспетчеризацияПроверка типов и умные приведения типовwhen с типамиФункции-расширенияПовторение — смотритель зоопарка9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Песочница Kotlin