Книги и читатели
Часть раздела Объектно-ориентированное программирование путешествия по 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 TRUEhandle(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Задание
ЛегкоДаны классы 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 = "")
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы S3
Работа с файламиСписки с классомФункции-конструкторыМетоды print и formatВалидаторы и вспомогательные функцииПовторение — температуры4Инкапсуляция в R
Замыкания как объектыОкружения как объектыФункции доступаЗащита состоянияПовторение — парковочный счётчик7S4 Наследование
Расширение с помощью containscallNextMethodВиртуальные классыПроверка типов с помощью is()Повторение — смотритель зоопарка10Шаблоны проектирования, часть 2
Шаблон «Декоратор»Шаблон «Строитель»Шаблон «Состояние»Шаблон «Итератор»2Обобщённые функции и методы S3
Обобщённые функции и UseMethodМетоды по умолчаниюМетоды для базовых обобщённых функцийОсновы NextMethodПовторение — площади фигур5Классы S4
Определение классов S4Слоты и доступПроверка корректностиМетоды showПовторение — каталог товаров8Ссылочные классы
Определение ссылочных классовМетоды и обновление полейСемантика копированияНаследование и callSuperПовторение — очередь задач11Проект: Управление библиотекой
Книги и читателиВыдача книг3Наследование S3
Векторы классовПорядок поиска методовРасширение с помощью NextMethodПроверка с помощью inherits()Повторение — расчёт зарплаты сотрудниковПотренируйтесь самостоятельно: Онлайн-компилятор R