Menu
Coddy logo textTech

Riepilogo - Monitoraggio ordini

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 36 di 57.

challenge icon

Sfida

Medio

Tieni traccia degli ordini con le classi speciali di questo capitolo.

  • L'enum Status ha le costanti NEW, PAID, SHIPPED, DELIVERED e CANCELLED, ciascuna con una label (new, paid, ...), e canMoveTo(next): new può diventare paid o cancelled, paid può diventare shipped o cancelled, shipped può diventare delivered e nessun'altra transizione è consentita.
  • Order(id, item, status) è una data class il cui status inizia come NEW.
  • L'interfaccia sealed Outcome ha i casi Updated(order) e Rejected(id, reason).
  • Tracker.place(item) crea un ordine con l'id successivo (1, 2, ...) e lo restituisce. move(id, target) restituisce Rejected con no such order o cannot go from new to delivered, oppure memorizza una copia modificata dell'ordine e restituisce Updated. summary() restituisce il numero di ordini per stato nell'ordine dell'enum, escludendo gli stati senza ordini: paid 1, cancelled 1, oppure no orders.
  • describe(outcome) usa un when esaustivo e restituisce il testo dell'ordine aggiornato oppure rejected 2: no such order.

Il codice fornito legge i comandi place tea o <status> <id>, come paid 1, stampa ogni ordine inserito, ogni esito descritto e infine il riepilogo.

Il tuo codice va in Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt e Functions.kt. Main.kt contiene il codice fornito per l'input/output e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    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())
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin