Menu
Coddy logo textTech

Recapitulação - Rastreador de Pedidos

Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 36 de 57.

challenge icon

Desafio

Médio

Rastreie pedidos com as classes especiais deste capítulo.

  • O enum Status tem as constantes NEW, PAID, SHIPPED, DELIVERED e CANCELLED, cada uma com um label (new, paid, ...), e canMoveTo(next): new pode se tornar paid ou cancelled, paid pode se tornar shipped ou cancelled, shipped pode se tornar delivered, e nada mais é permitido.
  • Order(id, item, status) é uma classe de dados cujo status começa como NEW.
  • A interface selada Outcome tem os casos Updated(order) e Rejected(id, reason).
  • Tracker.place(item) cria um pedido com o próximo id (1, 2, ...) e o retorna. move(id, target) retorna Rejected com no such order ou cannot go from new to delivered, ou armazena uma cópia alterada do pedido e retorna Updated. summary() retorna o número de pedidos por status na ordem do enum, omitindo os status que não têm nenhum: paid 1, cancelled 1, ou no orders.
  • describe(outcome) usa um when exaustivo e retorna o texto do pedido atualizado ou rejected 2: no such order.

O código fornecido lê comandos place tea ou <status> <id>, como paid 1, imprime cada pedido criado, cada resultado descrito e, por fim, o resumo.

Seu código deve estar em Status.kt, Order.kt, Outcome.kt, Updated.kt, Rejected.kt, Tracker.kt e Functions.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

fun main() {
    // Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Kotlin