Книги и читатели
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 50 из 57.
В этом проекте вы создадите основу библиотечной системы. Объект Library получает команды, по одной в каждой строке, и отвечает на каждую из них. За пять шагов он учится добавлять книги и участников, выдавать книги и принимать их обратно, искать в каталоге и печатать отчёт.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTМодель данных использует то, чему посвящён этот раздел. Book предоставляет доступные только для чтения id и title, а также borrower через аксессор, с предикатом available?. Member хранит идентификаторы своих займов в массиве. Каждый класс находится в отдельном файле: book.rb, member.rb и library.rb, а библиотека хранит объекты обоих типов в хешах, к которым обращаются только её собственные методы:
class Book
attr_reader :id, :title
attr_accessor :borrower
def initialize(id, title)
@id = id
@title = title
@borrower = nil
end
def available?
borrower.nil?
end
end
books = { 1 => Book.new(1, "Dune") }
books[1].borrower = "ada"
puts books[1].available?Вывод:
falsehandle(line) разделяет команду и выбирает ветвление по её первому слову с помощью case. Каждая ветвь возвращает свои ответы в виде массива, поэтому такая команда, как REPORT, может ответить несколькими строками, а return досрочно завершает выполнение с сообщением об ошибке. Название книги может содержать пробелы, поэтому оно включает всё, что идёт после идентификатора:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"Вывод:
7: The HobbitЗадание
ЛегкоРеализуйте Library#handle для первых двух команд:
ADD_BOOK id title: сохраните новую доступную книгу и верните ответadded book 1: Dune; если идентификатор уже занят, верните ответbook 1 exists.JOIN name: добавьте участника и верните ответwelcome ada; если такое имя уже существует, верните ответada is already a member.
Предоставленный код передаёт каждую строку входных данных в library.handle(line) и выводит каждый возвращённый ответ в отдельной строке. Имена участников состоят из одного слова в нижнем регистре, идентификаторы книг являются целыми числами, а входные данные содержат только описанные на данный момент команды. Для любой другой команды возвращается ответ unknown command.
Ваш код должен находиться в файлах book.rb, member.rb и library.rb. В main.rb находится предоставленный код обработки ввода и вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'book'
require_relative 'member'
require_relative 'library'
# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
input << line.chomp
end
library = Library.new
input.each do |line|
library.handle(line).each { |reply| puts reply }
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПеременные экземпляраМетоды и selfto_s и inspectПовторение — читательский билет4Инкапсуляция
Приватные методыЗащищённые методыПриватные сеттерыЗащита состоянияПовторение — торговый автомат7Полиморфизм и утиная типизация
ПолиморфизмУтиная типизацияАбстрактные методыcase и классыПовторение — способы оплаты10Шаблоны проектирования, часть 2
Делегирование с помощью ForwardableШаблон декоратораШаблон строителяШаблон состояния2Аксессоры и self
Чтение и записьПользовательские сеттерыself в методахИдентичность и равенствоПовторение — список контактов5Наследование
ПодклассыПереопределение методовВызов superis_a? и предкиПовторение — расчёт зарплаты сотрудников8Специальные методы
Равенство и хешированиеМетоды операторовИндексация и добавлениеПользовательские коллекцииПовторение — дроби11Проект: Управление библиотекой
Книги и читателиВыдача книг3Методы и переменные классов
Методы классовПеременные экземпляра классаКонстантыФабричные методыПовторение — коды купонов6Модули и примеси
Модули и includeРасширение объектовМодуль ComparableМодуль EnumerableПовторение — спортивная лига9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор Ruby