Menu
CoddyTech

Bücher und Mitglieder

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 50 von 57.

In diesem Projekt baust du den Kern eines Bibliothekssystems mit Reference Classes, da sich Bücher und Mitglieder ändern, während das Programm läuft: Ein Buch wird ausgeliehen und zurückgegeben, die Liste der Ausleihen eines Mitglieds wird länger und kürzer. Ein Library-Objekt empfängt Befehle, jeweils einen pro Zeile, und antwortet auf jeden. In fünf Schritten lernt es, Bücher und Mitglieder hinzuzufügen, Bücher auszuleihen und zurückzunehmen, den Katalog zu durchsuchen und einen Bericht auszugeben.

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

Das Programm hat eine Klasse pro Datei. Book.R und Member.R enthalten die beiden kleinen Klassen, und Library.R enthält die Klasse, die sie in zwei benannten Listen speichert und die Befehle beantwortet. Da RC-Objekte Referenzen sind, ändert das Ändern eines Buchs, das in der Liste gesucht wurde, das Buch in der Bibliothek:

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

Ausgabe:

ada TRUE

handle(line) zerlegt den Befehl und verwendet switch() für dessen erstes Wort, um die Methode für diesen Befehl aufzurufen. Jede Methode gibt ihre Antworten als Zeichenvektor zurück, sodass ein Befehl wie REPORT mit mehreren Zeilen antworten kann. Ein Titel kann Leerzeichen enthalten, daher umfasst er alles nach der id:

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

Ausgabe:

7: The Hobbit
challenge icon

Aufgabe

Einfach

Die Klassen Book (Felder id, title, borrower) und Member (Felder name, borrowed) sind vorgegeben. Vervollständige zwei Methoden von Library in Library.R:

  • add_book(id, title) für ADD_BOOK <id> <title>: Speichere ein neues Buch unter as.character(id) und gib added book 1: Dune zurück; wenn die ID bereits vergeben ist, gib book 1 exists zurück.
  • join(name) für JOIN <name>: Speichere ein neues Mitglied unter dem Namen und gib welcome ada zurück; wenn der Name bereits existiert, gib ada is already a member zurück.

Der bereitgestellte Code übergibt jede Eingabezeile an lib$handle(line) und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Mitgliedsnamen sind einzelne kleingeschriebene Wörter, Buch-IDs sind ganze Zahlen, und die Eingabe enthält nur die bisher beschriebenen Befehle. Bei jedem anderen Befehl lautet die Antwort unknown command.

Dein Code gehört in Book.R, Member.R und Library.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

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

# Bereitgestellter Ein-/Ausgabecode: unverändert lassen
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler