Menu
CoddyTech

Privado por convención

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 13 de 65.

GDScript no tiene la palabra clave private: se puede acceder a todas las propiedades y métodos de un objeto desde otros scripts. La convención de Godot es usar un guion bajo al inicio. Se pretende que _coins y _is_valid(), a continuación, se usen únicamente en el código de la propia clase:

# 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

Otros scripts usan los métodos públicos, y estos comprueban cada cambio: spend() se niega a quitar más monedas de las que contiene la cartera, así que el número de monedas nunca baja de cero.

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

El guion bajo es una promesa, no un bloqueo: wallet._coins = -999 se ejecuta sin ningún error. Cumplir la promesa depende de quien escriba los otros scripts, así que no leas ni cambies miembros con guion bajo desde fuera de su clase.

Ya conoces dos nombres con guion bajo del propio Godot: el motor llama a _ready() y _init(), no tu propio código.

challenge icon

Desafío

Fácil

Completa la clase User en user.gd. Guarda su contraseña en una propiedad privada, _password, y solo su propio código accede a ella.

  • El constructor almacena la contraseña inicial
  • check_password(attempt) devuelve si attempt coincide con la contraseña
  • _is_strong(candidate), un método auxiliar privado, devuelve si candidate tiene al menos 6 caracteres
  • change_password(old_password, new_password) cambia la contraseña y devuelve true solo cuando old_password es correcta y new_password es segura. De lo contrario, no cambia nada y devuelve false

El código proporcionado lee la contraseña inicial, cuántos comandos siguen y los comandos check PASSWORD y change OLD NEW. Para la contraseña godot4 y los comandos change godot4 abc, change wrong longenough y check godot4, imprime:

Password not changed
Password not changed
Access granted

Tu código va en user.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online