On distingue deux formes de consommation pour un même modèle de voiture :
la consommation moyenne sur route, urbaine ou mixte
exemples
la consommation en fonction de la vitesse qui suit la règle suivante
1), elle ne prétend pas être vraie
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 !
Quelle modélisation proposez-vous pour supporter les opérations suivantes :
Je veux pouvoir déclarer que le modèle Clio a une consommation moyenne sur Route de 6,3, urbaine de 8,1, ….
Je veux pouvoir déclarer que le modèle Clio a un coefficient “k” de 3,85*10^-4
Je veux pouvoir demander la consommation moyenne du modèle Clio sur Route (rep. 6,3)? urbaine(rep. 8,1)?
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é!!! ).
Réfléchissez à l'implémentation sur papier au moins et proposer un modèle de classe qui répond à ces fonctionnalités.
On intègre à présent la consommation “Mixte”, qu'est-ce qui change dans votre modèle? dans votre code?
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!
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
la consommation à prévoir en fonction de la vitesse
Quel est le couplage entre la classe calculateur et la classe modèle de voiture?
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)
Donc si on résume, voici des exemples de modèles :
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
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
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é;
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é
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?
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.
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) :
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.
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(…)).
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);