:: Enseignements :: Master :: M1 :: 2015-2016 :: Programmation Orientée Objet - Design Patterns ::
[LOGO]

Entraînement au TP noté de POO - Design Patterns


La salle est en mode "TP NOTE".
Tous vos rendus doivent se trouver dans le dossier 'EXAM' de votre HOME.
N'oubliez pas d'éteindre le poste à la fin du TP noté, c'est ce qui déclenche l'envoi de votre travail.

Les schéma UML vous permettent d'obtenir des points, n'oubliez pas :

Exercice 1 - La préhistoire du tableur

Dans le cadre du développement durable, des études cherchent à mesurer les effets, en terme de consommation d'eau et de consommation électrique, de différentes innovations.
Ces mesures n'ont de sens que si elles sont corrélées à la température extérieure.
Pour cela, dans des fermes expérimentales, de très nombreux capteurs de températures ont été disposés.
Un système centralisé permet de regrouper, à intervalles de temps programmés, les valeurs mesurées.
Le tout est ensuite stocké dans un fichier CSV (Comma Separated Value), en UTF-8.
Ci-dessous un exemple de fichier CSV obtenu.
measures.csv
Remarquez que le nombre de valeurs par ligne peut varier et que chaque ligne correspond à une date donnée.
Un stagiaire a écrit le code qui lit ce fichier, le parse, et calcule la moyenne des températures sur la période.
Le code vous est donné :


  1. Dans un premier temps, vous pouvez noter que le code ne fonctionne pas. En effet, il peut y avoir des valeurs invalides ou vides (suite à une erreur dans un capteur ou à une erreur de transmission), ces valeurs doivent être systématiquement ignorées.
    Que faut-il faire pour résoudre le problème ? Ou faut-il intervenir dans le code ?
    Faites les modifications et vérifiez qu'elles permettent aussi de lire le fichier suivant : measures2.csv
    Note 1 : en Java, la méthode Double.isNaN() existe car x == Double.NaN ne marche pas !
    Note 2 : que faut-il faire pour la ligne correspondant à la date "2014-11-05" dans measures2.csv.
  2. Au ministère, ils sont en fait besoin d'extraire d'autres informations à partir de ces fichiers et pour faciliter le travail, on veut en plus du calcul de la moyenne globale être capable de calculer la moyenne des valeurs par jour et de fabriquer un autre fichier CSV avec deux colonnes : date et moyenne du jour
    Avant de faire ce travail, votre chef de projet vous demande de refactoriser le code pour que le code de parsing ne soit pas dupliqué (contrainte non négociable).
    donc, dans un premier temps, vous allez devoir reprendre le code du stagiaire et le restructurer pour pouvoir partager le parsing.
    • Expliquez en 1 ou 2 phrases les principes de votre refactoring et faites le schéma UML correspondant
    • Effectuez le refactoring du code et vérifiez que tout re-fonctionne.
    • Ajouter le code de calcul de la moyenne journalière et de fabrication du CSV correspondant.

      Note 1 : bien sûr le code d'écriture dans le CSV doit être séparé du code de calcul de la moyenne journalière
      Note 2 : la moyenne n'est pas une opération associative, la moyenne des moyennes n'est pas la même chose que la moyenne globale.
      Note 3 : il n'est pas nécessaire (et pas recommandé) de garder en mémoire toutes les valeurs pour pouvoir calculer une moyenne, la somme des valeurs et le nombre de valeurs est suffisant.
      Note 4 : en Java, une date est gérée par la classe java.time.LocalDate. La méthode parse pemet de transformer une chaine de caractères en date.
  3. En fait, on veut pouvoir limiter le calcul des moyennes (la moyenne globale et la moyenne journalière) en restreignant le calcul à une période définie par une date de début et une date de fin. Toutes les valeurs associées à des dates avant ou après les dates de la périodes seront alors ignorées.
    • Sachant que l'on ne veut pas dupliquer le code de calcul des moyennes, et que l'on veut que cela fonctionne aussi sans définir de période (comme précédemment), quel design-pattern doit on mettre en oeuvre ?
    • Indiquer le diagramme UML correspondant.
    • Faite les changements correspondant dans le code.
  4. On veut pouvoir exécuter plusieurs traitements lors d'une lecture unique.
    Les calculs qui devront fonctionner :
    • la moyenne totale
    • la moyenne par jour sur toute la période
    • la moyenne globale entre le 2/11 et le 3/11
    • la moyenne par jour entre le 1/11 et le 5/11

    Expliquez comment vous allez modifier votre conception pour prendre en compte ce changement ? Quelles parties du code êtes-vous obligé de rouvrir ?
    Quel design pattern allez-vous introduire ? Faites le schéma UML correspondant
    Faites les modifications nécessaires au niveau du code.
  5. Pour des raisons techniques "bizarres", il y a parfois un fichier CSV par jour, parfois un fichier CSV par semaine, et même parfois un fichier CSV pour quelques heures. Il va donc falloir revoir votre conception pour être capable de traiter soit un fichier unique soit un ensemble de fichiers stockés dans un répertoire
    Note : si votre design précédent à été bien pensé vous ne devriez pas avoir à modifier le code que vous avez écrit précédemment mais juste ajouter le code permettant de lire plusieurs fichiers.
    Indiquer le diagramme UML correspondant à l'ajout de la gestion de plusieurs fichiers.
    Faire les modifications qui s'imposent au niveau du code.
    Rappel : en Java, les méthodes java.nio.file.Files.list(Path) ou Files.newDirectoryStream(Path) permettent de lister les fichiers d'un répertoire.