L'examen est composé de 2 exercices qui sont complètement indépendants et qui peuvent être traités dans l'ordre que vous voulez. Il n'est jamais nécessaire d'avoir fait un exercice en entier pour traiter les autres.
Rappel : vous devez configurer le workspace d'Eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire EXAM présent dans le home de votre session de TP noté.
Vérifiez que tous vos fichiers sont bien dans le répertoire EXAM. Tout ce qui n'est pas dans ce répertoire est perdu quand vous vous déconnectez (ou en cas de panne).
Vous avez le droit de consulter les transparents du cours.
La Javadoc est disponible ici
Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.timeseries. Sauf mention explicite du contraire, votre code ne doit en aucun cas utiliser les switch introduits par Java 17.
La classe TimeSeries.java représente une série temporelle de données associant des instants temporels (Instant
) à des temperatures (Long
). Elle offre des fonctionnalités essentielles pour interroger ces données de manière efficace.
Les méthodes principales sont:
String name()
renvoie le nom de la série temporelleOptionalLong valueAt(Instant instant)
renvoie la valeur de la série temporelle enregistrée au moment le plus proche de l'instant fourni.Set<Instant> instants()
permet de récupérer l'ensemble des instants disponibles dans la série.Les TimeSeries
sont créées à l'aide de la méthode static fromWeb(String name, Instant start, int nbPoints)
: qui génère une série temporelle en simulant une collecte de données via une API fictive TemperatureReporter.java, en créant un nombre défini de points avec un écart d'une minute entre chaque échantillon à partir de l'instant start
.
Téléchargez les classes TemperatureReporter.java, TimeSeries.java et Application (qui donne un exemple simple d'utilisation).
On vous demande de travailler sur la classe TimeSeries
pour la faire évoluer.
Rajouter une manière user-friendly de construire une TimeSeries
à la main. Le constructeur doit rester privé et la classe TimeSeries
doit rester immutable. Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe TimeSeries
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.timeseries.q1.
On oublie le code de la question précédente et l'on repart du code de TimeSeries
donné initialement. On suppose que la classe TimeSeries
est utilisée par des millions d'utilisateurs de par le monde. Il est donc hors de question d'introduire des changements qui vont casser le code existant. On voudrait que si l'on appelle fromWeb
avec plus de 10 points, la TimeSerie
résultante a bien le même ensemble instants
mais les valeurs ne sont récupérées par l'API TemperatureReporter
que quand elles sont utilisées. S'il y a moins de 10 points, on veut conserver le même comportement.
Modifiez le code pour obtenir le comportement voulu sans casser le code existant qui utilise TimeSeries
. Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe TimeSeries
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.timeseries.q2.
On voudrait maintenant pouvoir créer à partir d'une TimeSeries
une TimeSeries
qui, à un instant donné, contient la somme de toutes les valeurs avant cet instant (inclus). On ne veut pas dupliquer les données de la TimeSeries
originale (i.e. les valeurs seront recalculées à chaque fois).
Modifiez le code pour obtenir le comportement. Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe TimeSeries
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.timeseries.q3.
On voudrait maintenant pouvoir créer à partir d'une TimeSeries
une TimeSeries
qui, à un instant donné, contient la moyenne de toutes les valeurs avant cet instant (inclus). Là encore, on ne veut pas dupliquer les données de la TimeSeries
originale (i.e. les valeurs seront recalculées à chaque fois). On voudrait aussi pouvoir créer une TimeSeries
qui, à un instant donné, contient la moyenne des 10 derniers instants avant cet instant (inclus).
Modifiez le code pour obtenir le comportement voulu en minimisant la duplication de code et en facilitant la création de TimeSeries
du même genre. Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe TimeSeries
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.timeseries.q4.
Toutes les classes demandées dans cet exercice doivent se trouver dans le package fr.uge.conglomerates. Sauf mention explicite du contraire, votre code ne doit en aucun cas utiliser les switch introduits par Java 17.
Dans cet exercice, on cherche à modéliser des entreprises et des conglomérats d'entreprises. Une entreprise possède un nom, un nombre de salariés et un chiffre d'affaire. Un conglomérat regroupe des entreprises ou d'autres conglomérats. Un conglomérat possède un nom. Son chiffre d'affaire est la somme de tous les chiffres d'affaires des entreprises et conglomérats qui le compose. De même pour son nombre d'employés.
Proposez une modélisation objet des entreprises (Enterprise
) et des conglomérats (Conglomerate
). Dans une classe Application
, définissez les entreprises et les conglomérats nécessaires pour obtenir l'affichage ci-après. Il y a 3 entreprises
UGE
, UPEC
, IFSTAR
et deux conglomérats Comue
et MegaComue
.
Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe Application
.
UGE : 100000€ and 1000 employees UPEC : 100€ and 100 employees IFSTAR : 100000€ and 10000 employees Comue : 100100€ and 1100 employees with UGE : 100000€ and 1000 employees UPEC : 100€ and 100 employees MegaComue : 200100€ et 11100 employees with IFSTAR : 100000€ and 10000 employees Comue : 100100€ and 1100 employees with UGE : 100000€ and 1000 employees UPEC : 100€ and 100 employees
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.conglomerates.q1.
On veut maintenant pouvoir changer à la création d'un conglomérat la façon dont son chiffre d'affaire est calculé. Votre code devra respecter le principe Open-Close et permettre de définir des conglomérats où:
Modifier votre code pour qu'il soit possible de définir de tels conglomérats. Dans la classe Application
, définissez un conglomérat avec la moyenne des chiffres d'affaires et un autre avec 110% de la sommes des chiffres d'affaire Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe Application
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.conglomerates.q2.
Modifier votre code pour qu'il ne soit pas possible de définir deux entreprises différentes ayant le même nom. Si vous avez utilisé des designs patterns, donnez leurs noms en commentaire en haut, de la classe Application
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.conglomerates.q3.
On repart maintenant de votre code obtenu à la première question.
On veut faire en sorte que dans un autre package qui va utiliser les classes de votre package fr.uge.conglomerates, il soit possible d'écrire les méthodes suivantes:
Faites en sorte qu'ils soient possible de coder ces méthodes en utilisant les switch de Java 17. Pour montrer que c'est possible, codez les 3 méthodes static dans la classe Application.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.conglomerates.q4.
Adaptez votre modélisation pour que ces fonctions soient codables sans utiliser les switch sur les classes et en dehors du package. Pour convaincre le correcteur que vous savez comment faire, coder la troisième méthode static
dans la classe Application
.
Quand vous avez fini de faire cette question, copiez toutes les classes dans le sous-package fr.uge.conglomerates.q5.