Riepilogo - Monitoraggio ordini
Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 36 di 57.
Sfida
MedioTieni traccia degli ordini con le classi speciali di questo capitolo.
- L'enum
Statusha le costantiNEW,PAID,SHIPPED,DELIVEREDeCANCELLED, ciascuna con unalabel(new,paid, ...), ecanMoveTo(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 comeNEW.- L'interfaccia sealed
Outcomeha i casiUpdated(order)eRejected(id, reason). Tracker.place(item)crea un ordine con l'id successivo (1, 2, ...) e lo restituisce.move(id, target)restituisceRejectedconno such orderocannot go from new to delivered, oppure memorizza una copia modificata dell'ordine e restituisceUpdated.summary()restituisce il numero di ordini per stato nell'ordine dell'enum, escludendo gli stati senza ordini:paid 1, cancelled 1, oppureno orders.describe(outcome)usa unwhenesaustivo e restituisce il testo dell'ordine aggiornato oppurerejected 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
1Classi e oggetti
Lavorare con i fileDefinire le classiCostruttori primariBlocchi init e convalidaCostruttori secondariRiepilogo - Tessera della biblioteca4Ereditarietà
Classi aperte e sottoclassiRidefinizione dei membrisuper e costruttoriClassi astratteRiepilogo - Elenco del personale7Classi speciali
Classi di datiClassi enumGerarchie sigillateequals, hashCode, toStringRiepilogo - Monitoraggio ordini2Proprietà e incapsulamento
Accessor personalizzatiModificatori di visibilitàSetter privatilazy e lateinitRipasso - Conto bancario5Interfacce
Dichiarare le interfacceMetodi predefinitiInterfacce multipleLe interfacce come tipiRiepilogo - Metodi di pagamento8Tipi generici
Funzioni genericheClassi genericheVincoli sui tipiVarianza con in e outRiepilogo - Coda con priorità11Progetto: Gestione della biblioteca
Libri e sociPrendere in prestito i libriEsercitati da solo: Playground Kotlin