Libros y miembros
Parte de la sección Programación orientada a objetos del Journey de Swift 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 las herramientas de esta sección. Book es una estructura: un valor cuyo borrower cambia. Member es una clase, porque la biblioteca y la lista de préstamos de un miembro hacen referencia a la misma persona. La biblioteca mantiene ambos en diccionarios privados, por lo que solo sus métodos pueden modificarlos:
struct Book {
let id: Int
let title: String
var borrower: String? = nil
var isAvailable: Bool { borrower == nil }
}
var books: [Int: Book] = [:]
books[1] = Book(id: 1, title: "Dune")
books[1]!.borrower = "ada"
print(books[1]!.isAvailable)Salida:
falsehandle(_:) divide el comando y evalúa su primera palabra. Cada rama devuelve sus respuestas como un arreglo, por lo que un comando como REPORT puede responder con varias líneas. El título de un libro puede contener espacios, así que incluye todo lo que está después del id:
let p = "ADD_BOOK 7 The Hobbit".split(separator: " ").map(String.init)
let id = Int(p[1])!
let title = p.dropFirst(2).joined(separator: " ")
print("\(id): \(title)")Salida:
7: The HobbitDesafío
FácilCompleta Library.handle(_:) para los dos primeros comandos:
ADD_BOOK <id> <title>: almacena 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(_:) 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.swift, Member.swift y Library.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
// Código de entrada/salida suministrado: déjalo tal como está
var input: [String] = []
while let line = readLine() { input.append(line) }
let library = Library()
for line in input {
for reply in library.handle(line) { print(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 clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift