Rückblick – Bestellverfolgung
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 36 von 57.
Aufgabe
MittelVerfolge Bestellungen mit den speziellen Klassen dieses Kapitels.
- Das Enum
Statushat die KonstantenNEW,PAID,SHIPPED,DELIVEREDundCANCELLED, jeweils mit einemlabel(new,paid, ...), sowiecanMoveTo(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 mitNEWbeginnt.- Die versiegelte Schnittstelle
Outcomehat die FälleUpdated(order)undRejected(id, reason). Tracker.place(item)erstellt eine Bestellung mit der nächsten ID (1, 2, ...) und gibt sie zurück.move(id, target)gibtRejectedmitno such orderodercannot go from new to deliveredzurück oder speichert eine geänderte Kopie der Bestellung und gibtUpdatedzurü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 1oderno orders.describe(outcome)verwendet ein erschöpfendeswhenund gibt den Text der aktualisierten Bestellung oderrejected 2: no such orderzurü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
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis7Spezielle Klassen
DatenklassenEnum-KlassenVersiegelte Hierarchienequals, hashCode, toStringRückblick – Bestellverfolgung2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground