Menu
Coddy logo textTech

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 !

challenge icon

Défi

Facile

Construisons 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éthodes enroll(Student student) qui retourne un boolean, et getEnrolledCount() 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 pour id (String) et name (String), un constructeur qui initialise les deux, des getters appropriés, et une méthode abstraite getRole() qui retourne une String décrivant le rôle de l'utilisateur.
  • Student.java : Créez une classe qui étend User. Ajoutez une ArrayList privée pour suivre les identifiants des cours inscrits. Incluez un constructeur qui appelle le constructeur parent, implémentez getRole() pour retourner "Student", et ajoutez les méthodes addCourse(String courseId) et getEnrolledCourseCount(). Surchargez toString() pour retourner "Student: [name] ([enrolledCount] courses)".
  • Instructor.java : Créez une classe qui étend User. Ajoutez un champ privé pour specialty (String). Incluez un constructeur qui prend id, name et specialty, implémentez getRole() pour retourner "Instructor", ajoutez un getter pour specialty, et surchargez toString() pour retourner "Instructor: [name] - [specialty]".
  • Course.java : Créez une classe qui implémente Enrollable. Incluez des champs privés pour courseId (String), title (String), instructor (Instructor), et une ArrayList d'étudiants inscrits. Le constructeur prend courseId, title et instructor. Implémentez enroll(Student student) pour ajouter l'étudiant à la liste, appelez la méthode addCourse() de l'étudiant avec l'ID de ce cours, et retournez true. Implémentez getEnrolledCount(). Ajoutez une méthode getDetails() 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:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO: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)"
    }
}
quiz iconTestez-vous

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