Menu
CoddyTech

Privato per convenzione

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 13 di 65.

GDScript non ha una parola chiave private: è possibile accedere a ogni proprietà e metodo di un oggetto da altri script. La convenzione di Godot prevede un trattino basso iniziale. _coins e _is_valid() qui sotto sono destinati solo al codice della classe stessa:

# 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

Altri script usano i metodi pubblici, che controllano ogni modifica: spend() rifiuta di sottrarre più monete di quante ne contenga il portafoglio, così il numero di monete non scende mai sotto zero.

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

Il trattino basso è una promessa, non un blocco: wallet._coins = -999 viene eseguito senza errori. Mantenere la promessa spetta a chi scrive gli altri script, quindi non leggere né modificare i membri con il trattino basso dall'esterno della loro classe.

Conosci già due nomi con il trattino basso di Godot: _ready() e _init() vengono chiamati dal motore, non dal tuo codice.

challenge icon

Sfida

Facile

Completa la classe User in user.gd. Conserva la password in una proprietà privata, _password, a cui accede solo il suo codice.

  • Il costruttore memorizza la password iniziale
  • check_password(attempt) restituisce se attempt corrisponde alla password
  • _is_strong(candidate), un helper privato, restituisce se candidate ha almeno 6 caratteri
  • change_password(old_password, new_password) cambia la password e restituisce true solo quando old_password è corretta e new_password è robusta. Altrimenti non cambia nulla e restituisce false

Il codice fornito legge la password iniziale, il numero di comandi successivi e i comandi check PASSWORD e change OLD NEW. Per la password godot4 e i comandi change godot4 abc, change wrong longenough e check godot4 stampa:

Password not changed
Password not changed
Access granted

Il tuo codice va in user.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Supplied input/output code: keep it as it is
	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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online