Libri e iscritti
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 50 di 57.
In questo progetto costruisci il nucleo di un sistema bibliotecario con le Reference Classes, perché libri e membri cambiano mentre il programma è in esecuzione: un libro viene prestato e restituito, l’elenco dei prestiti di un membro si allunga e si accorcia. Un oggetto Library riceve comandi, uno per riga, e risponde a ciascuno. In cinque passaggi impara ad aggiungere libri e membri, prestare e riprendere libri, cercare nel catalogo e stampare un rapporto.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTIl programma ha una classe per file. Book.R e Member.R contengono le due piccole classi, mentre Library.R contiene la classe che le memorizza in due liste con nome e gestisce i comandi. Poiché gli oggetti RC sono riferimenti, modificare un libro cercato nella lista modifica il libro nella 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"]]))Output:
ada TRUEhandle(line) divide il comando e usa switch() sulla sua prima parola per chiamare il metodo corrispondente a quel comando. Ogni metodo restituisce le proprie risposte come vettore di caratteri, quindi un comando come REPORT può rispondere con più righe. Un titolo può contenere spazi, quindi è tutto ciò che segue l'id:
p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")Output:
7: The HobbitSfida
FacileLe classi Book (campi id, title, borrower) e Member (campi name, borrowed) sono fornite. Completa due metodi di Library in Library.R:
add_book(id, title)perADD_BOOK <id> <title>: memorizza un nuovo libro usandoas.character(id)e rispondiadded book 1: Dune; se l’id è già utilizzato, rispondibook 1 exists.join(name)perJOIN <name>: memorizza un nuovo membro usando il nome e rispondiwelcome ada; se il nome esiste già, rispondiada is already a member.
Il codice fornito invia ogni riga di input a lib$handle(line) e stampa ogni risposta restituita su una riga separata. I nomi dei membri sono parole singole in minuscolo, gli ID dei libri sono numeri interi e l’input contiene solo i comandi descritti finora. Per qualsiasi altro comando, rispondi unknown command.
Il tuo codice va in Book.R, Member.R e Library.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Book.R")
source("Member.R")
source("Library.R")
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online