Menu
CoddyTech

Bücher und Mitglieder

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

In diesem Projekt entwickelst du den Kern eines Bibliothekssystems. Eine Library-Klasse erhält Befehle, einen pro Zeile, und antwortet auf jeden davon. In fünf Schritten lernst du, Bücher und Mitglieder hinzuzufügen, Bücher auszuleihen und zurückzugeben, im Katalog zu suchen 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 einer eigenen Datei. Der borrower eines Buches kann überall gelesen werden, aber nur über lendTo und giveBack geändert werden, und ein Mitglied stellt die IDs seiner Ausleihen als schreibgeschützte List bereit. Die Bibliothek speichert 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) zerlegt den Befehl und verwendet für sein erstes Wort ein when. Jeder Zweig gibt seine Antworten als 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 ist es alles nach der ID:

In 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 gib added book 1: Dune zurück; wenn die ID bereits vergeben ist, gib book 1 exists zurück.
  • JOIN <name>: Füge ein Mitglied hinzu und gib welcome ada zurück; wenn der Name bereits existiert, gib ada is already a member zurück.

Der bereitgestellte Code übergibt jede Eingabezeile an library.handle(line) und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Mitgliedsnamen bestehen aus einzelnen kleingeschriebenen Wörtern, Buch-IDs sind ganze Zahlen, und die Eingabe enthält nur die bisher beschriebenen Befehle. Bei jedem anderen Befehl wird unknown command zurückgegeben.

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

Probier es selbst

fun main() {
    // Vorgegebener Ein-/Ausgabecode: unverändert lassen
    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