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.
Desafio
MédioRastreie pedidos com as classes especiais deste capítulo.
- O enum
Statustem as constantesNEW,PAID,SHIPPED,DELIVEREDeCANCELLED, cada uma com umlabel(new,paid, ...), ecanMoveTo(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 comoNEW.- A interface selada
Outcometem os casosUpdated(order)eRejected(id, reason). Tracker.place(item)cria um pedido com o próximo id (1, 2, ...) e o retorna.move(id, target)retornaRejectedcomno such orderoucannot go from new to delivered, ou armazena uma cópia alterada do pedido e retornaUpdated.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, ouno orders.describe(outcome)usa umwhenexaustivo e retorna o texto do pedido atualizado ourejected 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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesConstrutores PrimáriosBlocos init e ValidaçãoConstrutores SecundáriosRecapitulação - Cartão da Biblioteca4Herança
Classes Abertas e SubclassesSobrescrevendo Membrossuper e ConstrutoresClasses AbstratasRevisão - Diretório de Funcionários7Classes Especiais
Classes de DadosClasses EnumHierarquias Seladasequals, hashCode, toStringRecapitulação - Rastreador de Pedidos2Propriedades e Encapsulamento
Acessores PersonalizadosModificadores de VisibilidadeSetters Privadoslazy e lateinitRevisão - Conta Bancária5Interfaces
Declarando InterfacesMétodos PadrãoMúltiplas InterfacesInterfaces como TiposRecapitulação - Métodos de Pagamento8Genéricos
Funções genéricasClasses genéricasRestrições de tipoVariância com in e outRecapitulação - Fila de prioridade11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Kotlin