Test e integrazione
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 61 di 65.
Sfida
MedioCompleta il sistema con le restituzioni, poi lascia che i test eseguano tutte le sue parti insieme. Mantieni tutto ciò che hai scritto nei passaggi precedenti; library.gd e user.gd cambiano.
In Library, scrivi return_book(isbn: String, user_id: String) -> String. Controlla in questo ordine:
- nessun libro con quell'ISBN: restituisci
Book not found - nessun utente con quell'id: restituisci
User not found - il libro è disponibile, oppure il suo
borrower_idè un altro utente: restituisciThis book was not borrowed by this user - altrimenti rendi di nuovo disponibile il libro, imposta il suo
borrower_idsu"", rimuovi l'ISBN daborrowed_isbnsdell'utente e restituisciBook returned successfully
In User, scrivi return_all_books(library: Library) -> int. Restituisce ogni libro preso in prestito dall'utente tramite library.return_book() e restituisce quanti ne sono stati restituiti. L'utente riceve la biblioteca come argomento e non la memorizza, quindi nessun oggetto punta all'altro.
Il codice fornito aggiunge i comandi return ISBN|ID e return_all ID. Per questo input:
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
statsl'output è:
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: 0Il tuo codice va in book.gd, user.gd e library.gd. main.gd contiene il codice fornito per input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
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()
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online