Responsabilités et Couplages

On distingue deux formes de consommation pour un même modèle de voiture :

 C(v) = 2(d/v) + K v^2 avec v en km/heures, d en km et k un coefficient variable en fonction des voitures. 

Si une voiture roule à 150 km/h sa consommation est donc en litre au 100km de :

 C(150) = 2(100/150) + K * 150^2 pour la Cl 

Avec un coefficient de 3,85*10^-4, C(150) = 9.99583333333; C(64) = 4,7 litres au 100km

Essayez de ne pas tricher, répondez aux questions une par une. Attention, l'exercice peut vous paraitre très facile au départ, mais vous avez vraiment intérêt à maintenir un modèle de classe cohérent à côté pour faire cet exercice.
Certains aspects font penser aux bases de données. Nous verrons plus tard cet aspect. Pour l'instant, réfléchissez uniquement “Objet”.
Tous les modèles de voiture n'ont pas la même manière de faire les calculs mais à la fin on veut tous les interroger de la même manière !
  1. Quelle modélisation proposez-vous pour supporter les opérations suivantes :
    1. Je veux pouvoir déclarer que le modèle Clio a une consommation moyenne sur Route de 6,3, urbaine de 8,1, ….
    2. Je veux pouvoir déclarer que le modèle Clio a un coefficient “k” de 3,85*10^-4
    3. Je veux pouvoir demander la consommation moyenne du modèle Clio sur Route (rep. 6,3)? urbaine(rep. 8,1)?
    4. Je veux pouvoir demander la consommation moyenne d'une Clio à 150km/h? (mettons que le coefficient est de 3,85*10^-4 et donc obtenir une réponse de quasi 10, … ce qui n'est pas du tout la réalité!!! ).
  2. Réfléchissez à l'implémentation sur papier au moins et proposer un modèle de classe qui répond à ces fonctionnalités.
  3. On intègre à présent la consommation “Mixte”, qu'est-ce qui change dans votre modèle? dans votre code?
  4. On vient d'établir une formule 2) qui, pour certains modèles de voitures, à partir des données connues en circulation urbaine ou sur route permet de déterminer le coefficient K, selon la formule suivante : On calcule le coefficient en multipliant par 10^-4, la consommation sur route au dessus de 100 km/h, la consommation mixte entre 100 et 50, et en dessous urbaine. Quelle modélisation proposez-vous ? Quel est le couplage entre vos classes? Avez-vous bien supporté l'extension? Il existe plusieurs solutions possibles, c'est à vous de décider!
    • Par exemple, pour la FerrariF430,
      • consommations :
        • consoSurRoute= 13.3 litre par CENT_KM,
        • consoUrbaine=26.9 litre par CENT_KM,
        • consoMixte = 18.3 litre par CENT_KM
      • et le calcul de la consommation en fonction de la vitesse doit utiliser cette règle fictive qui donnerait des résultats comme :
        • A 150km/hConso : [31.258333333333336 litre par CENT_KM]]
        • A 90/hConso : [17.045222222222222 litre par CENT_KM]]
        • A 30km/hConso : [9.087666666666667 litre par CENT_KM]]
  5. On veut définir un calculateur qui en fonction d'un modèle de voiture et d'une distance peut calculer :
    • la consommation à prévoir en fonction du type de route
      • Pour ma ferrari F430 si je roule pendant 100km sur route, combien vais-je dépenser d'essence?
    • la consommation à prévoir en fonction de la vitesse
      • Pour ma clio si je roule pendant 100km à 90km/h, combien vais-je dépenser d'essence?
    • Quel est le couplage entre la classe calculateur et la classe modèle de voiture?
  6. En fait, pour certains modèles de voiture (par exemple, les Peugeots), les consommations moyennes sont obtenues par des requêtes à un service externe qui, en fonction des informations sur le modèle (on se limite au nom et à l'année, par exemple Peugeot 208 et 2000), nous renvoie une chaine de caractères au format JSON, par exemple {“consommation”: {“route” : “6.3”, “urbaine” : “8.1” } }, Intégrez ce type de “calcul” de la consommation dans votre modélisation, quel est l'impact? 3)
  7. Donc si on résume, voici des exemples de modèles :
    1. A un modèle Clio, on associe des données de consommation fixes et un calcul de la consommation en fonction de la vitesse qui est basé sur un coefficient K donné, on fait pareil pour le modèle Mégane
    2. A un modèle Ferrari F430 on associe des données de consommation fixes et un calcul de la consommation en fonction de la vitesse qui est basé sur un coefficient K calculé, on fait pareil pour certaines Porshes
    3. A un modèle Peugeot 208, on obtient les données de consommation en faisant appel à un service externe, et la consommation en fonction de la vitesse est basée sur un coefficient K donné;
    4. A un modèle Mercedes ClasseA, on obtient les données de consommation en faisant appel à un service externe, et la consommation en fonction de la vitesse est basée sur un coefficient K calculé
  8. Si à présent on ajoute un autre mode de détermination de la consommation basée par exemple sur des données statistiques stockées dans un fichier excel, et que l'on décide que le modèle Clio se base sur ces données… Votre solution est-elle toujours valide?
  9. Pour certains véhicules on veut pouvoir enregistrer une consommation en Galon pour 100 Miles, que devez-vous modifier? On ne vous demande pas de le faire.
  10. Que retenez-vous?

A la fin de cette séance (au plus tard en fin de semaine) 24 octobre pour les S3A

  • Dans votre répertoire de projet, sous TD4, se trouvent (s'il y a des doutes sur le répertoire de livraison, mettez un mail à votre encadreur) :
    1. Un document contenant
      • votre modèle final (Tout le monde n'aboutit pas au même modèle, c'est certain) (merci de l'intégrer dans un document pour que nous n'ayons pas à ouvrir différents modèles dans différentes versions de l'outil).
      • des explications sur les raisons de ce modèle (dont vous êtes très fiers) et les leçons apprises.
    2. Les codes et les tests. Pensez bien que le service externe ne doit pas être vraiment implémenté. Une fonction qui pour l'instant retourne à chaque fois la même chaine de caractère convient très bien, et vous pouvez considérer aussi la transformation d'une chaine de caractère JSON en “autre chose” comme donnée (par exemple : return new Consommation(…)).

Tuyaux

Vous pouvez utiliser la bibliothèque “Jackson” pour gérer le format JSON.

Les . jar dont vous avez besoin :jackson-databind-2.3.1.jar jackson-core-2.4.3.jar jackson-annotations-2.4.0.jar

Pour pouvoir les utiliser dans le projet Eclipse : Sur le projet > Properties > Java Build Path > Add external Jars et sélectionnez les.

Pour transformer un objet Java en string Json :

 ObjectMapper objectMapper = new ObjectMapper();
      objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);  
      Object json = objectMapper.readValue(
                objectMapper.writeValueAsString(cm), Object.class);
      String jsonString = objectMapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(json);
      return jsonString;

Pour transformer une string Json en objet Java :

           //Appel fonction de votre code//
            String json =  serviceExterne.consommationJSON(modele);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.enableDefaultTyping(); 
            //Nom de la classe cible dépendant de votre modèle, chez moi, c'est ConsommationMoyenne
            ConsommationMoyenne cm =  objectMapper.readValue(json, ConsommationMoyenne.class);

2)
C'est possible, mais je ne l'ai pas trouvé…
3)
voir plus bas pour des détails techniques