Menu
CoddyTech

慣例によるプライベート化

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

GDScript には private キーワードがありません。オブジェクトのすべてのプロパティとメソッドに、ほかのスクリプトからアクセスできます。Godot では、先頭にアンダースコアを付けるのが慣例です。以下の _coins と _is_valid() は、クラス自身のコードからのみ使うことを想定しています。

# wallet.gd
class_name Wallet
extends RefCounted

var _coins: int = 0

func add(amount: int) -> void:
	if _is_valid(amount):
		_coins += amount

func spend(amount: int) -> bool:
	if not _is_valid(amount) or amount > _coins:
		return false
	_coins -= amount
	return true

func get_coins() -> int:
	return _coins

func _is_valid(amount: int) -> bool:
	return amount > 0

ほかのスクリプトはパブリックメソッドを使用し、それらのメソッドは変更のたびにチェックを行います。spend()はウォレットに入っているコインより多くのコインを使おうとすると拒否するため、コインの数がゼロを下回ることはありません。

var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50

アンダースコアは約束であって、ロックではありません。wallet._coins = -999 はエラーなしで実行されます。約束を守るかどうかは他のスクリプトを書く人次第なので、自分のクラスの外からアンダースコア付きのメンバーを読み取ったり変更したりしないでください。

Godot自体にあるアンダースコア付きの名前をすでに2つ知っています。_ready()と_init()は、自分のコードではなくエンジンによって呼び出されます。

challenge icon

チャレンジ

簡単

User クラスを user.gd で完成させてください。パスワードはプライベートプロパティ _password に保持され、このプロパティに触れるのはクラス自身のコードだけです。

  • コンストラクターは最初のパスワードを保存します
  • check_password(attempt) は、attempt がパスワードと一致するかどうかを返します
  • プライベートヘルパーの _is_strong(candidate) は、candidate が少なくとも 6 文字あるかどうかを返します
  • change_password(old_password, new_password) はパスワードを変更し、old_password が正しく、new_password が強力な場合にのみ true を返します。それ以外の場合は何も変更せず、false を返します

提供されたコードは、最初のパスワード、後に続くコマンドの数、およびコマンド check PASSWORD と change OLD NEW を読み込みます。パスワードが godot4 で、コマンドが change godot4 abc、change wrong longenough、check godot4 の場合、次のように出力します。

Password not changed
Password not changed
Access granted

コードは user.gd に記述してください。main.gd には提供された入出力コードがあり、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード: そのままにしてください
	var user := User.new(OS.read_string_from_stdin())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "check":
			print("Access granted" if user.check_password(parts[1]) else "Access denied")
		elif user.change_password(parts[1], parts[2]):
			print("Password changed")
		else:
			print("Password not changed")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ