Menu
Coddy logo textTech

Książki i czytelnicy

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

W tym projekcie zbudujesz podstawy systemu bibliotecznego z użyciem Reference Classes, ponieważ książki i członkowie zmieniają się podczas działania programu: książka jest wypożyczana i zwracana, a lista wypożyczeń członka rośnie i maleje. 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 członków, wypożyczać i zwracać książki, przeszukiwać katalog 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 wyszukanej na liście 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 komendę i używa switch() na jej pierwszym słowie, aby wywołać metodę obsługującą tę komendę. Każda metoda zwraca odpowiedzi jako wektor znakowy, więc komenda taka jak REPORT może zwrócić kilka wierszy. Tytuł może zawierać spacje, więc obejmuje wszystko, co znajduje się po identyfikatorze:

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

Dostarczony kod przekazuje każdą linię wejścia do lib$handle(line) i wyświetla każdą zwróconą odpowiedź w osobnej linii. Imiona członków składają się z pojedynczych słów pisanych małymi literami, identyfikatory książek są liczbami całkowitymi, a wejście zawiera tylko 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