本と会員
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 50/57。
このプロジェクトでは、図書館システムの中核を作ります。Libraryオブジェクトはコマンドを1行ずつ受け取り、それぞれに応答します。5つのステップを通して、本や会員の追加、本の貸し出しと返却、蔵書の検索、レポートの出力ができるようになります。
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTデータモデルでは、このセクションで学んだことを使います。Bookはidとtitleを読み取り専用で公開し、アクセサーを通じてborrowerを公開し、述語available?を備えています。Memberは、貸し出し中の本のIDを配列に保持します。各クラスはそれぞれ独自のファイルbook.rb、member.rb、library.rbに置かれ、ライブラリは2種類のオブジェクトをハッシュに保持し、それらにアクセスするのはライブラリ自身のメソッドだけです。
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はエラーの返信を返して早期に終了します。本のタイトルにはスペースを含められるため、idの後ろはすべてタイトルです。
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"出力:
7: The Hobbitチャレンジ
簡単最初の2つのコマンドについて、Library#handleを完成させてください。
ADD_BOOK id title: 新しい貸出可能な本を登録し、added book 1: Duneと応答します。idがすでに使われている場合は、book 1 existsと応答します。JOIN name: メンバーを追加し、welcome adaと応答します。nameがすでに存在する場合は、ada is already a memberと応答します。
用意されているコードは、各入力行をlibrary.handle(line)に渡し、返された応答をそれぞれ別の行に出力します。メンバー名は小文字1語で、本の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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ