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
REPORTProgram 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 TRUEhandle(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 HobbitWyzwanie
ŁatwyPodane 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 poleceniaADD_BOOK <id> <title>: zapisz nową książkę pod kluczemas.character(id)i zwróćadded book 1: Dune; jeśli ten identyfikator jest już zajęty, zwróćbook 1 exists.join(name)dla poleceniaJOIN <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 = "")
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online