Menu
Coddy logo textTech

Rückblick – Bestellverfolgung

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 36 von 57.

challenge icon

Aufgabe

Mittel

Verfolge Bestellungen mit den speziellen Klassen dieses Kapitels.

  • Das Enum Status hat die Konstanten NEW, PAID, SHIPPED, DELIVERED und CANCELLED, jeweils mit einem label (new, paid, ...), sowie canMoveTo(next): new darf zu paid oder cancelled werden, paid darf zu shipped oder cancelled werden, shipped darf zu delivered werden, und alles andere ist nicht erlaubt.
  • Order(id, item, status) ist eine Datenklasse, deren Status mit NEW beginnt.
  • Die versiegelte Schnittstelle Outcome hat die Fälle Updated(order) und Rejected(id, reason).
  • Tracker.place(item) erstellt eine Bestellung mit der nächsten ID (1, 2, ...) und gibt sie zurück. move(id, target) gibt Rejected mit no such order oder cannot go from new to delivered zurück oder speichert eine geänderte Kopie der Bestellung und gibt Updated zurück. summary() gibt die Anzahl der Bestellungen pro Status in der Reihenfolge des Enums zurück und lässt Status ohne Bestellungen weg: paid 1, cancelled 1 oder no orders.
  • describe(outcome) verwendet ein erschöpfendes when und gibt den Text der aktualisierten Bestellung oder rejected 2: no such order zurück.

Der bereitgestellte Code liest Befehle wie place tea oder <status> <id>, zum Beispiel paid 1, gibt jede aufgegebene Bestellung und jedes beschriebene Ergebnis aus und schließlich die Zusammenfassung.

Dein Code gehört in Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt und Functions.kt. Main.kt enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

fun main() {
    // Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
    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())
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Kotlin-Playground