Книги и читатели
Часть раздела Объектно-ориентированное программирование путешествия по 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 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; если идентификатор уже занят, возвращайте ответ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 = "")
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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