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 la POO que vous avez appris tout au long de ce cours.
Dans ce défi, vous allez construire un système de Plateforme d'E-Learning qui combine l'héritage, les interfaces, le polymorphisme, l'encapsulation et les patrons de conception dans une application cohérente.
Votre plateforme doit modéliser les relations entre les cours, les étudiants et les instructeurs. Réfléchissez à la manière dont une classe de base User peut être étendue par les classes Student et Instructor, comment les cours contiennent des leçons, et comment le suivi des inscriptions fonctionne entre les étudiants et les cours.
Réfléchissez aux principes de la POO qui s'appliquent : utilisez l'encapsulation pour protéger les données utilisateur, l'héritage pour partager des comportements communs, des 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 vous avez appris !
Défi
FacileConstruisons une plateforme d'apprentissage en ligne (E-Learning) qui regroupe tous les concepts de la POO que vous avez maîtrisés tout au long de ce cours ! Vous allez créer un système qui modélise les relations entre les cours, les étudiants et les instructeurs en utilisant l'héritage, les interfaces, le polymorphisme et l'encapsulation.
Vous organiserez votre code sur six fichiers :
Enrollable.java: Créez une interface qui définit le contrat pour les opérations d'inscription. Elle doit déclarer les méthodesenroll(Student student)qui retourne un boolean, etgetEnrolledCount()qui retourne un int.User.java: Créez une classe de base abstraite représentant n'importe quel utilisateur sur la plateforme. Incluez des champs privés pourid(String) etname(String), un constructeur qui initialise les deux, des getters appropriés, et une méthode abstraitegetRole()qui retourne une String décrivant le rôle de l'utilisateur.Student.java: Créez une classe qui étendUser. Ajoutez une ArrayList privée pour suivre les identifiants des cours inscrits. Incluez un constructeur qui appelle le constructeur parent, implémentezgetRole()pour retourner"Student", et ajoutez les méthodesaddCourse(String courseId)etgetEnrolledCourseCount(). SurchargeztoString()pour retourner"Student: [name] ([enrolledCount] courses)".Instructor.java: Créez une classe qui étendUser. Ajoutez un champ privé pourspecialty(String). Incluez un constructeur qui prend id, name et specialty, implémentezgetRole()pour retourner"Instructor", ajoutez un getter pour specialty, et surchargeztoString()pour retourner"Instructor: [name] - [specialty]".Course.java: Créez une classe qui implémenteEnrollable. Incluez des champs privés pourcourseId(String),title(String),instructor(Instructor), et une ArrayList d'étudiants inscrits. Le constructeur prend courseId, title et instructor. Implémentezenroll(Student student)pour ajouter l'étudiant à la liste, appelez la méthodeaddCourse()de l'étudiant avec l'ID de ce cours, et retournez true. ImplémentezgetEnrolledCount(). Ajoutez une méthodegetDetails()qui retourne"[courseId] [title] by [instructorName]".Main.java: Construisez votre plateforme ! Vous recevrez 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
Maintenez des collections d'instructeurs, d'étudiants et de cours. Traitez chaque commande et affichez :
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: Affichez la sortie de la méthode
toString()de l'utilisateur
Après toutes les commandes, affichez
--- Platform Summary ---suivi des détails de chaque cours et du nombre d'inscriptions au format[courseDetails] - [count] student(s).
Vous recevrez une seule 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, votre 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 toString) et l'encapsulation (champs privés avec accès contrôlé) dans un système cohérent !
Aide-mémoire
Ce défi final combine plusieurs concepts de la POO en un système cohérent :
Interfaces
Définissez des contrats de comportement que les classes doivent implémenter :
public interface Enrollable {
boolean enroll(Student student);
int getEnrolledCount();
}Classes abstraites
Créez des classes de base avec un comportement partagé et des méthodes abstraites :
public abstract class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public abstract String getRole();
}Héritage
Étendez les classes de base pour créer des types spécialisés :
public class Student extends User {
private ArrayList<String> enrolledCourses;
public Student(String id, String name) {
super(id, name);
this.enrolledCourses = new ArrayList<>();
}
@Override
public String getRole() {
return "Student";
}
}Implémentation d'interfaces
Les classes peuvent implémenter des interfaces pour remplir des contrats :
public class Course implements Enrollable {
private ArrayList<Student> enrolledStudents;
@Override
public boolean enroll(Student student) {
enrolledStudents.add(student);
student.addCourse(courseId);
return true;
}
@Override
public int getEnrolledCount() {
return enrolledStudents.size();
}
}Polymorphisme
Différentes classes peuvent surcharger des méthodes pour fournir un comportement spécialisé :
@Override
public String toString() {
return "Student: " + name + " (" + enrolledCourses.size() + " courses)";
}Encapsulation
Utilisez des champs privés avec un accès contrôlé via des méthodes pour protéger l'intégrité des données et maintenir les relations entre les objets.
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
// Hint: Utiliser une HashMap avec l'id comme clé pour une recherche facile
// TODO: Diviser l'entrée par virgule pour obtenir les commandes individuelles
// TODO: Traiter chaque commande :
// - ADD_INSTRUCTOR:id:name:specialty -> Créer l'instructeur, l'ajouter à la collection, afficher "Instructor added: [name]"
// - ADD_STUDENT:id:name -> Créer l'étudiant, l'ajouter à la collection, afficher "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> Créer le cours avec l'instructeur, l'ajouter à la collection, afficher "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 son toString()
// TODO: Après avoir traité toutes les commandes, afficher "--- 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érateur