Menu
CoddyTech

Prywatne z konwencji

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 13 z 65.

GDScript nie ma słowa kluczowego private: do każdej właściwości i metody obiektu można uzyskać dostęp z innych skryptów. Konwencja Godot polega na używaniu podkreślenia na początku nazwy. Poniższe _coins i _is_valid() są przeznaczone wyłącznie do użytku w kodzie tej klasy:

# 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

Inne skrypty korzystają z metod publicznych, które sprawdzają każdą zmianę: spend() nie pozwala wydać więcej żetonów, niż znajduje się w portfelu, więc ich liczba nigdy nie spada poniżej zera.

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

Podkreślenie to obietnica, a nie blokada: wallet._coins = -999 wykona się bez żadnego błędu. Dotrzymanie tej obietnicy zależy od osób piszących pozostałe skrypty, więc nie odczytuj ani nie zmieniaj elementów z podkreśleniem poza ich klasą.

Znasz już dwie nazwy z podkreśleniem z samego Godota: _ready() i _init() są wywoływane przez silnik, a nie przez twój własny kod.

challenge icon

Wyzwanie

Łatwy

Uzupełnij klasę User w pliku user.gd. Przechowuje ona hasło we właściwości prywatnej _password i tylko jej własny kod ma do niej dostęp.

  • Konstruktor przechowuje hasło początkowe
  • check_password(attempt) zwraca informację, czy attempt pasuje do hasła
  • _is_strong(candidate), prywatna funkcja pomocnicza, zwraca informację, czy candidate ma co najmniej 6 znaków
  • change_password(old_password, new_password) zmienia hasło i zwraca true tylko wtedy, gdy old_password jest poprawne, a new_password jest silne. W przeciwnym razie niczego nie zmienia i zwraca false

Dostarczony kod odczytuje hasło początkowe, liczbę kolejnych poleceń oraz polecenia check PASSWORD i change OLD NEW. Dla hasła godot4 oraz poleceń change godot4 abc, change wrong longenough i check godot4 wypisuje:

Password not changed
Password not changed
Access granted

Twój kod umieść w pliku user.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online