Menu
CoddyTech

Libros y miembros

Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 50 de 57.

En este proyecto construirás el núcleo de un sistema de biblioteca con Clases de Referencia, porque los libros y los miembros cambian mientras se ejecuta el programa: se presta y se devuelve un libro, la lista de préstamos de un miembro crece y se reduce. Un objeto Library recibe comandos, uno por línea, y responde a cada uno. En cinco pasos aprenderá a añadir libros y miembros, prestar y recuperar 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 programa tiene una clase por archivo. Book.R y Member.R contienen las dos clases pequeñas, y Library.R contiene la clase que las almacena en dos listas con nombre y responde a los comandos. Como los objetos RC son referencias, cambiar un libro que se buscó en la lista cambia el libro en la biblioteca:

Book <- setRefClass("Book", fields = list(id = "numeric", title = "character", borrower = "character"))
books <- list()
books[["7"]] <- Book$new(id = 7, title = "Dune")
b <- books[["7"]]
b$borrower <- "ada"
cat(books[["7"]]$borrower, is.null(books[["9"]]))

Salida:

ada TRUE

handle(line) divide el comando y usa switch() con su primera palabra para llamar al método correspondiente a ese comando. Cada método devuelve sus respuestas como un vector de caracteres, así que un comando como REPORT puede responder con varias líneas. Un título puede contener espacios, así que incluye todo lo que viene después del id:

p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")

Salida:

7: The Hobbit
challenge icon

Desafío

Fácil

Se proporcionan las clases Book (campos id, title, borrower) y Member (campos name, borrowed). Completa dos métodos de Library en Library.R:

  • add_book(id, title) para ADD_BOOK <id> <title>: guarda un libro nuevo con la clave as.character(id) y responde added book 1: Dune; si el id ya está ocupado, responde book 1 exists.
  • join(name) para JOIN <name>: guarda un miembro nuevo con el nombre como clave y responde welcome ada; si el nombre ya existe, responde ada is already a member.

El código proporcionado envía cada línea de entrada a lib$handle(line) e imprime cada respuesta devuelta en su propia línea. Los nombres de los miembros son palabras únicas 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.R, Member.R y Library.R. main.R contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

source("Book.R")
source("Member.R")
source("Library.R")

# Código de entrada/salida proporcionado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
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: Compilador de R online