Menu
Coddy logo textTech

Récapitulatif - Suivi des commandes

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 36 sur 57.

challenge icon

Défi

Moyen

Suivez les commandes avec les classes spéciales de ce chapitre.

  • L’énumération Status possède les constantes NEW, PAID, SHIPPED, DELIVERED et CANCELLED, chacune avec un label (new, paid, ...), ainsi que canMoveTo(next) : new peut devenir paid ou cancelled, paid peut devenir shipped ou cancelled, shipped peut devenir delivered, et aucune autre transition n’est autorisée.
  • Order(id, item, status) est une classe de données dont le statut commence à NEW.
  • L’interface scellée Outcome possède les cas Updated(order) et Rejected(id, reason).
  • Tracker.place(item) crée une commande avec l’identifiant suivant (1, 2, ...) et la renvoie. move(id, target) renvoie Rejected avec no such order ou cannot go from new to delivered, ou bien enregistre une copie modifiée de la commande et renvoie Updated. summary() renvoie le nombre de commandes par statut dans l’ordre de l’énumération, en excluant les statuts qui n’en ont aucune : paid 1, cancelled 1, ou no orders.
  • describe(outcome) utilise un when exhaustif et renvoie le texte de la commande mise à jour ou rejected 2: no such order.

Le code fourni lit les commandes place tea ou <status> <id>, telles que paid 1, affiche chaque commande créée, chaque résultat décrit et enfin le récapitulatif.

Votre code doit se trouver dans Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt et Functions.kt. Main.kt contient le code fourni d’entrée/sortie et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    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())
}

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin