Récapitulatif - Système de dossiers étudiants
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 30 sur 65.
Défi
MoyenCréez un petit système de dossiers étudiants à partir de deux classes.
Student dans student.gd garde ses données privées :
_init(id, new_name)stocke l’ID dans une variable privée et définit le nom à l’aide du setter destudent_name.student_idest en lecture seule et renvoie l’ID.student_namepossède un setter : un nom de moins de2caractères est rejeté (l’ancien nom est conservé) etlast_errorprend la valeurName must be at least 2 characters. Un nom valide effacelast_error.add_grade(course, grade)stocke la note du cours dans un dictionnaire privé (une nouvelle note pour le même cours remplace l’ancienne) et renvoietrue. Une note inférieure à0ou supérieure à100n’est pas stockée et la méthode renvoiefalse.averageest une propriété calculée en lecture seule : la moyenne des notes sous forme defloat, ou0.0en l’absence de notes.course_count()renvoie le nombre de cours ayant une note.
StudentRegistry dans student_registry.gd conserve les étudiants dans un dictionnaire privé, avec l’ID comme clé :
add_student(student)renvoiefalseet ne change rien lorsque l’ID est déjà pris ; sinon, la méthode stocke l’étudiant et renvoietrue.remove_student(id)indique si un étudiant a été supprimé.get_student(id)renvoie l’étudiant, ounull.top_student()renvoie l’étudiant ayant la moyenne la plus élevée (celui qui a été ajouté en premier en cas d’égalité), ounulllorsque le registre est vide.get_ids()renvoie les ID dans l’ordre d’ajout des étudiants.
Le code fourni lit le nombre de commandes, puis exécute une commande par ligne : add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (essaie de modifier student_id et average, qui ne doivent pas changer), top et list. Pour cette entrée :
10
add 1001 Alice Smith
add 1002 Bob
grade 1001 Math 90
grade 1001 Art 85
grade 1002 Math 95
grade 1002 Art 120
rename 1002 B
show 1002
top
listil affiche :
Added Alice Smith (1001)
Added Bob (1002)
Alice Smith: Math = 90
Alice Smith: Art = 85
Bob: Math = 95
Invalid grade: 120
Rejected: Name must be at least 2 characters
ID: 1002, Name: Bob, Courses: 1, Average: 95.00
Top: Bob (95.00)
ID: 1001, Name: Alice Smith, Courses: 2, Average: 87.50
ID: 1002, Name: Bob, Courses: 1, Average: 95.00Votre code doit se trouver dans student.gd et student_registry.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 registry := StudentRegistry.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", true, 2)
var command := parts[0]
if command == "top":
var best := registry.top_student()
if best == null:
print("Top: none")
else:
print("Top: %s (%.2f)" % [best.student_name, best.average])
continue
if command == "list":
for listed_id in registry.get_ids():
print_student(registry.get_student(listed_id))
continue
var id := int(parts[1])
if command == "add":
var student := Student.new(id, parts[2])
if student.last_error != "":
print("Rejected: " + student.last_error)
elif registry.add_student(student):
print("Added %s (%d)" % [student.student_name, id])
else:
print("Duplicate ID: %d" % id)
continue
if command == "remove":
print(("Removed %d" if registry.remove_student(id) else "No student %d") % id)
continue
var student := registry.get_student(id)
if student == null:
print("No student %d" % id)
elif command == "grade":
var grade_parts := parts[2].split(" ")
if student.add_grade(grade_parts[0], int(grade_parts[1])):
print("%s: %s = %s" % [student.student_name, grade_parts[0], grade_parts[1]])
else:
print("Invalid grade: " + grade_parts[1])
elif command == "rename":
student.student_name = parts[2]
if student.last_error != "":
print("Rejected: " + student.last_error)
else:
print("Renamed to " + student.student_name)
elif command == "tamper":
# Tente d'écraser les propriétés en lecture seule
student.student_id = 0
student.average = 100.0
print_student(student)
else:
print_student(student)
func print_student(student: Student) -> void:
print("ID: %d, Name: %s, Courses: %d, Average: %.2f" % [student.student_id, student.student_name, student.course_count(), student.average])
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