Menu
CoddyTech

Książki i czytelnicy

Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 50 z 57.

W tym projekcie zbudujesz podstawę systemu bibliotecznego z użyciem klas referencyjnych, ponieważ książki i użytkownicy zmieniają się podczas działania programu: książka zostaje wypożyczona i zwrócona, a lista wypożyczeń użytkownika powiększa się i zmniejsza. Obiekt Library otrzymuje polecenia, po jednym w każdym wierszu, i odpowiada na każde z nich. W pięciu krokach nauczy się dodawać książki i użytkowników, wypożyczać i zwracać książki, wyszukiwać w katalogu oraz drukować raport.

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

Program ma jedną klasę w każdym pliku. Book.R i Member.R zawierają dwie małe klasy, a Library.R zawiera klasę, która przechowuje je na dwóch listach o nazwach i obsługuje polecenia. Ponieważ obiekty RC są referencjami, zmiana książki pobranej z listy zmienia książkę w bibliotece:

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

Wynik:

ada TRUE

handle(line) dzieli polecenie i używa switch() na jego pierwszym słowie, aby wywołać metodę dla tego polecenia. Każda metoda zwraca odpowiedzi jako wektor znakowy, więc polecenie takie jak REPORT może zwrócić kilka wierszy. Tytuł może zawierać spacje, więc obejmuje wszystko po id:

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

Wynik:

7: The Hobbit
challenge icon

Wyzwanie

Łatwy

Podane są klasy Book (pola id, title, borrower) i Member (pola name, borrowed). Uzupełnij dwie metody klasy Library w pliku Library.R:

  • add_book(id, title) dla ADD_BOOK <id> <title>: zapisz nową książkę pod kluczem as.character(id) i zwróć added book 1: Dune; jeśli identyfikator jest zajęty, zwróć book 1 exists.
  • join(name) dla JOIN <name>: zapisz nowego członka pod jego imieniem i zwróć welcome ada; jeśli imię już istnieje, zwróć ada is already a member.

Dostarczony kod przekazuje każdy wiersz wejścia do lib$handle(line) i wyświetla każdą zwróconą odpowiedź w osobnym wierszu. Imiona członków to pojedyncze słowa zapisane małymi literami, identyfikatory książek to liczby całkowite, a wejście zawiera wyłącznie opisane dotąd polecenia. Każde inne polecenie zwraca unknown command.

Umieść swój kod w plikach Book.R, Member.R i Library.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

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

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online