慣例によるプライベート化
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()は、自分のコードではなくエンジンによって呼び出されます。
チャレンジ
簡単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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ