Polymorphisme et Composition
Basé sur TP3 de l'Université Montpellier II — L3 Informatique 2008/09 Programmation par objets en Java
Vous avez 2 heures.
Vous rendrez ce que vous avez fait à la fin des 2 heures.
.
Enoncé (écrit par d'autres...)
Une entreprise de Patagonie développe un moteur à huile de rutabaga, et dote plusieurs véhicules de ce moteur.
Avant d'effectuer des tests grandeur nature, l'entreprise conçoit un programme de simulation du comportement des véhicules. Ce programme est écrit en Java. On ne s'intéresse ici qu'à une toute petite partie de ce programme.
Le problème que l'on veut résoudre dans un premier temps est celui du calcul de la vitesse maximum pouvant être atteinte par un véhicule.
Tout véhicule possède une immatriculation (propre à chaque véhicule) et un poids à vide (propre à chaque type de véhicule). Certains véhicules peuvent transporter un chargement : on appelle alors charge, le poids de ce chargement. La charge d'un véhicule ne doit pas dépasser un certain poids, que l'on appellera charge maximale, dépendant du type de véhicule.
Les différents types de véhicules dotés du fameux moteur sont les suivants : les petits bus, les camions citernes, et les camions bâchés.
Un petit bus a un poids à vide de 4 tonnes, et peut atteindre une vitesse maximale de 150 km/h. Il ne possède pas de chargement (le poids des passagers est considéré comme négligeable par rapport au poids à vide).
Un camion citerne a un poids à vide de 3 tonnes et une charge maximale de 10 tonnes. Sa vitesse maximale dépend de sa charge :
130 km/h si la charge est nulle
110 km/h si la charge est inférieure ou égale à 1 tonne
90 km/h si la charge est supérieure à 1 tonne et inférieure ou égale à 4 tonnes
80 km/h pour une charge supérieure à 4 tonnes.
Un camion bâché a un poids à vide de 4 tonnes et une charge maximum de 20 tonnes. Sa vitesse maximale dépend également de sa charge (mais à charge égale, un camion citerne a une vitesse maximale plus faible, car le liquide qu'il transporte est plus instable qu'un chargement solide) :
130 km/h si la charge est nulle
110 km/h si la charge est inférieure ou égale à 3 tonnes
90 km/h si la charge est supérieure à 3 tonnes et inférieure ou égale à 7 tonnes 80 km/h au delà.
On s'intéresse également à la définition de convois de véhicules. Un convoi est composé d'un ensemble de véhicules de différents types.
On veut pouvoir calculer la vitesse maximale d'un convoi, sachant que cette vitesse correspond à la plus petite des vitesses maximales des véhicules du convoi.
On veut pouvoir calculer la charge maximale d'un convoi, sachant que cette charge est la somme des charges maximales des véhicules du convoi.
Question 1 : Modéliser le système
Question 2 : Implémenter tout ce qui concerne les véhicules avec les tests associés
Question 3 : Implémenter la notion de convoi
Question 4 : Extension facile
Un nouveau type de véhicule est apparu, les “voitures sans permis” pour lesquels la vitesse maximale est de 50 km, pas de chargement possible. Savez-vous calculer la vitesse maximale d'un convoi qui contient des voitures sans permis sans écrire une seule ligne de code dans la classe convoi?
Question 5 : Extension un peu moins facile
Les ingénieurs de l'entreprise ont mis au moins un calculateur (Class Simulator) qui permet de calculer la consommation moyenne en carburant d'un engin, il expose donc la méthode statique : public static double consumption (Machine machine, int speed) 1) par exemple
public class Simulator {
public static double consumption (Machine machine, int speed) {
return speed* (machine.getHorsePower() + machine.getWeight());
}
}
Une Machine est définie par une interface comme suit :
public interface Machine {
int getWeight();
int getHorsePower();
}
On veut pouvoir savoir la consommation totale d'un convoi allant à sa vitesse maximale (c'est-à-dire, on le rappelle, à la plus petite des vitesses maximales des véhicules du convoi).
Au niveau du code, on considère que tous les véhicules dans notre entreprise ont la même puissance.
Questions facultatives à ne pas traiter dans le TD
Que feriez-vous si l'on vous disait que l'on veut pouvoir créer des véhicules à partir de leur poids à vide, charge maximale, etc… ?
RENDU
A la fin du TD, en l'état, un document contenant les Diagrammes UML (essentiellement un diagramme de classes) et les remarques éventuelles, réposnes aux questions, les codes et tests associés.
Dépôt sur jalon avec comme nom : GroupeNumero - Noms des etudiants
RETOUR SUR LES RENDUS
ON évite ou on ne fait pas :
la duplication de code par exemple des setCharge
nom de variable d'instance, méthode en majuscule !!!
Définir une classe abstraite et implementer toutes ses méthodes de manière absurde : on ne sait même pas ce qui doit être redéfini (eg. vitesseMax à 0)!
Des tests sous forme de toString
aVOIR UNE CHARGE MAX ET NE PAS EN TENIR COMPTE en chargeant le véhicule
passer la charge à un vehicule qui a déjà une charge !
recopier les un sur les autres des codes pas très malins ou qui datent d'une vieille version de java
prévoir une méthode d'accès à la vitesse max et accéder directement à une variable “constante”… dans convoi et ne même pas s'en rendre compte dans les tests!!
Pas de S à la fin du nom d'une classe comme Vehicule.
ne pas savoir calculer le min d'un ensemble et ne pas faire de tests!
BANIR LES toString dans vos assert.. imaginez le coût d'une modification d'un toString !! et que testez-vous vraiment?
Ne mettez pas un attribut quand vous pouvez mettre une association ! Mettez les cardinalités !
N'utilisez pas des toString dans vos codes pour gérer les cas d'erreur : mettez votre gestion des cas d'erreur en commentaire par exemple add-charge ne fait rien si… et METTEZ des tests pour vérifier que vous faites bien ce que vous dites. Si vraiment vous en avez besoin, mettez un logger !
aTTENTION AU CHOIX ARBITRAIRE D4UNE valeur max comme 150… si demain vous gérez des convois de ferrari, vous devrez aller modifier votre code de convoi !! Integer.MAX_VALUE résoud votre problème par exemple.
cOMMENT FAIRE POur qu'un véhicule soit un engin???? Il faut répondre à cette question en TD.
Mettez le toString en facteur surtout quand vous le recopiez partout!
Prévoir en dure le calcul de la vitesse max et autoriser la modification de la charge !!
Ne définissez pas toutes vos variables en public ou même protected, simplement parce que vous ne savez pas utiliser des cascades de constructeurs ou des accesseurs! Et réfléchissez à la cohérence de votre code même sur un exemple aussi simple !
Sur PAPIER, POUR NOTER QU'UNE CLASSE EST abstraite, vous pouvez simplement écrire <abstract>, idem pour une méthode.
HORREUR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (piste : Polymorphisme ce n'est pas une maladie contagieuse.)
public double getVitesseMax(){
double resultat =150;
double resultat2 =0;
for (Vehicule v : listeVehicule) {
if(v instanceof PetitBus){
resultat2=((PetitBus) v).getVitesseMax();
}
if(v instanceof CamionCiterne){
resultat2=((CamionCiterne) v).getVitesseMax();
}
if(v instanceof CamionBache){
resultat2=((CamionBache) v).getVitesseMax();
}
if(v instanceof VoitureSansPermis){
resultat2=((VoitureSansPermis) v).getVitesseMax();
}
if (resultat2<resultat){
resultat = resultat2;
}
}
return resultat;
}