Menu
CoddyTech

Книги и читатели

Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 50 из 57.

В этом проекте ты создашь основу библиотечной системы с помощью Reference Classes, поскольку книги и читатели меняются во время работы программы: книгу выдают и возвращают, список взятых книг у читателя растёт и сокращается. Объект Library получает команды, по одной на строку, и отвечает на каждую из них. За пять шагов он научится добавлять книги и читателей, выдавать книги и принимать их обратно, искать в каталоге и печатать отчёт.

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

В программе один класс на файл. Book.R и Member.R содержат два небольших класса, а Library.R содержит класс, который хранит их в двух именованных списках и обрабатывает команды. Поскольку объекты RC являются ссылочными, изменение книги, найденной в списке, изменяет книгу в библиотеке:

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

Вывод:

ada TRUE

handle(line) разбивает команду и использует switch() для вызова метода по её первому слову. Каждый метод возвращает ответы в виде вектора символов, поэтому команда, например REPORT, может отвечать несколькими строками. Название может содержать пробелы, поэтому это всё, что идёт после идентификатора:

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

Вывод:

7: The Hobbit
challenge icon

Задание

Легко

Даны классы Book (поля id, title, borrower) и Member (поля name, borrowed). Реализуйте два метода класса Library в Library.R:

  • add_book(id, title) для ADD_BOOK <id> <title>: сохраните новую книгу под ключом as.character(id) и верните ответ added book 1: Dune; если такой id уже занят, верните ответ book 1 exists.
  • join(name) для JOIN <name>: сохраните нового участника под его именем и верните ответ welcome ada; если имя уже существует, верните ответ ada is already a member.

Предоставленный код передаёт каждую входную строку в lib$handle(line) и выводит каждый полученный ответ на отдельной строке. Имена участников состоят из одного слова в нижнем регистре, id книг — целые числа, а входные данные содержат только команды, описанные к этому моменту. На любую другую команду возвращается ответ unknown command.

Ваш код нужно разместить в файлах Book.R, Member.R и Library.R. Файл main.R содержит предоставленный код для ввода/вывода, его нельзя редактировать.

Попробуйте сами

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

# Предоставленный код ввода-вывода: оставьте его без изменений
input <- suppressWarnings(readLines(file("stdin")))
lib <- Library$new()
for (line in input) {
  for (reply in lib$handle(line)) cat(reply, "\n", sep = "")
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор R