Menu
Coddy logo textTech

Podsumowanie — śledzenie zamówień

Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 36 z 57.

challenge icon

Wyzwanie

Średni

Śledź zamówienia za pomocą specjalnych klas z tego rozdziału.

  • Wyliczenie Status ma stałe NEW, PAID, SHIPPED, DELIVERED i CANCELLED, każda z etykietą label (new, paid, ...), oraz canMoveTo(next): stan new może zmienić się na paid lub cancelled, paid może zmienić się na shipped lub cancelled, shipped może zmienić się na delivered, a żadne inne przejścia nie są dozwolone.
  • Order(id, item, status) jest klasą danych, której status początkowo ma wartość NEW.
  • Zap sealed Outcome ma przypadki Updated(order) i Rejected(id, reason).
  • Tracker.place(item) tworzy zamówienie z kolejnym id (1, 2, ...) i je zwraca. move(id, target) zwraca Rejected z wartością no such order lub cannot go from new to delivered, albo zapisuje zmienioną kopię zamówienia i zwraca Updated. summary() zwraca liczbę zamówień dla każdego statusu w kolejności wyliczenia, pomijając statusy, których nie ma: paid 1, cancelled 1 lub no orders.
  • describe(outcome) używa wyczerpującego wyrażenia when i zwraca tekst zaktualizowanego zamówienia lub rejected 2: no such order.

Dostarczony kod odczytuje polecenia place tea lub <status> <id>, takie jak paid 1, wyświetla każde utworzone zamówienie, każdy opisany wynik, a na końcu podsumowanie.

Twój kod umieść w plikach Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt i Functions.kt. Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

fun main() {
    // Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
    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())
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Kotlin