Menu
Coddy logo textTech

Повторение — трекер заказов

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

challenge icon

Задание

Средне

Отслеживайте заказы с помощью специальных классов этой главы.

  • Перечисление 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())
}

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

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