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 > 0D’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()) # 50Le 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.
Défi
FacileComplè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 siattemptcorrespond au mot de passe_is_strong(candidate), une méthode auxiliaire privée, indique sicandidatecomporte au moins6caractèreschange_password(old_password, new_password)change le mot de passe et renvoietrueuniquement lorsqueold_passwordest correct et quenew_passwordest suffisamment fort. Sinon, elle ne change rien et renvoiefalse
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 grantedTon 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")
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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne