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 construyes 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, y 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. A lo largo de cinco pasos, aprende 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
REPORTEl 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 de 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 TRUEhandle(line) divide el comando y usa switch() en su primera palabra para llamar al método correspondiente a ese comando. Cada método devuelve sus respuestas como un vector de caracteres, por lo que un comando como REPORT puede responder con varias líneas. Un título puede contener espacios, por lo que incluye todo lo que aparece 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 HobbitDesafío
FácilLas clases Book (campos id, title, borrower) y Member (campos name, borrowed) se proporcionan. Completa dos métodos de Library en Library.R:
add_book(id, title)paraADD_BOOK <id> <title>: almacena un libro nuevo bajoas.character(id)y respondeadded book 1: Dune; cuando el id ya está ocupado, respondebook 1 exists.join(name)paraJOIN <name>: almacena un miembro nuevo bajo el nombre y respondewelcome ada; cuando el nombre ya existe, respondeada 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 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.R, Member.R y Library.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Book.R")
source("Member.R")
source("Library.R")
# Código de entrada/salida suministrado: 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 = "")
}
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
1Fundamentos de S3
Trabajar con archivosListas con una claseFunciones constructorasMétodos de impresión y formatoValidadores y auxiliaresRepaso: temperaturas4Encapsulación en R
Cierres como objetosEntornos como objetosFunciones de accesoProtección del estadoRepaso: parquímetro2S3 Genéricos y métodos
Genéricos y UseMethodMétodos predeterminadosMétodos para genéricos baseFundamentos de NextMethodRepaso: áreas de figuras5Clases S4
Definición de clases S4Slots y accesoComprobaciones de validezMétodos showRepaso - Catálogo de productos8Clases de referencia
Definición de clases de referenciaMétodos y actualizaciones de camposSemántica de copiaHerencia y callSuperRepaso: cola de tareas11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de R online