Menu
CoddyTech

書籍クラスとユーザークラス

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 57/65。

challenge icon

チャレンジ

簡単

クラス Book と User をそれぞれ別のファイルに追加し、ライブラリにそれらを保存させましょう。前のステップで書いたものはすべて残してください。

book.gd の Book:

  • コンストラクターは title、author、isbn(すべて String)を受け取り、同じ名前のプロパティに保存します。
  • available は true で始まり、borrower_id は "" で始まります。
  • _to_string() は TITLE by AUTHOR (ISBN: ISBN) - Available を返します。available が false の場合は、末尾が Not Available になります。

user.gd の User:

  • コンストラクターは 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) を追加します。

本は借り手をユーザーの id で記憶し、ユーザーは本を 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オンラインコンパイラ