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.
Desafío
IntermedioRastrea pedidos con las clases especiales de este capítulo.
- El enum
Statustiene las constantesNEW,PAID,SHIPPED,DELIVEREDyCANCELLED, cada una con unlabel(new,paid, ...), ycanMoveTo(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 comoNEW.- La interfaz sellada
Outcometiene los casosUpdated(order)yRejected(id, reason). Tracker.place(item)crea un pedido con el siguiente id (1, 2, ...) y lo devuelve.move(id, target)devuelveRejectedconno such orderocannot go from new to delivered, o almacena una copia modificada del pedido y devuelveUpdated.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, ono orders.describe(outcome)usa unwhenexhaustivo y devuelve el texto del pedido actualizado orejected 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
1Clases y objetos
Trabajar con archivosDefinir clasesConstructores primariosBloques init y validaciónConstructores secundariosRepaso - Tarjeta de biblioteca4Herencia
Clases abiertas y subclasesSobrescritura de miembrossuper y constructoresClases abstractasRepaso: directorio del personal7Clases especiales
Clases de datosClases enumJerarquías selladasequals, hashCode, toStringRepaso - Rastreador de pedidos2Propiedades y encapsulación
Accesores personalizadosModificadores de visibilidadSetters privadoslazy y lateinitRepaso: cuenta bancaria5Interfaces
Declaración de interfacesMétodos predeterminadosInterfaces múltiplesInterfaces como tiposRepaso: métodos de pago8Genéricos
Funciones genéricasClases genéricasRestricciones de tiposVariancia con in y outRepaso - Cola de prioridad11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Kotlin