Menu
CoddyTech

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, construyes 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, aprende 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
REPORT

El modelo de datos usa 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:

false

handle(_:) divide el comando y comprueba su primera palabra. Cada rama devuelve sus respuestas como una matriz, así que un comando como REPORT puede responder con varias líneas. El título de un libro puede contener espacios, así que es todo lo que aparece 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 Hobbit
challenge icon

Desafío

Fácil

Completa Library.handle(_:) para los dos primeros comandos:

  • ADD_BOOK <id> <title>: guarda un libro nuevo disponible y responde added book 1: Dune; si el id ya está ocupado, responde book 1 exists.
  • JOIN <name>: añade un miembro y responde welcome ada; si el nombre ya existe, responde ada is already a member.

El código proporcionado pasa cada línea de entrada a library.handle(_:) e imprime cada respuesta devuelta en una línea propia. Los nombres de los miembros son palabras en minúsculas sin espacios, los id de los libros son números enteros y la entrada solo contiene 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 de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

// Código de entrada/salida proporcionado: 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) }
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Swift