Menu
Coddy logo textTech

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
REPORT

Il 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 TRUE

handle(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 Hobbit
challenge icon

Sfida

Facile

Le 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) per ADD_BOOK <id> <title>: memorizza un nuovo libro sotto as.character(id) e rispondi added book 1: Dune; se l'id è già occupato, rispondi book 1 exists.
  • join(name) per JOIN <name>: memorizza un nuovo membro usando il nome e rispondi welcome ada; se il nome esiste già, rispondi ada 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 = "")
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore R online