Menu
CoddyTech

Livres et membres

Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 50 sur 57.

Dans ce projet, vous construisez le cœur d’un système de bibliothèque à l’aide des classes de référence, car les livres et les membres changent pendant l’exécution du programme : un livre est emprunté puis rendu, la liste des emprunts d’un membre s’allonge et raccourcit. Un objet Library reçoit des commandes, une par ligne, et répond à chacune. En cinq étapes, il apprend à ajouter des livres et des membres, à prêter et à récupérer des livres, à rechercher dans le catalogue et à imprimer un rapport.

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

Le programme a une classe par fichier. Book.R et Member.R contiennent les deux petites classes, et Library.R contient la classe qui les stocke dans deux listes nommées et répond aux commandes. Comme les objets RC sont des références, modifier un livre recherché dans la liste modifie le livre dans la bibliothèque :

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"]]))

Résultat :

ada TRUE

handle(line) sépare la commande et utilise switch() sur son premier mot pour appeler la méthode correspondant à cette commande. Chaque méthode renvoie ses réponses sous forme de vecteur de caractères ; une commande telle que REPORT peut donc renvoyer plusieurs lignes. Un titre peut contenir des espaces : il correspond donc à tout ce qui suit l’identifiant :

p <- strsplit("ADD_BOOK 7 The Hobbit", " ")[[1]]
id <- as.numeric(p[2])
title <- paste(p[-(1:2)], collapse = " ")
cat(id, title, sep = ": ")

Sortie :

7: The Hobbit
challenge icon

Défi

Facile

Les classes Book (champs id, title, borrower) et Member (champs name, borrowed) sont fournies. Complétez deux méthodes de Library dans Library.R :

  • add_book(id, title) pour ADD_BOOK <id> <title> : enregistrez un nouveau livre sous as.character(id) et répondez added book 1: Dune ; si l’identifiant est déjà pris, répondez book 1 exists.
  • join(name) pour JOIN <name> : enregistrez un nouveau membre sous son nom et répondez welcome ada ; si le nom existe déjà, répondez ada is already a member.

Le code fourni transmet chaque ligne d’entrée à lib$handle(line) et affiche chaque réponse renvoyée sur sa propre ligne. Les noms des membres sont des mots uniques en minuscules, les identifiants des livres sont des nombres entiers, et l’entrée ne contient que les commandes décrites jusqu’à présent. Toute autre commande renvoie unknown command.

Votre code doit être écrit dans Book.R, Member.R et Library.R. main.R contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

source("Book.R")
source("Member.R")
source("Library.R")

# Code d'entrée/sortie fourni : conservez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur R en ligne