Plateforme d'e-learning
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 68 sur 70.
Défi
FacileConstruisons une plateforme d’apprentissage en ligne qui gère les cours, les étudiants et les inscriptions ! Ce défi rassemble tout ce que vous avez appris sur la POO : classes, héritage, interfaces, encapsulation et services fonctionnant ensemble dans une architecture claire.
Vous organiserez votre code sur cinq fichiers :
Lesson.cs: créez une classeLessondans l’espace de nomsELearning.Models. Chaque leçon possède des propriétés en lecture seuleTitle(string) etDurationMinutes(int), définies par l’intermédiaire du constructeur.Course.cs: créez une classeCoursedans l’espace de nomsELearning.Models. Un cours possède les propriétés en lecture seuleId(string),Title(string) etInstructor(string), ainsi qu’une listeLessons. Ajoutez une méthodeAddLesson(Lesson lesson)et une propriété en lecture seuleTotalDurationqui calcule la somme des durées de toutes les leçons.Student.cs: créez une classeStudentdans l’espace de nomsELearning.Models, avec les propriétés en lecture seuleId(int) etName(string). Les étudiants suivent leur progression au moyen d’un dictionnaire privé qui associe les identifiants des cours au nombre de leçons terminées. Ajoutez les méthodesCompleteLesson(string courseId)pour augmenter la progression etGetProgress(string courseId)pour renvoyer le nombre de leçons terminées (ou 0 si l’étudiant n’est pas inscrit).EnrollmentService.cs: créez une classeEnrollmentServicedans l’espace de nomsELearning.Services. Ce service gère les cours et les inscriptions à l’aide de collections privées. Implémentez :AddCourse(Course course)- ajoute un cours à la plateformeEnroll(Student student, string courseId)- renvoietruesi l’inscription réussit, etfalsesi le cours n’existe pas ou si l’étudiant est déjà inscritGetEnrolledCourses(Student student)- renvoie une liste des identifiants des cours auxquels l’étudiant est inscritGetCourse(string courseId)- renvoie le cours ounulls’il est introuvable
Program.cs: assemblez tous les éléments en créant des cours avec des leçons, en inscrivant des étudiants, en suivant la progression et en affichant les résultats en fonction de l’entrée.
Vous recevrez les entrées suivantes :
- Nombre de cours à créer
- Pour chaque cours : identifiant, titre, formateur, nombre de leçons, puis, pour chaque leçon : titre et durée (en minutes)
- Identifiant et nom de l’étudiant
- Nombre d’opérations à effectuer
- Pour chaque opération : l’action (
enroll,complete,progressouinfo) suivie de l’identifiant du cours
Formats de sortie :
enroll: affichezEnrolled in: {CourseTitle}ouEnrollment failed: {courseId}complete: affichezCompleted lesson in {CourseTitle}(augmentez la progression de 1)progress: affichez{CourseTitle}: {completed}/{total} lessonsinfo: affichez{CourseTitle} by {Instructor} - {TotalDuration} minutes
Par exemple, si les entrées sont les suivantes :
2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999La sortie devrait être :
Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999Remarquez comment le service gère la relation entre les étudiants et les cours, tandis que chaque classe assume ses propres responsabilités. L’étudiant suit sa propre progression, les cours calculent leur durée totale et le service d’inscription coordonne le tout : une séparation claire des responsabilités !
Essayez vous-même
using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;
class Program
{
public static void Main(string[] args)
{
// Lire le nombre de cours
int numCourses = Convert.ToInt32(Console.ReadLine());
// TODO: Créer une instance de EnrollmentService
// TODO: Lire et créer chaque cours avec ses leçons
// Pour chaque cours : lire l'ID, le titre, l'instructeur et le nombre de leçons
// Pour chaque leçon : lire le titre et la durée
// Ajouter les leçons au cours, puis ajouter le cours au service
// Lire les informations de l'étudiant
int studentId = Convert.ToInt32(Console.ReadLine());
string studentName = Console.ReadLine();
// TODO: Créer une instance de Student
// Lire le nombre d'opérations
int numOperations = Convert.ToInt32(Console.ReadLine());
// TODO: Traiter chaque opération
// Pour chaque opération : lire l'action et le courseId
// Gérer : enroll, complete, progress, info
// Afficher le message approprié en fonction de l'action
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne