Sommatif no. 3 - Collections et Exceptions¶
Contexte général¶
Vous travaillez pour une petite boutique en ligne qui gère :
- une file de commandes en attente, représentée par une
LinkedList<Commande>; - un registre de clients, représenté par une
HashMap<String, Client>où la clé est l’iddu client.
Vous allez :
- manipuler deux collections (
LinkedListetHashMap) ; - parcourir ces collections à l’aide d’un
Iterator(pas defor-each) ; - créer et utiliser des exceptions personnalisées contenant l’objet en erreur ;
- trier une liste de commandes à l’aide d’un
Comparator<Commande>basé sur la couleur (java.awt.Color).
L’ordre de priorité des couleurs est :- Noir > Rouge > Bleu > Jaune
Travail demandé (instructions de réalisation)¶
Modèle de données¶
-
Créez une classe
Clientavec au minimum :String idString nomdouble solde
ainsi que les constructeurs, getters, setters nécessaires et une méthodetoString()lisible.
-
Créez une classe
Commandeavec au minimum :String idString clientIdString descriptionint quantitedouble prixUnitairejava.awt.Color color
plus un constructeur, les getters nécessaires et une méthodetoString().
-
Vérifiez que votre classe
Commandeimporte correctement la classeColor:
Exceptions personnalisées¶
-
Créez une classe abstraite
CollectionOperationExceptionqui étendExceptionet contient :- un champ
Object objectInError - un constructeur permettant d’initialiser le message et l’objet en erreur
- un getter
getObjectInError()
- un champ
-
Créez les trois exceptions concrètes suivantes, qui héritent toutes de
CollectionOperationException:-
InvalidOrderException- doit prendre en paramètre une
Commandeen erreur
- doit prendre en paramètre une
-
UnknownClientException- peut prendre en paramètre une
Commandeou unclientId(String) en erreur
- peut prendre en paramètre une
-
NegativeBalanceException- doit prendre en paramètre un
Clienten erreur
- doit prendre en paramètre un
-
-
Dans chaque exception concrète, appelez le constructeur de la classe mère (
super(...)) avec un message explicite et l’objet en erreur.
Service métier et itérateurs¶
Créez une classe OrderService qui contiendra les méthodes statiques suivantes :
-
validerFileCommandes(LinkedList<Commande> fileCommandes)- Utilise un
Iterator<Commande>pour parcourir la liste. - Si une commande a
quantite <= 0ouprixUnitaire <= 0, lance uneInvalidOrderException. - Si la couleur de la commande est
Color.BLACK, lance également uneInvalidOrderException(couleur interdite).
- Utilise un
-
traiterProchaineCommande(LinkedList<Commande> fileCommandes, HashMap<String, Client> clients)- Utilise un
Iterator<Commande>pour récupérer et retirer la première commande de la liste. - Valide la commande (quantité, prix, couleur) ; si invalide →
InvalidOrderException. - Recherche le
Clientcorrespondant viaclients.get(cmd.getClientId());
si le client n’existe pas →UnknownClientException. - Met à jour le solde du client :
solde += quantite * prixUnitaire.
- Utilise un
-
supprimerCommandesInvalides(LinkedList<Commande> fileCommandes)- Parcourt la liste avec un
Iterator<Commande>. - Supprime (
iterator.remove()) les commandes invalides (quantité ou prix ≤ 0). - Si au moins une commande invalide a été supprimée, lance une
InvalidOrderExceptioncontenant la dernière commande invalide supprimée.
- Parcourt la liste avec un
-
appliquerRemise(HashMap<String, Client> clients, double seuil, double remisePourcent)- Parcourt la
HashMapà l’aide d’unIterator<Map.Entry<String, Client>>ou d’unIterator<Client>. - Pour chaque client dont le solde est ≥
seuil, applique une remise deremisePourcent% :
nouveauSolde = solde * (1 - remisePourcent / 100) - Si le nouveau solde devient négatif, lance une
NegativeBalanceExceptionavec le client en erreur.
- Parcourt la
-
trierCommandesParCouleur(LinkedList<Commande> commandes)- Trie la liste de commandes selon la couleur, avec l’ordre :
- Noir > Rouge > Bleu > Jaune
- Utilise un
Comparator<Commande>dédié.
- Trie la liste de commandes selon la couleur, avec l’ordre :
Comparator pour trier les commandes par couleur¶
- Créez une classe
CommandeColorComparatorqui implémenteComparator<Commande>. - Implémentez la méthode
compare(Commande c1, Commande c2)en utilisant une méthode internegetColorRank(Color color)qui renvoie un entier selon la priorité :Color.BLACK→ 4Color.RED→ 3Color.BLUE→ 2Color.YELLOW→ 1- autres couleurs → 0
- Intégrez ce comparateur dans
OrderService.trierCommandesParCouleur.
Programme de test (Main)¶
Créez une classe Main qui :
- Initialise quelques
Clientdans uneHashMap<String, Client>; - Initialise quelques
Commandedans uneLinkedList<Commande>avec différentes couleurs (Color.RED,Color.BLUE,Color.BLACK,Color.YELLOW) ; - Appelle les méthodes de
OrderServicedans des blocstry/catch:validerFileCommandes(...)traiterProchaineCommande(...)appliquerRemise(...)trierCommandesParCouleur(...)
- Affiche les résultats et les erreurs en affichant également
getObjectInError()pour mieux comprendre l’objet en cause.
Diagramme de classes (PlantUML)¶
Vous pouvez utiliser ce diagramme pour visualiser les relations entre les classes :