Plateforme d'E-Learning
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 84 sur 87.
Bienvenue dans le chapitre des défis finaux ! Ces défis sont conçus pour tester votre maîtrise de tous les concepts de POO que vous avez appris tout au long de ce cours.
Dans ce défi, vous allez créer un système de plateforme d’apprentissage en ligne qui combine l’héritage, les interfaces, le polymorphisme, l’encapsulation et les patrons de conception au sein d’une application cohérente.
Votre plateforme doit modéliser les relations entre les cours, les étudiants et les formateurs. Réfléchissez à la manière dont une classe de base User peut être étendue par les classes Student et Instructor, dont les cours contiennent des leçons et dont le suivi des inscriptions fonctionne entre les étudiants et les cours.
Considérez quels principes de la POO s’appliquent : utilisez l’encapsulation pour protéger les données des utilisateurs, l’héritage pour partager un comportement commun, les interfaces pour définir des contrats comme Enrollable ou Completable, et le polymorphisme pour gérer uniformément différents types d’utilisateurs.
Bonne chance pour mettre en pratique tout ce que tu as appris !
Défi
FacileConstruisons une plateforme d’apprentissage en ligne qui rassemble tous les concepts de la POO que tu as maîtrisés tout au long de ce cours ! Tu vas créer un système qui modélise les relations entre les cours, les étudiants et les formateurs à l’aide de l’héritage, des interfaces, du polymorphisme et de l’encapsulation.
Tu organiseras ton code sur six fichiers :
Enrollable.java: crée une interface qui définit le contrat pour les opérations d’inscription. Elle doit déclarer les méthodesenroll(Student student)qui renvoie un booléen, etgetEnrolledCount()qui renvoie un entier.User.java: crée une classe de base abstraite représentant tout utilisateur de la plateforme. Inclus des champs privés pourid(String) etname(String), un constructeur qui initialise les deux, les accesseurs appropriés, ainsi qu’une méthode abstraitegetRole()qui renvoie une String décrivant le rôle de l’utilisateur.Student.java: crée une classe qui étendUser. Ajoute une ArrayList privée pour suivre les identifiants des cours auxquels l’étudiant est inscrit. Inclus un constructeur qui appelle le constructeur parent, implémentegetRole()pour renvoyer"Student", et ajoute les méthodesaddCourse(String courseId)etgetEnrolledCourseCount(). RedéfinistoString()pour renvoyer"Student: [name] ([enrolledCount] courses)".Instructor.java: crée une classe qui étendUser. Ajoute un champ privé pourspecialty(String). Inclus un constructeur qui prend id, name et specialty, implémentegetRole()pour renvoyer"Instructor", ajoute un accesseur pour specialty, et redéfinistoString()pour renvoyer"Instructor: [name] - [specialty]".Course.java: crée une classe qui implémenteEnrollable. Inclus des champs privés pourcourseId(String),title(String),instructor(Instructor), ainsi qu’une ArrayList des étudiants inscrits. Le constructeur prend courseId, title et instructor. Implémenteenroll(Student student)pour ajouter l’étudiant à la liste, appeler la méthodeaddCourse()de l’étudiant avec l’identifiant de ce cours, puis renvoyer true. ImplémentegetEnrolledCount(). Ajoute une méthodegetDetails()qui renvoie l’identifiant du cours entre crochets littéraux, suivi du titre et du nom du formateur, construite comme"[" + courseId + "] " + title + " by " + instructorName.Main.java: construis ta plateforme ! Tu recevras une chaîne de commandes séparées par des virgules :ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
Gère des collections de formateurs, d’étudiants et de cours. Traite chaque commande et affiche :
- ADD_INSTRUCTOR :
Instructor added: [name] - ADD_STUDENT :
Student added: [name] - ADD_COURSE :
Course added: [title] - ENROLL :
[studentName] enrolled in [courseTitle] - INFO : affiche le résultat de
toString()de l’utilisateur
Après toutes les commandes, affiche
--- Platform Summary ---, suivi des détails de chaque cours et du nombre d’inscriptions au format[courseDetails] - [count] student(s).
Tu recevras une entrée : la chaîne de commandes séparées par des virgules.
Par exemple, avec l’entrée ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001, ta sortie serait :
Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)Ce défi combine l’héritage (hiérarchie User), les interfaces (Enrollable), le polymorphisme (différents types d’utilisateurs avec leurs propres implémentations de toString) et l’encapsulation (champs privés avec un accès contrôlé) au sein d’un système cohérent !
Essayez vous-même
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Créer des collections pour stocker les instructeurs, les étudiants et les cours
// Indice : Utilisez HashMap avec id comme clé pour une recherche facile
// TODO: Diviser l'entrée par des virgules pour obtenir les commandes individuelles
// TODO: Traiter chaque commande :
// - ADD_INSTRUCTOR:id:name:specialty -> Create instructor, add to collection, print "Instructor added: [name]"
// - ADD_STUDENT:id:name -> Create student, add to collection, print "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> Create course with instructor, add to collection, print "Course added: [title]"
// - ENROLL:studentId:courseId -> Inscrire l'étudiant au cours, afficher "[studentName] enrolled in [courseTitle]"
// - INFO:userId -> Trouver l'utilisateur (étudiant ou instructeur) et afficher leur toString()
// TODO: After processing all commands, print "--- Platform Summary ---"
// TODO: Pour chaque cours, afficher "[courseDetails] - [count] student(s)"
}
}
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 vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie14Défis finaux
Plateforme d'E-LearningSystème bancaireDéveloppement de personnages de jeuService de location de véhicules3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne