本と会員
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 50/57。
このプロジェクトでは、Reference Classes を使って図書館システムの中核を構築します。プログラムの実行中に本や会員の状態が変わるからです。本は貸し出されたり返却されたりし、会員の貸出リストは増えたり減ったりします。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 TRUEhandle(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チャレンジ
簡単クラス 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) に渡し、返された応答をそれぞれ別の行に出力します。メンバー名はすべて小文字の1単語で、本の 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 = "")
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ