Exercice Java: Transformer un programme java donné en un programme orienté objet- taxes

[tab name=’Exercice java’]

Le fichier Taxes1.java contient un programme qui aide une

Exercice Javaentreprise à stocker des données sur sa flotte de voitures et de calculer la taxe annuelle totale à payer pour la flotte. Le programme est modularisé sous forme de méthodes auxiliaires. Copiez le programme sous le nom de Taxes2.java et transformez-le en programme orienté objets. Dans ce but, vous pouvez vous inspirer de l’exemple vu en cours. Suivez les étapes suivantes:

  • Etudiez le fonctionnement du programme. L’entreprise a une flotte de voitures composée d’une Toyota de cylindrée 1598 et d’une BMW de cylindrée 2756 dont les données sont stockées dans des variables de type int et String. La méthode auxiliaire afficherVoiture() aide la méthode main à afficher les données sur la flotte. Les 3 méthodes auxiliaires afficherTaxeFlotte(),
    calculerTaxeFlotte() et calculerTaxeVoiture() s’occupent de calculer et d’afficher la taxe à payer pour la flotte. La taxe varie entre 300 et 700 francs par voiture et dépend de sa cylindrée.
  • Ajoutez une classe Voiture qui regroupera tout ce qui concerne un objet de type voiture, comme par exemple les variables contenant la marque et la cylindrée, la méthode pour afficher les données d’une voiture et la méthode pour calculer la taxe d’une voiture. Les méthodes d’instance dans le nouveau programme auront typiquement moins de paramètres que les méthodes auxiliaires correspondantes dans l’ancien programme. N’oubliez pas qu’une méthode d’instance n’a pas de mot-clé static. Ajoutez une méthode constructeur à la classe et le mot-clé private pour les variables et les méthodes d’instance qui ne seront pas utilisées à l’extérieur de la classe.
  • Ajoutez une classe Flotte qui regroupera tout ce qui concerne un objet de type flotte, e.g. les variables pour les voitures, la méthode pour afficher les données d’une flotte et la méthode pour calculer la taxe d’une flotte. Ces méthodes appelleront typiquement les méthodes de la classe Voiture.
  • Modifiez la méthode main. Idéalement, elle n’aura que 3 instructions: construction d’un objet de type Flotte, appel à une méthode d’instance pour afficher les informations sur la flotte et appel à une méthode d’instance pour calculer et afficher la taxe totale de la flotte.

Exemple d’exécution du programme:

Vous avez une Toyota de cylindrée 1598
Vous avez une BMW de cylindrée 2756
Taxe totale à payer: 1000.0 francs

Code donné:

/* Ce programme est modularisé sous forme de méthodes auxiliaires.
   Il vous est demandé de le transformer en un programme orienté
   objets. */

class Taxes1 {
    public static void main(String[] args) {
        // Données pour la première voiture (marque et cylindrée):
        String marque1 = "Toyota";
        int cylindree1 = 1598;
        // Données pour la deuxième voiture (marque et cylindrée):
        String marque2 = "BMW";
        int cylindree2 = 2756;
        // Affichage de la flotte:
        afficherVoiture(marque1, cylindree1);
        afficherVoiture(marque2, cylindree2);
        // Calcul et affichage de la totalité des taxes:
        afficherTaxeFlotte(cylindree1, cylindree2);
    }
    static void afficherVoiture(String marque, int cylindree) {
        // Cette méthode affiche les données d'une voiture *
        System.out.println("Vous avez une " + marque +
                " de cylindrée " + cylindree);
    }

    static void afficherTaxeFlotte(double cylindree1, double cylindree2) {
        // Cette méthode calcule et affiche la taxe totale des deux
        // voitures
        double taxe = calculerTaxeFlotte(cylindree1, cylindree2);
        System.out.println("Taxe totale à payer: " + taxe + " francs");
    }

    static double calculerTaxeFlotte(double cylindree1, double cylindree2) {
        // Cette méthode calcule la taxe totale pour deux voitures 
        double taxe1 = calculerTaxeVoiture(cylindree1);
        double taxe2 = calculerTaxeVoiture(cylindree2);
        return (taxe1 + taxe2);
    }
    static double calculerTaxeVoiture(double cylindree) {
        // Cette méthode retourne la taxe à payer pour une voiture de la
        // cylindrée indiquée *
        double taxe;
        if (cylindree <= 1600)
            taxe = 300.0;
        else if (cylindree <= 2300)
            taxe = 500.0;
        else
            taxe = 700.0;
        return taxe;
    }
}

[/tab][tab name=’Correction’]

 

Le code complet du corrigé vous est fourni ci-dessous. A remarquer en particulier:

  1. Les méthodes propres à un type d’objet sont mises dans la classe décrivant ce type d’objet (encapsulation). Exemple: calculerTaxeFlotte est mise dans la classe Flotte (et porte désormais le nom calculerTaxe, voir point suivant).
  2. Les concepts OO nous permettent la réutilisation d’identifiateurs parlants pour les noms de méthodes. Par exemple, il n’est plus nécessaire d’avoir pour les affichages ou le calcul de taxes deux noms de méthodes distincts: afficherFlotte et afficherVoiture ou calculerTaxeFlotte et calculerTaxeVoiture . Ces méthodes peuvent désormais simplement s’appeller afficher (resp. calculerTaxe) sans aucun risque de confusion puisque chaque classe a ses propres attributs et méthodes.
/* Version orientée objets de Taxes1 */

class Taxes2 {
    public static void main(String[] args) {
        // Construire 1 objet de type Flotte:
        Flotte f = new Flotte("Toyota", 1598, "BMW", 2756);
        // Afficher la flotte:
        f.afficher();
        // Calculer et afficher la taxe de la flotte:
        f.afficherTaxe();
    }

}

class Flotte {

    // Variables d'instance de la classe Flotte:
    private Voiture v1;
    private Voiture v2;

    // Méthode constructeur:
    public Flotte(String marque1, int cylindree1, String marque2, int cylindree2) {
        // Construire 2 objets de type Voiture:
        v1 = new Voiture(marque1, cylindree1);
        v2 = new Voiture(marque2, cylindree2);
    }

    public void afficher() {
        // Cette méthode affiche les données de toutes les voitures de la
        // flotte en appelant la méthode afficher de chaque objet voiture 
        v1.afficher();
        v2.afficher();
    }

    public void afficherTaxe() {
        // Cette méthode calcule et affiche la taxe totale 
        double taxe = calculerTaxe();
        System.out.println("Taxe totale à payer: " + taxe + " francs");
    }

    private double calculerTaxe() {
        // Cette méthode calcule la taxe totale pour les deux
        // voitures. Elle est privée car il n'y a aucune raison de
        // l'appeler depuis l'extérieur de la classe. 
        return (v1.calculerTaxe() + v2.calculerTaxe());
    }
}

class Voiture {
    // Variables d'instance de la classe Voiture:
    private String marque;
    private int cylindree;

    // Méthode constructeur:
    public Voiture(String marque, int cylindree) {
        this.marque = marque;
        this.cylindree = cylindree;
    }

    public void afficher() {
        // Cette méthode affiche les données d'une voiture 
        System.out.println("Vous avez une " + marque +
                " de cylindrée " + cylindree);
    }

    public double calculerTaxe() {
        // Cette méthode retourne la taxe à payer pour l'objet 
        // 
      double taxe;
        if (cylindree <= 1600)
            taxe = 300.0;
        else if (cylindree <= 2300)
            taxe = 500.0;
        else
            taxe = 700.0;
        return taxe;
    }
}

[/tab][end_tabset skin= »ginger » ]

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *