Menu
Coddy logo textTech

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

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

В этом проекте вы создадите ядро библиотечной системы с помощью ссылочных классов, поскольку книги и читатели изменяются во время работы программы: книгу выдают и возвращают, список займов читателя увеличивается и уменьшается. Объект 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; если идентификатор уже занят, возвращайте ответ book 1 exists.
  • join(name) для JOIN <name>: сохраняйте нового участника под его именем и возвращайте ответ welcome ada; если имя уже существует, возвращайте ответ ada is already a member.

Предоставленный код передаёт каждую входную строку в lib$handle(line) и выводит каждый возвращённый ответ в отдельной строке. Имена участников состоят из одного слова в нижнем регистре, идентификаторы книг являются целыми числами, а входные данные содержат только описанные на данный момент команды. Для любой другой команды возвращается ответ 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