Libros y miembros
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 50 de 57.
En este proyecto construirás el núcleo de un sistema de biblioteca. Una clase Library recibe comandos, uno por línea, y responde a cada uno. A lo largo de cinco pasos, aprenderás a añadir libros y miembros, prestar y devolver libros, buscar en el catálogo e imprimir un informe:
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTEl modelo de datos utiliza lo que se enseñó en esta sección. Book y Member viven cada uno en su propio archivo. El borrower de un libro se puede leer en cualquier lugar, pero solo cambia mediante lendTo y giveBack, y un miembro expone los identificadores de sus préstamos como una List de solo lectura. La biblioteca mantiene ambos en mapas privados, por lo que solo sus propios métodos pueden modificarlos:
class Book(val id: Int, val title: String) {
var borrower: String? = null
private set
val isAvailable: Boolean
get() = borrower == null
fun lendTo(name: String) { borrower = name }
}Dentro de main:
val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")Salida:
false adahandle(line) divide el comando y usa un when en su primera palabra. Cada rama devuelve sus respuestas como un List<String>, por lo que un comando como REPORT puede responder con varias líneas, y un return temprano devuelve un rechazo. El título de un libro puede contener espacios, así que es todo lo que aparece después del id:
Dentro de main:
val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")Salida:
7: The HobbitDesafío
FácilCompleta Library.handle(line) para los dos primeros comandos:
ADD_BOOK <id> <title>: guarda un libro nuevo disponible y respondeadded book 1: Dune; cuando el id ya está ocupado, respondebook 1 exists.JOIN <name>: añade un miembro y respondewelcome ada; cuando el nombre ya existe, respondeada is already a member.
El código proporcionado pasa cada línea de entrada a library.handle(line) e imprime cada respuesta devuelta en su propia línea. Los nombres de los miembros son palabras individuales en minúsculas, los ids de los libros son números enteros y la entrada contiene únicamente los comandos descritos hasta ahora. Cualquier otro comando responde unknown command.
Tu código va en Book.kt, Member.kt y Library.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 como está
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 personal2Propiedades 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