Plateforme d’apprentissage en ligne
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 62 sur 65.
Défi
DifficileConstruisez les classes d’une plateforme d’apprentissage en ligne : cours, étudiants et enseignants. Les étudiants et les enseignants sont tous des personnes ; ils partagent donc une classe parent.
Les objets ne doivent pas se référencer les uns les autres : un cours stocke les adresses e-mail de ses étudiants et le nom de son enseignant, tandis que les étudiants et les enseignants stockent les titres des cours. Une méthode qui a besoin d’un cours le reçoit en argument.
Person dans person.gd : le constructeur prend person_name et email et les stocke. _to_string() renvoie NAME (EMAIL).
Course dans course.gd :
- Propriétés :
title,max_capacity,instructor_name(initialisé à""), ainsi que lesArray[String]student_emailsetcompleted_emails. - Le constructeur prend le titre et la capacité, qui vaut par défaut
30. - Un signal
course_full(title: String), émis paradd_student()lorsqu’il prend la dernière place disponible. add_student(email) -> bool: renvoiefalselorsque le cours est complet ou que l’adresse e-mail correspond déjà à un étudiant ; sinon, ajoute l’adresse e-mail et renvoietrue.remove_student(email) -> bool: supprime un étudiant actuellement inscrit ; renvoiefalsesi l’adresse e-mail ne correspond pas à l’un d’eux.mark_completed(email) -> bool: déplace un étudiant actuellement inscrit verscompleted_emails; renvoiefalsesi l’adresse e-mail ne correspond pas à un étudiant actuellement inscrit.assign_instructor(instructor) -> bool: stocke le nom de l’enseignant ou renvoiefalsesi le cours en a déjà un._to_string()renvoieTITLE: N/CAPACITY students, M completed, instructor: NAME, avecnonelorsqu’il n’y a pas d’enseignant.
Student dans student.gd étend Person et conserve son constructeur. Il possède deux Array[String] de titres, enrolled et completed :
enroll(course: Course) -> bool: renvoiefalselorsque le cours figure déjà dansenrolledoucompleted, ou lorsquecourse.add_student()refuse ; sinon, ajoute le titre et renvoietrue.unenroll(course: Course) -> bool: uniquement pour un cours auquel l’étudiant est inscrit ; supprime l’étudiant du cours et le titre deenrolled.complete_course(course: Course) -> bool: uniquement pour un cours auquel l’étudiant est inscrit ; appellecourse.mark_completed()et déplace le titre deenrolledverscompleted._to_string()renvoieStudent, le texte dePerson, puis: N enrolled, M completed.
Instructor dans instructor.gd étend Person. Son constructeur prend person_name, email et expertise, et il conserve un Array[String] course_titles :
assign_to_course(course: Course) -> bool: appellecourse.assign_instructor()avec son nom ; en cas de réussite, ajoute le titre et renvoietrue._to_string()renvoieInstructor, le texte dePerson,, EXPERTISE:et les titres joints avec,, ouno courses.
Le code fourni lit des commandes dont les champs sont séparés par | et se connecte à course_full pour afficher Course full: TITLE. Pour cette entrée :
course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
reportla sortie est :
Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101Votre code va dans person.gd, course.gd, student.gd et instructor.gd. main.gd contient le code fourni pour les entrées/sorties 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 courses := {}
var people := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"course":
var course: Course
if f.size() > 1:
course = Course.new(f[0], int(f[1]))
else:
course = Course.new(f[0])
course.course_full.connect(func(title): print("Course full: ", title))
courses[f[0]] = course
"student":
people[f[1]] = Student.new(f[0], f[1])
"instructor":
people[f[1]] = Instructor.new(f[0], f[1], f[2])
"enroll":
var ok: bool = people[f[0]].enroll(courses[f[1]])
print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
"unenroll":
var ok: bool = people[f[0]].unenroll(courses[f[1]])
print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
"complete":
var ok: bool = people[f[0]].complete_course(courses[f[1]])
print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
"assign":
var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
"report":
for title in courses:
print(courses[title])
for email in people:
print(people[email])
line = OS.read_string_from_stdin()
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 Strategy12Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireDéveloppement d’un personnage de jeuService de location de véhiculesEntraînez-vous par vous-même : Compilateur GDScript en ligne