Testen und Integration
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 61 von 65.
Aufgabe
MittelVervollständige das System um Rückgaben und lass dann die Tests alle Teile gemeinsam ausführen. Behalte alles bei, was du in den vorherigen Schritten geschrieben hast; library.gd und user.gd ändern sich.
Schreibe in Library return_book(isbn: String, user_id: String) -> String. Prüfe in dieser Reihenfolge:
- kein Buch mit dieser ISBN: gib
Book not foundzurück - kein Benutzer mit dieser ID: gib
User not foundzurück - das Buch ist verfügbar oder seine
borrower_idgehört zu einem anderen Benutzer: gibThis book was not borrowed by this userzurück - andernfalls mache das Buch wieder verfügbar, setze seine
borrower_idauf"", entferne die ISBN aus denborrowed_isbnsdes Benutzers und gibBook returned successfullyzurück
Schreibe in User return_all_books(library: Library) -> int. Die Methode gibt jedes Buch zurück, das der Benutzer über library.return_book() ausgeliehen hat, und gibt die Anzahl der zurückgegebenen Bücher zurück. Der Benutzer erhält die Bibliothek als Argument und speichert sie nicht, sodass keine zwei Objekte aufeinander verweisen.
Der bereitgestellte Code fügt die Befehle return ISBN|ID und return_all ID hinzu. Für diese Eingabe:
Community
book The Great Gatsby|F. Scott Fitzgerald|123456
book 1984|George Orwell|345678
user U001|Alice
user U002|Bob
borrow 123456|U001
borrow 345678|U001
return 123456|U002
return_all U001
users
statslautet die Ausgabe:
Book borrowed successfully
Book borrowed successfully
This book was not borrowed by this user
Books returned by Alice: 2
User: Alice (ID: U001) - Books borrowed: 0
User: Bob (ID: U002) - Books borrowed: 0
Total Books: 2
Available Books: 2
Borrowed Books: 0
Total Users: 2
Users with Books: 0Dein Code kommt in book.gd, user.gd und library.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Eingabe-/Ausgabecode: unverändert lassen
var library := Library.new(OS.read_string_from_stdin())
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var fields: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"book":
library.add_book(Book.new(fields[0], fields[1], fields[2]))
"user":
library.add_user(User.new(fields[0], fields[1]))
"borrow":
print(library.borrow_book(fields[0], fields[1]))
"return":
print(library.return_book(fields[0], fields[1]))
"return_all":
var reader: User = library.find_user(fields[0])
var count: int = reader.return_all_books(library)
print("Books returned by ", reader.user_name, ": ", count)
"search":
var term: String = parts[1] if parts.size() > 1 else ""
var found: Array = library.search_by_title(term)
print("Results for '%s': %d" % [term, found.size()])
for book in found:
print("- ", book.title, " by ", book.author)
"stats":
var stats: Dictionary = library.get_statistics()
print("Total Books: ", stats["total_books"])
print("Available Books: ", stats["available_books"])
print("Borrowed Books: ", stats["borrowed_books"])
print("Total Users: ", stats["total_users"])
print("Users with Books: ", stats["users_with_books"])
"loans":
var reader: User = library.find_user(fields[0])
print(reader.user_name, " has borrowed:")
for isbn in reader.borrowed_isbns:
print("- ", library.find_book(isbn).title)
"holder":
var book: Book = library.find_book(fields[0])
if book.available:
print(book.title, " is on the shelf")
else:
print(book.title, " is borrowed by ", library.find_user(book.borrower_id).user_name)
"books":
for book in library.books:
print(book)
"users":
for user in library.users:
print(user)
"show":
print(library)
line = OS.read_string_from_stdin()
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler