Examen 2h00 sur machine

Consignes

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

TimeSeries

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:

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.

Conglomérats

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:

Bien entendu, il ne s'agit pas de rajouter ces méthodes dans vos classes mais de faire en sorte qu'elle puisse être codées dans un autre package.

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.