Les machines à affranchir le courrier

Objectifs : L'objectif de ce TD est de vous faire travailler avec les notions liées à l'héritage et au polymorphisme (classes et sous classes, classes abstraites, surclassement (upcasting))

Cet exercice est une adaptation d'un sujet qui a été proposé dans le cours de Programmation Objets de l'Ecole Polytechnique Fédérale de Lausanne (EPFL). L'ennoncé orginal est accessibe à l'url https://proginsc.epfl.ch/wwwhiver/series/serie08/serie_print.html (exercice 6)

Il s’agit dans cet exercice de proposer une conception orientée-objets modélisant en Java une machine à affranchir le courrier.

Une machine à affranchir le courrier recueille des lettres, des colis et des couriers publicitaires et calcule leur tarif d'affranchissement en fonction de leurs caractéritisques.

Une lettre est caractérisée par :

  • son poids (en grammes)
  • le mode d’expédition (express ou normal)
  • son adresse de destination
  • son format d'enveloppe (C4, C5, C6 ou DL)

    Format de l'enveloppe Dimensions de l'enveloppe Correspondance en format papier
    C4 22.9 x 32.4 cm A4 ou A3 plié en deux
    C5 16.2 x 22.9 cm A5 ou A4 plié en deux
    C6 11.4 x 16.2 cm A4 plié en quatre (format carte postale)
    DL 11 x 22 cm A4 plié en trois ou A5 plié en deux

Un colis est caractérisé par :

  • son poids (en grammes)
  • le mode d’expédition (express ou normal)
  • son adresse de destination
  • son volume (en litres )

Une courier publicitaire est caractérisée par :

  • son poids (en grammes)
  • le mode d'expédition (express ou normal)
  • son adresse de destination

Les règles utilisées pour affranchir le courrier sont :

  1. en mode d’expédition normal :
    • le montant nécessaire pour affranchir une lettre dépend de son format et de son poids. Pour une lettre dont le poids est inférieur ou égale à 50 g le tarif de base selon son format est le suivant :

      Format de l'enveloppe Tarif de base
      C4 2 €
      C5 1.75 €
      C6 et DL 1.66 €

      Si le poids de la lettre est supérieur à 50 g, ce tarif est majoré de 0.10 € par tranche de 50 gramme

      Poids Tarif d'affranchissement/th>
      poids <= 50 g tarif de base
      50 g < poids <=100 g tarif de base + 0.10 €
      100 g < poids <=150 g tarif de base + 0.20 €
      150 g < poids <=200 g tarif de base + 0.30 €
      ... ...
    • le montant nécessaire pour affranchir un courrier publicitaire dépend de son poids :
      il est de 4 € si le poids est inférieur ou égal à 100 g. Ce montant est majoré de 0.5 € par tranche de 100 g si le poids est supérieur à 100 g.

    • le montant nécessaire pour affranchir un colis dépend de son poids et de son volume :
      Formule : montant = 4 € + 1.50 € * volume (en litres) + poids (en kilos) * 1.0;
  2. en mode d’expédition express : les montants précédents sont doublés, quelque soit le type de courrier;
  3. seul le courrier valide est accepté par la machine à affranchir;
  4. un courrier quel qu'il soit n’est pas valide si l’adresse de destination est vide ou si son poids dépasse un poids maximal qui dépend de sa nature

    Nature du courrier Poids maximal
    Lettre 1 kg
    Courrier publicitaire 2 kg
    Colis 30 kg
  5. un colis n’est pas valide s’il dépasse un volume de 50 litres.

Les opérations définies pour une machine à affranchir sont les suivantes :

  • une méthode deposerCourrier() pour le dépot d'un courrier (lettre, courrier publicitaire ou colis) dans la machine à affranchir. Seuls sont acceptés et conservés les courriers valides. Les courriers invalides sont rejetés.
    A chaque dépot sont affichés sur la console (System.out) (voir exemple ci-desous):

    • les caractéristiques du courrier (dont son tarif d'affranchissement si le courrier est valide)
    • si le courier est invalide chaque caractéristique invalide et suivie d'un message le signalant
    • un message indiquant le rejet ou l'acceptation du courrier

    Chaque machine a une capacité maximale qui lui est propre et lorsque cette capacité est atteinte il n'est plus possible de déposer de nouveau courrier.

  • une méthode nbreDeCourriers() donnant le nombre total de courriers acceptées par la machine.
  • une méthode nbreCourriersInvalides() calculant et retournant le nombre de courriers invalides qui ont été refusés la machine.
  • une méthode valeurCourrier() qui retourne le montant total d'affranchissement du courrier déposé dans la machine.
  • une méthode detailsCourriers() affichant sur la console (System.out) le contenu de la machine à affranchir, pour chaque courrier on donnera ses caractéristiques et son tarif d'affranchissement.
  • une méthode vider() qui permet de vider la machine courrier de son contenu.

Par exemple si dans une machine on dépose les courriers suivants :

  • une lettre à expédier en mode express au format C4, de poids 200 g dont l'adresse de destination est M. IXE, 28 Chemin des Accacias, 73000 Chambéry ,
  • une lettre à expédier en mode normal au format C5, de poids 20 g mais pour laquelle l'adresse de destination a été oubliée,
  • une publicité à expédier en mode express, de poids 1500 g dont l'adresse de destination est Mme YGREK 24 Rue Peratour, 84330 LE Barroux,
  • une publicité à expédier en mode normal, de poids 1500 g dont l'adresse de destination est Mme IXE, 28 Chemin des Accacias, 73000 Chambéry,
  • une publicité à expédier en mode normal, de poids 2500 g mais pour laquelle l'adresse de destination a été oubliée,
  • un colis à expédier en mode normal, de poids 5000 g, d'un volume de 5l dont l'adresse de destination est M. John DOE, Grand rue , 73000 AIX LES BAINS,
  • un colis à expédier en mode express, de poids 29000 g, d'un volume de 55l dont l'adresse de destination est SARL ZED, 1200 Route de L'altiport, 73550 MERIBEL.

Ces différents dépots puis l'envoi du message detailsCourriers() donneront l'affichage suivant :

Lettre
Prix : 4.6 €
Poids : 200 g
Express : oui
Destination : M. IXE, 28 Chemin des Accacias, 73000 Chambéry
Format : C4
COURRIER ACCEPTE
                        
Lettre
Poids : 0 g
Express : non
Destination :   ADRESSE MANQUANTE
Format : C5
COURRIER REFUSE
                        
Publicite
Prix : 10.8 €
Poids : 1500 g
Express : oui
Destination : Mme YGREK 24 Rue Peratour, 84330 LE Barroux
COURRIER ACCEPTE
                        
Publicite
Prix : 5.4 €
Poids : 1500 g
Express : non
Destination : Mme IXE, 28 Chemin des Accacias, 73000 Chambéry
COURRIER ACCEPTE
                        
Publicite
Poids : 2500 g  POIDS TROP ELEVE
Express : non
Destination :   ADRESSE MANQUANTE
COURRIER REFUSE
                        
Colis
Prix : 16.5 €
Poids : 5000 g
Express : non
Destination : M. John DOE, Grand rue , 73000 AIX LES BAINS
Volume : 5.0 litres
COURRIER ACCEPTE
                        
Colis
Poids : 29000 g
Express : oui
Destination : SARL ZED, 1200 Route de L'altiport, 73550 MERIBEL
Volume : 55.0 litres   VOLUME TROP IMPORTANT
COURRIER REFUSE
                        
-----------------------------------------------------
Nbre total de courriers :  4
Montant total d'affranchissement : 37,30 €
Nbre total refusés : 3
-----------------------------------------------------
details des courriers
                        
Lettre
Prix : 4.6 €
Poids : 200 g
Express : oui
Destination : M. IXE, 28 Chemin des Accacias, 73000 Chambéry
Format : C4

Publicite
Prix : 10.8 €
Poids : 1500 g
Express : oui
Destination : Mme YGREK 24 Rue Peratour, 84330 LE Barroux

Publicite
Prix : 5.4 €
Poids : 1500 g
Express : non
Destination : Mme IXE, 28 Chemin des Accacias, 73000 Chambéry

Colis
Prix : 16.5 €
Poids : 5000 g
Express : non
Destination : M. John DOE, Grand rue , 73000 AIX LES BAINS
Volume : 5.0 litres
                    

Question 1 :

Commencez par dessiner un diagramme de classes permettant de mettre en oeuvre la conception suggérée en tenant compte des contraintes mentionnées. Dans votre diagramme vous spécifierez les classes, les attributs et les entêtes des méthodes ainsi que les relations entre les différents classes.

Votre conception doit être faite de sorte à ce que :

  1. aucune des méthodes requises n'ait besoin de faire de test sur la nature de l'objet auquel elle s'applique.
  2. les classes fournissent toutes les méthodes qui leur sont nécessaires.
  3. une classe ne comporte que les méthodes/attributs qui lui sont spécifiques.
  4. vos classes évitent de dupliquer inutilement des méthodes ou des attributs.

Une fois votre diagramme terminé, faites le moi valider avant de passer à la programmation

A utiliser si vous ne voyez pas du tout comment débuter

Définir une classe abstraite Courrier et trois sous classes concrètes :

  • Lettre pour les lettres
  • Publicite pour les courriers publicitaires
  • Colis pour les colis

Pour les formats de lettre on peut utiliser un type énuméré (voir le cours

A n'utiliser que si vous ne reussissez pas à trouver une solution ou si vous voulez comparer votre solution avec la mienne.

diagramme de classes
Diagramme de classes

Pour le type énuméré représentant les formats, vous pouvez vous référer au cours

Question 2 :

Créez un projet d'application java et implémentez les différentes classes que vous avez proposées ainsi qu'un programme principal ayant une exécution telle que celle proposé dans l'exemple précédent.

Question 3 :

Ecrivez des test unitaires pour vos différentes classes de courrier ainsi que pour la classe modélisant la machine à affranchir en essayant d'avoir une couverture de code complète.