Повторение — трекер заказов
Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 36 из 57.
Задание
СреднеОтслеживайте заказы с помощью специальных классов этой главы.
- Перечисление
Statusсодержит константыNEW,PAID,SHIPPED,DELIVEREDиCANCELLED, каждая из которых имеетlabel(new,paid, ...), а такжеcanMoveTo(next): new может стать paid или cancelled, paid может стать shipped или cancelled, shipped может стать delivered, а все остальные переходы запрещены. Order(id, item, status)— это класс данных, статус которого изначально равенNEW.- Запечатанный интерфейс
Outcomeимеет вариантыUpdated(order)иRejected(id, reason). Tracker.place(item)создаёт заказ со следующим идентификатором (1, 2, ...) и возвращает его.move(id, target)возвращаетRejectedс причинойno such orderилиcannot go from new to deliveredлибо сохраняет изменённую копию заказа и возвращаетUpdated.summary()возвращает количество заказов для каждого статуса в порядке перечисления, пропуская статусы, для которых заказов нет:paid 1, cancelled 1илиno orders.describe(outcome)использует исчерпывающийwhenи возвращает текст обновлённого заказа илиrejected 2: no such order.
Предоставленный код считывает команды place tea или <status> <id>, например paid 1, выводит каждый размещённый заказ, каждый описанный результат и в конце сводку.
Ваш код должен находиться в файлах Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt и Functions.kt. В Main.kt находится предоставленный код ввода-вывода, и его нельзя изменять.
Попробуйте сами
fun main() {
// Предоставленный код ввода/вывода: оставьте его как есть
val input = generateSequence(::readLine).toList()
val tracker = Tracker()
for (cmd in input) {
val p = cmd.split(" ")
if (p[0] == "place") {
println(tracker.place(p[1]))
} else {
val target = Status.entries.find { it.label == p[0] }
if (target == null) println("unknown status ${p[0]}")
else println(describe(tracker.move(p[1].toInt(), target)))
}
}
println(tracker.summary())
}
Все уроки раздела Объектно-ориентированное программирование
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