本と会員
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 50/57。
このプロジェクトでは、図書館システムの中核を構築します。Libraryクラスは1行につき1つのコマンドを受け取り、それぞれに応答します。5つのステップを通して、本や会員の追加、本の貸し出しと返却、蔵書の検索、レポートの出力を行えるようになります。
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTデータモデルでは、このセクションで学んだ内容を使います。BookとMemberはそれぞれ別のファイルにあります。書籍のborrowerはどこからでも読み取れますが、変更できるのはlendToとgiveBackを通じてだけです。また、メンバーは貸出のIDを読み取り専用のListとして公開します。ライブラリは両方をプライベートなマップに保持するため、それらを変更できるのはライブラリ自身のメソッドだけです。
class Book(val id: Int, val title: String) {
var borrower: String? = null
private set
val isAvailable: Boolean
get() = borrower == null
fun lendTo(name: String) { borrower = name }
}mainの中では:
val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")出力:
false adahandle(line)はコマンドを分割し、最初の単語に対してwhenを使います。各分岐は返信をList<String>として返すため、REPORTのようなコマンドは複数行で返信でき、早期のreturnは拒否の応答を返します。本のタイトルには空白が含まれることがあるため、idより後ろのすべてがタイトルです:
mainの中:
val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")出力:
7: The Hobbitチャレンジ
簡単最初の2つのコマンドについて、Library.handle(line)を完成させてください。
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.kt、Member.kt、Library.ktに記述してください。Main.ktには提供された入出力用のコードがあり、編集できません。
自分で試してみよう
fun main() {
// 提供された入出力コード: そのままにしておく
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Kotlinプレイグラウンド