Menu
Coddy logo textTech

Bücher und Mitglieder

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 50 von 57.

In diesem Projekt erstellst du den Kern eines Bibliothekssystems. Eine Library-Klasse empfängt Befehle, einen pro Zeile, und antwortet auf jeden einzelnen. In fünf Schritten lernt sie, Bücher und Mitglieder hinzuzufügen, Bücher auszuleihen und zurückzugeben, den Katalog zu durchsuchen und einen Bericht auszugeben:

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

Das Datenmodell verwendet das, was in diesem Abschnitt vermittelt wurde. Book und Member befinden sich jeweils in ihrer eigenen Datei. Der borrower eines Buches kann überall gelesen, aber nur über lendTo und giveBack geändert werden, und ein Mitglied stellt die IDs seiner Ausleihen als schreibgeschützte List bereit. Die Bibliothek verwaltet beide in privaten Maps, sodass nur ihre eigenen Methoden sie ändern können:

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 }
}

Innerhalb von 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}")

Ausgabe:

false ada

handle(line) teilt den Befehl auf und verwendet ein when für dessen erstes Wort. Jeder Zweig gibt seine Antworten als eine List<String> zurück, sodass ein Befehl wie REPORT mit mehreren Zeilen antworten kann und ein vorzeitiges return eine Ablehnung zurückgibt. Der Titel eines Buches kann Leerzeichen enthalten, daher umfasst er alles nach der ID:

Innerhalb von main:

val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")

Ausgabe:

7: The Hobbit
challenge icon

Aufgabe

Einfach

Vervollständige Library.handle(line) für die ersten beiden Befehle:

  • ADD_BOOK <id> <title>: Speichere ein neues verfügbares Buch und antworte mit added book 1: Dune; wenn die ID bereits vergeben ist, antworte mit book 1 exists.
  • JOIN <name>: Füge ein Mitglied hinzu und antworte mit welcome ada; wenn der Name bereits existiert, antworte mit ada is already a member.

Der bereitgestellte Code übergibt jede Eingabezeile an library.handle(line) und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Mitgliedsnamen sind einzelne kleingeschriebene Wörter, Buch-IDs sind ganze Zahlen, und die Eingabe enthält nur die bisher beschriebenen Befehle. Auf jeden anderen Befehl wird mit unknown command geantwortet.

Dein Code gehört in Book.kt, Member.kt und Library.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

fun main() {
    // Bereitgestellter Ein-/Ausgabe-Code: belasse ihn so wie er ist
    val input = generateSequence(::readLine).toList()
    val library = Library()
    for (line in input) {
        for (reply in library.handle(line)) println(reply)
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Kotlin-Playground