Menu
Coddy logo textTech

Repaso - Rastreador de pedidos

Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 36 de 57.

challenge icon

Desafío

Intermedio

Rastrea pedidos con las clases especiales de este capítulo.

  • El enum Status tiene las constantes NEW, PAID, SHIPPED, DELIVERED y CANCELLED, cada una con un label (new, paid, ...), y canMoveTo(next): new puede convertirse en paid o cancelled, paid puede convertirse en shipped o cancelled, shipped puede convertirse en delivered, y no se permite nada más.
  • Order(id, item, status) es una clase de datos cuyo estado comienza como NEW.
  • La interfaz sellada Outcome tiene los casos Updated(order) y Rejected(id, reason).
  • Tracker.place(item) crea un pedido con el siguiente id (1, 2, ...) y lo devuelve. move(id, target) devuelve Rejected con no such order o cannot go from new to delivered, o almacena una copia modificada del pedido y devuelve Updated. summary() devuelve el número de pedidos por estado en el orden del enum, omitiendo los estados que no tienen ninguno: paid 1, cancelled 1, o no orders.
  • describe(outcome) usa un when exhaustivo y devuelve el texto del pedido actualizado o rejected 2: no such order.

El código proporcionado lee comandos place tea o <status> <id>, como paid 1, imprime cada pedido creado, cada resultado descrito y finalmente el resumen.

Tu código va en Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt y Functions.kt. Main.kt contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

fun main() {
    // Código de entrada/salida suministrado: déjalo tal como está
    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())
}

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Kotlin