Menu
Coddy logo textTech

本と会員

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 ada

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

チャレンジ

簡単

最初の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)
    }
}
quiz icon腕試し

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

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

自分で練習してみよう: Kotlinプレイグラウンド