Menu
CoddyTech

Privé par convention

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 13 sur 65.

GDScript n'a pas de mot-clé private : chaque propriété et méthode d'un objet peut être accessible depuis d'autres scripts. La convention de Godot consiste à utiliser un trait de soulignement en préfixe. _coins et _is_valid() ci-dessous sont destinés au code de la classe uniquement :

# 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

D’autres scripts utilisent les méthodes publiques, qui vérifient chaque modification : spend() refuse de retirer plus de pièces que le portefeuille n’en contient, ainsi le nombre de pièces ne passe jamais en dessous de zéro.

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

Le trait de soulignement est une promesse, pas un verrou : wallet._coins = -999 s’exécute sans aucune erreur. Il appartient à quiconque écrit les autres scripts de tenir cette promesse ; ne lisez donc pas et ne modifiez pas les membres précédés d’un trait de soulignement depuis l’extérieur de leur classe.

Tu connais déjà deux noms avec un trait de soulignement provenant de Godot lui-même : _ready() et _init() sont appelées par le moteur, pas par ton propre code.

challenge icon

Défi

Facile

Complète la classe User dans user.gd. Elle conserve son mot de passe dans une propriété privée, _password, et seul son propre code y accède.

  • Le constructeur stocke le mot de passe de départ
  • check_password(attempt) indique si attempt correspond au mot de passe
  • _is_strong(candidate), une méthode auxiliaire privée, indique si candidate comporte au moins 6 caractères
  • change_password(old_password, new_password) change le mot de passe et renvoie true uniquement lorsque old_password est correct et que new_password est suffisamment fort. Sinon, elle ne change rien et renvoie false

Le code fourni lit le mot de passe de départ, le nombre de commandes qui suivent et les commandes check PASSWORD et change OLD NEW. Pour le mot de passe godot4 et les commandes change godot4 abc, change wrong longenough et check godot4, il affiche :

Password not changed
Password not changed
Access granted

Ton code va dans user.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d'entrée/sortie fourni : conservez-le tel quel
	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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne