NB : Le but de cet exercice est de concevoir un système complet et flexible tout en appliquant
les principes de la programmation orientée objet et les collections pour maintenir un code
propre, réutilisable et extensible.
Exercice :
Vous devez développer un système de gestion des projets d'une entreprise. L'entreprise est
structurée en plusieurs équipes, et chaque équipe est composée de plusieurs employés.
Chaque employé possède un rôle (par exemple, Développeur, Designer, etc.) et un emploi du
temps qui détermine combien de tâches il peut gérer simultanément.
Dans ce système, vous devez gérer différents types de tâches, chaque tâche ayant un nom,
une date limite et un statut (en cours, terminée). Les tâches peuvent être assignées à plusieurs
employés, et chaque employé peut être affecté à plusieurs tâches. Toutefois, chaque employé a
une capacité limitée à gérer un nombre défini de tâches en même temps.
Vous devez créer une application qui permet de :
Ajouter des employés à des équipes.
Assigner des tâches aux employés.
Suivre l'avancement des tâches : vous devez pouvoir marquer les tâches comme
terminées ou en cours.
Gérer dynamiquement l'ajout d'employés aux tâches et permettre de consulter les
tâches en fonction de leur statut.
Générer des rapports des tâches à accomplir dans une certaine période.
Le système doit utiliser des collections pour gérer les employés, les équipes et les tâches. Par
exemple, les tâches peuvent être stockées dans une liste et les employés dans un Map ou une
List, selon leur rôle.
Le système doit aussi respecter les principes suivants :
1. Encapsulation et Abstraction:
Utilisez l'encapsulation pour protéger les données des classes (par exemple, les
informations des employés et des tâches).
Créez des classes abstraites ou des interfaces pour définir des comportements
génériques, comme une interface pour les tâches et les employés afin de gérer les
interactions entre différentes classes.
2. Héritage et Polymorphisme:
Utilisez l’héritage pour créer des sous-classes d'employés (par exemple, Développeur et
Designer) qui hériteront d'une classe de base Employé.
Utilisez le polymorphisme pour permettre à différents types d’employés d'interagir avec
les tâches de manière différente, selon leur rôle.
3. Collections :
Vous devez utiliser des collections pour gérer l'ensemble des employés, des équipes et
des tâches. Par exemple, une List<T> pourrait être utilisée pour stocker les employés
dans une équipe, et un Map<String, Tache> pourrait être utilisé pour lier une tâche à un
identifiant unique.
Le système doit permettre d'ajouter et de retirer des employés des équipes ou des
tâches à tout moment, et de mettre à jour les informations (par exemple, le statut d'une
tâche).
4. Gestion des tâches et des employés :
Les employés doivent avoir une méthode pour récupérer leurs tâches, et une autre pour
marquer leurs tâches comme terminées ou en cours.
Les équipes doivent permettre d'assigner de nouvelles tâches aux employés et de suivre
les tâches de chaque membre de l'équipe.
Exigences supplémentaires :
Vous devrez implémenter un mécanisme de validation pour vous assurer qu’un employé
n'excède pas le nombre de tâches qu'il peut gérer en même temps, en fonction de son
rôle et de sa charge de travail.
Vous devrez gérer l’ajout et la suppression dynamique des tâches, ainsi que l’affichage
de l’état actuel des tâches pour chaque employé.