Table of Contents

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é

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.

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.

Question 1 : Modéliser le système (10mn)

Question 2 : Implémenter tout ce qui concerne les véhicules avec les tests associés (20mn)

Question 3 : Implémenter la notion de convoi (20mn max)

Question 4 : Extension facile (10mn max)

Un nouveau type de véhicule est apparu, les “voitures sans permis” pour lesquels la vitesse maximale est de 50 km et le poids à vide de 425kg, pas de chargement possible.

Question 5 : Extension un peu moins facile (20mn)

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), par exemple1).

public class Simulator {
	public static final  int MAX_WEIGHT = 10000;
	public static final  int MIN_WEIGHT = 425;
 
	private Simulator() {}
 
	public static double consumption (Machine machine, int speed) {
		double normalizedWeight = (double) (machine.getWeight() - MIN_WEIGHT) / (MAX_WEIGHT - MIN_WEIGHT );
		return (1 + normalizedWeight) * machine.getHourlyFuelConsumption() * speed /20;
	}
}

Une Machine est définie par une interface comme suit :

public interface Machine {
	 public int getWeight(); 
	 public double getHourlyFuelConsumption();
}

On veut pouvoir calculer 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).

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,

  1. un document contenant
    1. les Diagrammes UML (essentiellement un diagramme de classes)
    2. les remarques éventuelles, réponses aux questions
    3. une copie d'écran de la couverture de test comme par exemple
  2. les codes et tests associés.

Dépôt sur jalon avec comme nom : GroupeNumero - Noms des etudiants

RETOURS SUR LES RENDUS de l'an dernier

On ne fait pas :
  • dupliquer les variables EMPTY_WEIGHT
  • la duplication de code par exemple des setCharge
  • Des noms de variable d'instance ou des méthodes 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 ! imaginez le coût d'une modification d'un toString !! et que testez-vous vraiment?
  • 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 ou pire d'une vieille version du sujet !
  • 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!!
  • Mettre unS à la fin du nom d'une classe comme Vehicule.
  • Ne pas savoir calculer le min d'un ensemble et ne pas faire de tests!
  • Mettre un attribut à la place d'une association ! Ne pas mettre les cardinalités !
  • Utilisez une valeur arbitraire comme 150… si demain vous gérez des convois de ferrari, vous devrez aller modifier votre code de convoi !! Integer.MAX_VALUE résout votre problème par exemple.
  • 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;
    }
 
1)
Le code ci-dessous présente des constantes qui doivent être éliminées dans une bonne version.