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 avec des classes de référence, car les livres et les membres changent pendant l’exécution du programme : un livre est prêté puis rendu, et la liste des emprunts d’un membre s’allonge et se raccourcit. Un objet Library reçoit des commandes, une par ligne, et répond à chacune d’elles. En cinq étapes, il apprend à ajouter des livres et des membres, à prêter et à reprendre des livres, à rechercher dans le catalogue et à imprimer un rapport.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTLe programme possède 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 qui a été 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"]]))Sortie :
ada TRUEhandle(line) divise 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, de sorte qu’une commande telle que REPORT peut renvoyer plusieurs lignes. Un titre peut contenir des espaces, il correspond donc à tout ce qui suit 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 = ": ")Sortie :
7: The HobbitDéfi
FacileLes 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)pourADD_BOOK <id> <title>: stocker un nouveau livre sousas.character(id)et répondreadded book 1: Dune; lorsque l’identifiant est déjà utilisé, répondrebook 1 exists.join(name)pourJOIN <name>: stocker un nouveau membre sous son nom et répondrewelcome ada; lorsque le nom existe déjà, répondreada is already a member.
Le code fourni envoie 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 placé 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 : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
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
1Bases de S3
Travailler avec les fichiersListes avec une classeFonctions constructricesMéthodes print et formatValidateurs et fonctions utilitairesRécapitulatif - Températures4Encapsulation dans R
Les fermetures comme objetsLes environnements comme objetsFonctions d’accèsProtéger l’étatRécapitulatif - Parcmètre2S3 : génériques et méthodes
Génériques et UseMethodMéthodes par défautMéthodes pour les génériques de baseNotions de base sur NextMethodRécapitulatif - Aires des formes5Classes S4
Définir des classes S4Slots et accèsVérifications de validitéMéthodes showRécapitulatif - Catalogue de produits8Classes de référence
Définition des classes de référenceMéthodes et mises à jour des champsSémantique de copieHéritage et callSuperRécapitulatif - File d’attente des tâches11Projet : gestion de bibliothèque
Livres et membresEmprunter des livres3Héritage S3
Vecteurs de classesOrdre de recherche des méthodesÉtendre avec NextMethodVérifier avec inherits()Récapitulatif - Paie du personnelEntraînez-vous par vous-même : Compilateur R en ligne