本と会員
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 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) に送り、返された各応答をそれぞれ独立した行に出力します。メンバー名は小文字の単一の単語であり、本の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オンラインコンパイラ