Menu
CoddyTech

Privat nach Konvention

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 13 von 65.

GDScript hat kein Schlüsselwort private: Auf jede Eigenschaft und Methode eines Objekts kann von anderen Skripten aus zugegriffen werden. Godots Konvention ist ein vorangestellter Unterstrich. _coins und _is_valid() unten sind ausschließlich für den eigenen Code der Klasse gedacht:

# 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

Andere Skripte verwenden die öffentlichen Methoden, und diese überprüfen jede Änderung: spend() weigert sich, mehr Münzen abzuziehen, als die Geldbörse enthält, sodass die Anzahl der Münzen niemals unter null fällt.

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

Der Unterstrich ist ein Versprechen, keine Sperre: wallet._coins = -999 wird ohne Fehler ausgeführt. Das Versprechen einzuhalten, liegt bei denjenigen, die die anderen Skripte schreiben. Lies oder ändere daher keine mit Unterstrich versehenen Member außerhalb ihrer Klasse.

Du kennst bereits zwei Namen mit Unterstrich von Godot selbst: _ready() und _init() werden von der Engine aufgerufen, nicht von deinem eigenen Code.

challenge icon

Aufgabe

Einfach

Vervollständige die Klasse User in user.gd. Sie speichert ihr Passwort in einer privaten Eigenschaft, _password, auf die nur ihr eigener Code zugreift.

  • Der Konstruktor speichert das Startpasswort
  • check_password(attempt) gibt zurück, ob attempt mit dem Passwort übereinstimmt
  • _is_strong(candidate), eine private Hilfsfunktion, gibt zurück, ob candidate mindestens 6 Zeichen hat
  • change_password(old_password, new_password) ändert das Passwort und gibt nur dann true zurück, wenn old_password korrekt und new_password sicher ist. Andernfalls ändert sie nichts und gibt false zurück

Der vorgegebene Code liest das Startpasswort, die Anzahl der folgenden Befehle und die Befehle check PASSWORD und change OLD NEW ein. Für das Passwort godot4 und die Befehle change godot4 abc, change wrong longenough und check godot4 gibt er Folgendes aus:

Password not changed
Password not changed
Access granted

Dein Code gehört in user.gd. main.gd enthält den vorgegebenen Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler