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é i libri e i membri cambiano mentre il programma è in esecuzione: un libro viene preso in prestito e restituito, la lista dei prestiti di un membro cresce e si riduce. Un oggetto Library riceve comandi, uno per riga, e risponde a ciascuno. In cinque passaggi imparerai 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 relativo a quel comando. Ogni metodo restituisce le risposte sotto forma di vettore di caratteri, quindi un comando come REPORT può rispondere con più righe. Un titolo può contenere spazi, quindi comprende 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 = ": ")Risultato:
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 sottoas.character(id)e rispondiadded book 1: Dune; se l'id è già occupato, 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 distinta. 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. Qualsiasi altro comando restituisce unknown command.
Il tuo codice va inserito 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