Vous êtes sur la page 1sur 4

Exercice de remaniement de code

Le système de départ
Le programme que l’on va remanier permet de gérer le profil de loca�on d’un client d’un magasin de loca�on d’ou�llage
de construc�on. Ce programme permet principalement de nous fournir un rapport indiquant le coût des ou�ls loués par
un client ainsi que les points bonis (fidélité) accumulés. Le coût d’une loca�on est fonc�on du nombre de jours loués et
du type de matériel loué. Les points bonis sont atribués en fonc�on de l’ou�l loué (nouveauté ou non) et du nombre de
jours loués. Le magasin propose trois types d’ou�ls : les ou�ls réguliers, le gros ou�llage et les nouveautés.

La classe Ou�l permetant d’iden�fier les ou�ls en loca�on.


public class Outil {
public static final int GROS_OUTILLAGE = 2;
public static final int NOUVEAUTEES = 1;
public static final int REGULIER = 0;
private String _titre;
private int _codePrix;
public Outil(String titre, int codePrix) {
_titre = titre;
_codePrix = codePrix;
}
public int getCodePrix() {
return _codePrix;
}
public void setCodePrix(int arg) {
_codePrix = arg;
}
public String getTitre() {
return _titre;
}
}

La classe Loca�on permet de documenter les loca�ons de matériel.


public class Location {
private Outil _outil;
private int _nbJoursLoues;
public Location(Outil outil, int nbJoursLoues) {
_outil = outil;
_nbJoursLoues = nbJoursLoues;
}
public int getNbJoursLoues() {
return _nbJoursLoues;
}
public Outil getOutil() {
return _outil;
}
}
La classe Client permet d’iden�fier les clients du magasin : comme les autres classes elle dispose de méthodes d’accès,
mais elle possède aussi la majorité de la logique d’affaire pour ce programme.
import java.util.Enumeration;
import java.util.Vector;

public class Client {


private String _nom;
private Vector _locations = new Vector();
public Client(String nom) {
_nom = nom;
}
public void ajoutLocation(Location arg) {
_locations.addElement(arg);
}
public String getNom() {
return _nom;
}
public String rapport() {
double mtTotal = 0;
int pointsBonis = 0;
Enumeration locations = _locations.elements();
String result = "État des locations au compte de " + getNom() +
"\n";
while (locations.hasMoreElements()) {
double ceMontant = 0;
Location chaque = (Location) locations.nextElement();
ceMontant = montantPour(chaque);
pointsBonis++;
// ajout de points de boni pour une location de 2 jours
if ((chaque.getOutil().getCodePrix() == Outil.NOUVEAUTEES)
&& chaque.getNbJoursLoues() > 1)
pointsBonis++;
result += "\t" + chaque.getOutil().getTitre() + "\t"
+ String.valueOf(ceMontant) + "\n";
mtTotal += ceMontant;
}
result += "Montant dû égal à : " + String.valueOf(mtTotal) + "\n";
result += "Vous gagnez " + String.valueOf(pointsBonis)
+ " points de bonis\n";
return result;
}
public double montantPour(Location uneLocation) {
double total = 0;
switch (uneLocation.getOutil().getCodePrix()) {
case Outil.REGULIER:
total += 2;
if (uneLocation.getNbJoursLoues() > 2)
total += (uneLocation.getNbJoursLoues() - 2) * 1.5;
break;
case Outil.NOUVEAUTEES:
total += uneLocation.getNbJoursLoues() * 3;
break;
case Outil.GROS_OUTILLAGE:
total += 1.5;
if (uneLocation.getNbJoursLoues() > 3)
total += (uneLocation.getNbJoursLoues() - 3) * 1.5;
break;
}
return total;
}
}
La classe Main permet de gérer le système.
public class Main {
private static final int NB_JOURS_LOCATION = 3;
public static void main(String[] args) {

Client sallie = new Client("Sallie");


System.out.println(sallie.getNom());
Outil tournevis = new Outil("Tournevis", Outil.REGULIER);
System.out.println(tournevis.getCodePrix() + " " + tournevis.getTitre());
Location location1 = creerLocation("Marteau piqueur", Outil.REGULIER, 0);
Location location2 = creerLocation("Auto-marteau", Outil.NOUVEAUTEES, 5);
Location location3 = creerLocation("Compresseur hydraulique",
Outil.GROS_OUTILLAGE, 7);
sallie.ajoutLocation(location1);
sallie.ajoutLocation(location2);
sallie.ajoutLocation(location3);

System.out.println(sallie.rapport());
System.out.println(location1.getNbJoursLoues());
}
private static Location creerLocation (String nomOutil, int typeOutil, int
nbJours) {
Outil outil = new Outil(nomOutil, typeOutil);
return new Location(outil, nbJours > 0 ? nbJours : NB_JOURS_LOCATION);
}
}

Commentaires sur le code

Bien que le code soit fonc�onnel, il y a plusieurs problèmes avec ce système qu’il faut corriger. En par�culier, la méthode
Client.rapport() est netement trop longue et complexe pour une seule méthode. Une grande par�e de son travail
pourrait être déléguée à d’autres classes. Les problèmes à eux seuls jus�fient un remaniement du code, d’autant plus
que le propriétaire du magasin d’ou�llage voudrait ajouter une fonc�onnalité pour imprimer le rapport sous un format
HTML. Après avoir analysé le code existant, vous décidez de remanier le code pour le rendre plus propre et maintenable,
en appliquant les no�ons de ré-usinage vues en classe. Voici la tâche de remaniement de code que vous décidez
d’accomplir :

NB: lorsque vous effectuez un changement dans une partie du code, assurez-vous que ce changement
ne cause aucun problème ailleurs.
Classe Ou�l
1. Renommez la variable _�tre par nom. Modifiez l’accesseur correspondant.
2. Remplacez les trois en�ers pour GROS_OUTILLAGE, NOUVEAUTEES et REGULIER par une
énuméra�on nommée Categorie. Renommez la propriété _codePrix par categorie et changez
son type pour celle de votre nouvelle énuméra�on.
3. Remplacez l’accesseur et le mutateur pour _codePrix par leur correspondant pour la
catégorie.
Classe Loca�on
1. Enlevez la barre de soulignement aux variables _ou�l et _nbJoursLoues.
2. Créez une nouvelle méthode calculerMontantDu sans argument qui retourne un double. Le
corps de cete méthode est le même que la méthode Client.montantPour : effacez ou
commentez cete méthode de Client.
3. Créez une nouvelle méthode calculerPointsBonis sans argument et qui retourne un en�er. Le
code de cete méthode se trouve un peu éparpillé dans la méthode Client.rapport. Rapatriez
ce code dans calculerPointsBonis.
Classe Client
1. Enlevez la barre de soulignement à la propriété _nom.
2. Enlevez la barre de soulignement à la propriété _loca�ons ainsi que son instancia�on, que
vous déplacez dans le constructeur. De plus, en u�lisant la généricité, spécifiez que ce vecteur
est un vecteur de Loca�on.
3. Renommez la méthode ajoutLoca�on par ajouterLoca�on.
4. Créez une nouvelle méthode calculerMontantDu sans argument et qui retourne un double.
Le code de cete méthode se trouve un peu éparpillé dans la méthode Client.rapport.
Rapatriez ce code dans calculerMontantDu.
5. Créez une nouvelle méthode calculerPointsBonis sans argument et qui retourne un en�er. Le
code de cete méthode se trouve un peu éparpillé dans la méthode Client.rapport. Rapatriez
ce code dans calculerPointsBonis.
6. Créez une nouvelle méthode genererRapport sans argument et qui retourne une String. Le
code de cete méthode se trouve un peu éparpillé dans la méthode Client.rapport. Rapatriez
ce code dans genererRapport.
7. Vous pouvez maintenant effacer ou commenter la méthode Client.rapport.
8. Créez une nouvelle méthode genererRapportHTML sans argument et qui retourne une String.
Cete méthode devra retourner une String qui, lorsque rendue dans un navigateur web,
affichera la page suivante :

Classe Main
Ajustez le code de la classe pour qu’il s’exécute correctement et donne les bons résultats à
par�r de votre nouveau code remanié.
Tests JUnit
Assurez-vous que tous les tests fournis pour les classes Client et Loca�on s’exécutent avec
succès sur ce code remanié.

Vous aimerez peut-être aussi