Menu
CoddyTech

Clases de libros y usuarios

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 57 de 65.

challenge icon

Desafío

Fácil

Añade las clases Book y User, cada una en su propio archivo, y haz que la biblioteca las almacene. Conserva todo lo que escribiste en el paso anterior.

Book en book.gd:

  • El constructor recibe title, author e isbn (todos String) y los almacena en propiedades con los mismos nombres.
  • available empieza como true y borrower_id empieza como "".
  • _to_string() devuelve TITLE by AUTHOR (ISBN: ISBN) - Available, con Not Available al final cuando available es false.

User en user.gd:

  • El constructor recibe user_id y user_name y los almacena.
  • borrowed_isbns es un Array[String] que empieza vacío.
  • _to_string() devuelve User: NAME (ID: ID) - Books borrowed: N, donde N es el tamaño de borrowed_isbns.

En library.gd, cambia books por un Array[Book] y users por un Array[User], y añade los métodos add_book(book: Book) y add_user(user: User), que los agregan.

Un libro recuerda a su prestatario mediante el id del usuario, y un usuario recuerda los libros mediante su ISBN. Si el libro almacenara el objeto User y el usuario almacenara el objeto Book, ambos se mantendrían vivos mutuamente y Godot los reportaría como fugas al terminar el programa.

El código proporcionado en main.gd cambió: ahora los campos están separados por |. Los comandos son book TITLE|AUTHOR|ISBN, user ID|NAME, lend ISBN|ID (establece directamente las propiedades del libro y del usuario), books y users (imprimen cada libro o usuario), y show. Para esta entrada:

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

la salida es:

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)

Tu código va en book.gd, user.gd y library.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: déjalo tal como está
	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()

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online