Menu
CoddyTech

Classi Libro e Utente

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 57 di 65.

challenge icon

Sfida

Facile

Aggiungi le classi Book e User, ciascuna nel proprio file, e fai in modo che la biblioteca le memorizzi. Mantieni tutto ciò che hai scritto nel passaggio precedente.

Book in book.gd:

  • Il costruttore accetta title, author e isbn (tutti String) e li memorizza in proprietà con gli stessi nomi.
  • available inizia come true e borrower_id inizia come "".
  • _to_string() restituisce TITLE by AUTHOR (ISBN: ISBN) - Available, con Not Available alla fine quando available è false.

User in user.gd:

  • Il costruttore accetta user_id e user_name e li memorizza.
  • borrowed_isbns è un Array[String] che inizia vuoto.
  • _to_string() restituisce User: NAME (ID: ID) - Books borrowed: N, dove N è la dimensione di borrowed_isbns.

In library.gd, modifica books in un Array[Book] e users in un Array[User], e aggiungi i metodi add_book(book: Book) e add_user(user: User), che vi aggiungono gli elementi.

Un libro memorizza l'identificativo dell'utente che lo ha preso in prestito, mentre un utente memorizza i libri tramite il loro ISBN. Se il libro memorizzasse l'oggetto User e l'utente memorizzasse l'oggetto Book, i due si manterrebbero reciprocamente in vita e Godot li segnalerebbe come perdite di memoria alla fine del programma.

Il codice fornito in main.gd è cambiato: i campi sono ora separati da |. I comandi sono book TITLE|AUTHOR|ISBN, user ID|NAME, lend ISBN|ID (imposta direttamente le proprietà del libro e dell'utente), books e users (stampa ogni libro o utente) e show. Per questo input:

Riverside
book Dune|Frank Herbert|111
user U001|Alice
user U002|Bob
lend 111|U002
books
users
show

l'output è:

Dune by Frank Herbert (ISBN: 111) - Not Available
User: Alice (ID: U001) - Books borrowed: 0
User: Bob (ID: U002) - Books borrowed: 1
Riverside Library (books: 1, users: 2)

Il 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]))
			"lend":
				for book in library.books:
					if book.isbn == fields[0]:
						book.available = false
						book.borrower_id = fields[1]
				for user in library.users:
					if user.user_id == fields[1]:
						user.borrowed_isbns.append(fields[0])
			"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

Esercitati da solo: Compilatore GDScript online