Menu
CoddyTech

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
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 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 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 usando as.character(id) e rispondi added book 1: Dune; se l’id è già utilizzato, 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 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 = "")
}
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