Menu
Coddy logo textTech

本と会員

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

このプロジェクトでは、書籍やメンバーはプログラムの実行中に変化するため、参照クラスを使って図書館システムの中核を構築します。書籍は貸し出されたり返却されたりし、メンバーの貸出一覧は増えたり減ったりします。Libraryオブジェクトは1行につき1つのコマンドを受け取り、それぞれに応答します。5つのステップを通して、書籍とメンバーの追加、書籍の貸し出しと返却、カタログの検索、レポートの出力を学習します。

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

プログラムでは、ファイルごとに1つのクラスがあります。Book.R と Member.R には2つの小さなクラスが定義され、Library.R にはそれらを名前付きリストとして2つ格納し、コマンドに応答するクラスが定義されています。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 TRUE

handle(line)はコマンドを分割し、最初の単語に対してswitch()を使用して、そのコマンドのメソッドを呼び出します。各メソッドは返信を文字ベクトルとして返すため、REPORTのようなコマンドでは複数行を返信できます。タイトルにはスペースを含められるため、id以降のすべてがタイトルになります。

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

チャレンジ

簡単

クラス Book(フィールド id、title、borrower)と Member(フィールド name、borrowed)が与えられています。Library.R の Library の2つのメソッドを完成させてください:

  • ADD_BOOK <id> <title> に対応する add_book(id, title):as.character(id) の下に新しい本を保存し、added book 1: Dune と応答します。idが使用済みの場合は、book 1 exists と応答します。
  • JOIN <name> に対応する join(name):名前の下に新しいメンバーを保存し、welcome ada と応答します。名前がすでに存在する場合は、ada is already a member と応答します。

提供されたコードは、すべての入力行を lib$handle(line) に送り、返された各応答をそれぞれ独立した行に出力します。メンバー名は小文字の単一の単語であり、本のidは整数です。入力には、これまでに説明したコマンドのみが含まれます。それ以外のコマンドには 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 = "")
}
quiz icon腕試し

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

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

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