Menu
CoddyTech

Классы книг и пользователей

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 57 из 65.

challenge icon

Задание

Легко

Добавь классы Book и User, каждый в отдельном файле, и сделай так, чтобы библиотека хранила их. Сохрани всё, что ты написал на предыдущем шаге.

Book в book.gd:

  • Конструктор принимает title, author и isbn (все типа String) и сохраняет их в свойствах с такими же именами.
  • available изначально имеет значение true, а borrower_id — "".
  • _to_string() возвращает TITLE by AUTHOR (ISBN: ISBN) - Available, а если available имеет значение false, в конце выводится Not Available.

User в user.gd:

  • Конструктор принимает user_id и user_name и сохраняет их.
  • borrowed_isbns — это Array[String], изначально пустой.
  • _to_string() возвращает User: NAME (ID: ID) - Books borrowed: N, где N — размер borrowed_isbns.

В library.gd измени тип books на Array[Book], а users — на Array[User], и добавь методы add_book(book: Book) и add_user(user: User), которые добавляют элементы в соответствующие массивы.

Книга запоминает своего читателя по идентификатору пользователя, а пользователь запоминает книги по их ISBN. Если бы книга хранила объект User, а пользователь — объект Book, они поддерживали бы жизнь друг друга, и Godot сообщал бы об утечке памяти при завершении программы.

Предоставленный код в main.gd изменился: теперь поля разделяются символом |. Команды: book TITLE|AUTHOR|ISBN, user ID|NAME, lend ISBN|ID (команда напрямую задаёт свойства книги и пользователя), books и users (выводят все книги или пользователей), а также show. Для такого ввода:

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

вывод будет таким:

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)

Твой код нужно разместить в book.gd, user.gd и library.gd. В main.gd находится предоставленный код ввода и вывода, его нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений
	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()

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript