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
REPORTDas 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 adahandle(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 HobbitAufgabe
EinfachVervollständige Library.handle(line) für die ersten beiden Befehle:
ADD_BOOK <id> <title>: Speichere ein neues verfügbares Buch und gibadded book 1: Dunezurück; wenn die ID bereits vergeben ist, gibbook 1 existszurück.JOIN <name>: Füge ein Mitglied hinzu und gibwelcome adazurück; wenn der Name bereits existiert, gibada is already a memberzurü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)
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground