Menu
CoddyTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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?

Вывод:

false

handle(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
challenge icon

Задание

Легко

Реализуй Library#handle для первых двух команд:

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

Предоставленный код передаёт каждую строку ввода в library.handle(line) и печатает каждый полученный ответ на отдельной строке. Имена участников состоят из одного слова в нижнем регистре, id книг — целые числа, а ввод содержит только команды, описанные на данный момент. На любую другую команду нужно ответить 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
quiz iconПроверьте себя

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

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

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