:: Enseignements :: ESIPE :: E4INFO :: 2013-2014 :: Programmation Orientée Objet - Design Pattern ::
[LOGO]

L'assurance ça rassure


classe, interface, refactoring de base
Vous venez d'être embauché comme auxilliaire occasionel pour écrire deux fonctionnalités du nouveau site d'une assurance en ligne.
Votre boss sachant que vous n'avez pas beaucoup d'expérience décide de limiter les risques et vous demande de coder des fonctionnalités du module de statistique (car si c'est faux, c'est pas grâve).

Exercice 1 - French Connection

On sintéresse dans un premier temps à l'historique de connection du site Web. Malheureusement, l'ingéneurs système est en vacances, il n'est donc pas possible d'obtenir un accès au fichier de log contenant un historique de connections.
Comme vous devez quand même travailler, vous apprenez par un collègue que le fichier de log contient heureusement une date de début et une date de fin de connection (en milliseconde depuis Epoch).

  1. Ecrire une classe Connection qui représente les informations de connection (début, fin) en miliseconde correspondant aux valeurs disponibles dans le fichier de log.
  2. Ecrire l'interface d'un service ConnectionService qui permet d'obtenir une liste des dernières connections. Comme vous n'avez pas de vrai donnée, il va falloir en générer des fausses en attendant d'obtenir ce fameux fichier de log.
    Créer une classe MockConnectionService implantant l'interface ConnectionService qui renvoie 1 000 000 de connections générer à partir d'un générateur pseudo-aléatoire (la classe java.util.Random en Java) dont la graine (seed) est fixé à 0 (cela permettra de reproduire toujours les mêmes données).
  3. Enfin, après réunion avec votre patron, vous apprenez que les statistiques intéressantes pour les connections sont le nombre totale de connections ainsi que la moyenne du temps de connection.
    Ecrire le code permettant de faire plaisir à votre patron.

Exercice 2 - Contrats

On vous demande maintenant de calculer des statistiques sur le prix de contrat d'assurances dont les données on été extraite de la base de données par un export.
Malheureursement le DBA est lui aussi en vacances, il est donc impossible d'effectuer un export sans sa présence. Le collègue vous ayant aidé précédemment semble se souvenir qu'un contrat d'assurance à bien un prix ainsi que l'age de la personne ayant souscrit le contrat.

  1. Ecrire la classe Contract, une interface ContractService et sa classe MockContractService ainsi que du code permettant de calculer le prix moyen d'un contrat d'assurance
  2. Après avoir croisé votre boss dans un couloir, vous apprenez que dans le cas du prix des contrats d'assurance, calculer l'écart type est aussi une bonne idée.
    Faites les changements qui s'impose.
  3. Après avoir croisé votre collègue à la machine à café, vous apprenez que le script JavaScript utilisé pour calculer la fin d'une connection ne marche pas dans 1% des cas et renvoie la valeur -1 en tant que valeur de fin de connection dans ce cas.
    Modifier votre implantation de MockConnectionService pour simuler ce cas et faites en sorte de ne pas prendre en compte les connections dont la valeur de fin de connection est invalide.
  4. Votre boss vient vous voir pour vous dire qu'il veux aussi des statistiques sur l'age moyen (et l'écart-type) des personnes ayant souscrit un contrat d'assurance.
    Modéliser les changements que vous voulez effectuer.
  5. Effectuer les changements que vous avez prévu de faire sur votre code.

Exercice 3 - Refactor, refactor, refactor

  1. Après avoir présenté votre travail au CTO, qui lui revient de vacances, celui-ci vous indique que la moyenne et l'ecart type peuvent être calculé en un seul passage sur la liste et que refactoriser votre code serait une bonne idée pour partager le même code entre le calcul des statistiques sur les connections et sur les contrats car il semble qu'il y est beaucoup de code quasiment identique.
    Modéliser les changements que vous allez devoir effectuer.
  2. Effectuer les changements que vous avez prévu de faire sur votre code.