Menu
Coddy logo textTech

本と会員

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 50/57。

このプロジェクトでは、図書館システムの中核を構築します。Libraryオブジェクトは1行につき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?

出力:

false

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

チャレンジ

簡単

最初の2つのコマンドについて、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)に渡し、返された各応答をそれぞれ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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ