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