Menu
CoddyTech

Privado por Convenção

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 13 de 65.

GDScript não tem a palavra-chave private: todas as propriedades e métodos de um objeto podem ser acessados por outros scripts. A convenção do Godot é usar um sublinhado inicial. _coins e _is_valid() abaixo são destinados apenas ao código da própria classe:

# 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

Outros scripts usam os métodos públicos, e eles verificam cada alteração: spend() se recusa a retirar mais moedas do que a carteira contém, então o número de moedas nunca fica abaixo de zero.

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

O sublinhado é uma promessa, não uma trava: wallet._coins = -999 é executado sem nenhum erro. Cumprir essa promessa cabe a quem escreve os outros scripts, então não leia nem altere membros com sublinhado de fora da classe deles.

Você já conhece dois nomes com sublinhado do próprio Godot: _ready() e _init() são chamados pelo mecanismo, não pelo seu próprio código.

challenge icon

Desafio

Fácil

Complete a classe User em user.gd. Ela mantém sua senha em uma propriedade privada, _password, e somente o próprio código dela a acessa.

  • O construtor armazena a senha inicial
  • check_password(attempt) retorna se attempt corresponde à senha
  • _is_strong(candidate), um método auxiliar privado, retorna se candidate tem pelo menos 6 caracteres
  • change_password(old_password, new_password) altera a senha e retorna true somente quando old_password está correta e new_password é forte. Caso contrário, não altera nada e retorna false

O código fornecido lê a senha inicial, quantos comandos vêm em seguida e os comandos check PASSWORD e change OLD NEW. Para a senha godot4 e os comandos change godot4 abc, change wrong longenough e check godot4, ele imprime:

Password not changed
Password not changed
Access granted

Seu código deve ficar em user.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online