Table of Contents
Classes : modélisation et codage
Objectif : Faire un lien direct entre la modélisation des classes et les codes correspondants.
Classe : Code et modélisation
Classe ''TailleHaie'' (10mn)
Un taille haie est caractérisé par sa cadence de coupe, typiquement 4500 coupes/minute.
- switchOn()+: méthode qui allume l’outil et fixe la cadence à 4500.
- switchOff()+: méthode qui éteint l’outil et fixe la cadence à 0.
- Dessiner la représentation UML de cette classe.
- Générer ou écrivez le code java correspondant à cette classe1). On prévoira un constructeur qui initialisera le tailleHaie dans l’état éteint, avec une cadence de 0. Les exceptions levées dans le corps des méthodes générées permettent de signaler les méthodes encore non implémentées. Vous devez retirer les levées d'exception en implémentant les méthodes.
- On veut pouvoir connaître la cadence du
TailleHaie
. - Tester votre code. Si vous n'avez pas encore vu la notion de Test en java vous pouvez mettre vos tests dans une classe dédiée comportant un
main
et votre test peut ressembler à ce qui suit.
public class TestOutils { public static void main(String[] args) { TailleHaie monTailleHaie = new TailleHaie(); System.out.println("Taille Haie crée : " + monTailleHaie); System.out.println("==> Test init : " + (monTailleHaie.getCadence() == 0) ); monTailleHaie.switchOn(); System.out.println("Cadence du Taille Haie en fonctionnement : " + monTailleHaie.getCadence()); System.out.println("==> Test fonctionnement : " + (monTailleHaie.getCadence() == 4500) ); monTailleHaie.switchOff(); System.out.println("Cadence du Taille Haie à l'arret : " + monTailleHaie.getCadence()); System.out.println("==> Test Arret : " + (monTailleHaie.getCadence() == 0) ); } }
Classe ''Tondeuse'' (5mn)
Sur le même modèle, une tondeuse est caractérisée par la vitesse de rotation de sa lame, typiquement 1000 Tour/minute. On prévoira
- switchOn()+: méthode qui allume l’outil et fixe la cadence à 1000.
- switchOff()+: méthode qui éteint l’outil et fixe la cadence à 0.
- Dessiner la représentation UML de cette classe et continuez comme précédemment.
- Que constatez-vous? Quels sont les éléments communs? Ne pourrait-on pas “partager” des informations?
- Ecrivez vos tests dans la même classe que précédemment et attention ils doivent tous continuer à fonctionner. Vous pouvez par exemple ajouter les lignes suivantes.
System.out.println("=========================TESTS TONDEUSE==================="); Tondeuse maTondeuse = new Tondeuse(); System.out.println("Tondeuse crée : " + maTondeuse); System.out.println("==> Test init : " + (maTondeuse.getCadence() == 0) ); maTondeuse.switchOn(); System.out.println("Cadence de Tondeuse en fonctionnement : " + maTondeuse.getCadence()); System.out.println("==> Test fonctionnement : " + (maTondeuse.getCadence() == 1000) ); maTondeuse.switchOff(); System.out.println("Cadence de Tondeuse à l'arret : " + maTondeuse.getCadence()); System.out.println("==> Test Arret : " + (maTondeuse.getCadence() == 0) );
Mise en facteur et Spécialisation : OutilElectrique (15mn)
- Mettez en facteur les éléments qui peuvent l'être dans la modélisation UML en ajoutant une classe
OutilElectrique
. - En fonction de vos choix, déterminer s'il s'agit d'une classe abstraite ou non. 3)
- Modifier la modélisation et les codes en conséquences.
- Réécrire en conséquence les classes
TailleHaie
etTondeuse
. - Relancer vos tests sans les modifier! Ils doivent toujours fonctionner!
Spécialisation et Enuméré (10 mn)
La tondeuse a plusieurs vitesses de traction possibles : arret, lent, moyen ou rapide. Il est possible de changer la vitesse de la tondeuse. Au démarrage, sa vitesse est toujours à moyenne. Lorsque l'on éteint la tondeuse sa vitesse passe à arrêt.
- Modifier le modèle de la classe Tondeuse pour tenir compte de cette nouvelle information. Les Vitesses sont un énuméré. Créer une enumeration dans le modèle, lui ajouter les
enumerate literal
arret, … - Générer vos codes.
- Ecrivez les codes correspondant. Pour accéder dans votre code par exemple à l'énuméré “arret”, vous écrirez par exemple,
v = Vitesse.arret;
- Etendez les tests précédents pour vérifier que vos codes font bien ce qui est attendu. Vous devez lancer TOUS les tests. Vous constatez à ce stade que la vérification de la réussite ou non des tests est plus “longue”, c'est pourquoi aujourd'hui on utilise des méthodes de tests qui systématise les vérifications et signalent spécifiquement les erreurs.
System.out.println("=========================TESTS TONDEUSE ETENDU ==================="); //La tondeuse a plusieurs vitesses de traction possibles : arret, lent, moyenne ou rapide. maTondeuse.switchOff(); System.out.println("Vitesse de Tondeuse à l'arret attendue "+ Vitesse.arret +"==>" + maTondeuse.getVitesse()); //Il est possible de changer la vitesse de la tondeuse. maTondeuse.switchOn(); System.out.println("Vitesse de Tondeuse au démarrage attendue "+ Vitesse.moyen +"==>" + maTondeuse.getVitesse()); maTondeuse.setVitesse(Vitesse.rapide); System.out.println("Vitesse de Tondeuse attendue "+ Vitesse.rapide +"==>" + maTondeuse.getVitesse()); //Au démarrage, sa vitesse est toujours à l'arrêt. Lorsque l'on éteint la tondeuse sa vitesse passe à arrêt. maTondeuse.switchOff(); System.out.println("Vitesse de Tondeuse à l'arret attendue "+ Vitesse.arret +"==>" + maTondeuse.getVitesse()); maTondeuse.setVitesse(Vitesse.rapide); maTondeuse.switchOn(); System.out.println("Vitesse de Tondeuse au démarrage attendue (alors que on a modifie sa vitesse "+ Vitesse.moyen +"==>" + maTondeuse.getVitesse()); maTondeuse.switchOff();
Utiliser une classe (25mn)
Il s'agit de développer à présent un robot “Jardinier”. On peut donner un outil à un jardinier, lui demander de travailler ou d'arrêter de travailler.
- Nos robots ont tous un nom qui leur est donné à la création. Il n'est pas possible de le modifier par la suite.
- Si on donne un outil au jardinier alors qu'il en a déjà un, il prend le nouvel outil et relâche l'ancien outil.
- Si on lui demande de travailler sans lui avoir donné d'outil, il répond par “Donnez-moi un outil!”. S'il a un outil en main, il le démarre et répond par “Je démarre ” suivi de la description de l'outil démarré.
- Si on lui demande d'arrêter de travailler, il répond par “Merci, la journée a été dure!”. S'il a un outil en main, il l'arrête et le “lâche”.
- Donner une représentation UML du problème du
Jardinier
. - Générer les codes correspondants. Si les résultas ne vous satisfont pas, corriger votre modèle. En particulier, vous devrez utiliser la navigation entre les classes.
- Compléter les codes correspondants.
- Eventuellement par reverse-engineering, reconstruisez votre modèle.
- Evidemment tester votre programme. Voici un exemple de trace possible à l'exécution des tests.
=========================TESTS Jardinier =================== Bonjour Je suis R2-D2 : je n'ai pas d'outil Début du travail pour le jardinier : Donnez-moi un outil! On lui a donné la tondeuse : Je suis R2-D2, je tiens : Tondeuse [vitesse=arret, cadence=0] Debut du travail pour le jardinier : Je démarre : Tondeuse [vitesse=moyen, cadence=1000] Arret du travail pour le jardinier : Merci, la journée a été dure! La tondeuse doit être à l'arrêt : Tondeuse [vitesse=arret, cadence=0] Le jardinier n'a plus d'outil : Je suis R2-D2 : je n'ai pas d'outil
- Et si nous voulions représenter plusieurs sortes de Robot, que ferions-nous? Et si tout robot était un Outil Electrique ?
Devoir facultatif pendant les vacances
A présent notre robot peut utiliser un véhicule.
Un véhicule
a une position
(X, Y en entier).
Il peut se déplacer sur l'axe des x ou des y.
Il peut être initialisé, ce qui le place en position (0,0).
Un charriot
est un véhicule qui se déplace d'un delta de 10 à chaque demande de déplacement : s'il est en (0,0), déplacer le chariot sur X l'amène en (10,0), puis en déplacement sur XY l'amène en (20,10).
Une fusee
est un véhicule qui se déplace d'un delta de 100 à chaque demande de déplacement.
On peut donner un véhicule au robot. Il l'initialise quand il le reçoit. On peut demander au robot de se déplacer selon un schéma donné : “XYXX”. Le robot déplacera alors le véhicule de X puis de Y puis de X puis de X.
Quand le robot arrête de travailler il ramène le véhicule en position initiale.
Voici un exemple de trace obtenue en testant ce qui est demandé.
=========================TESTS Jardinier & Vehicule =================== ===================TESTS Vehicules =================== Chariot => Vehicule [position=[0,0]] Avance sur X : Chariot => Vehicule [position=[10,0]] Avance sur Y : Chariot => Vehicule [position=[10,10]] Fusee => Vehicule [position=[0,0]] Avance sur X : Fusee => Vehicule [position=[1000,0]] Avance sur Y : Fusee => Vehicule [position=[1000,1000]] ===================TESTS jardinier & Vehicules =================== Pas de vehicule : Je suis R2-D2 : je n'ai pas d'outil je n'ai pas de vehicule Avec un charriot : Je suis R2-D2 : je n'ai pas d'outil , j'ai ce vehicule Chariot => Vehicule [position=[0,0]] Deplacement du jardinier en XYX, on attend (0,0),(10,0) (10,10) (20,10) [0,0] [10,0] [10,10] [20,10] Debut du travail pour le jardinier : Je démarre : Tondeuse [vitesse=moyen, cadence=1000] Position du charriot attendue en (0,0): [0,0] Deplacement du jardinier en YYX on l'attend en (10,20) avec la tondeuse Je suis R2-D2, je tiens : Tondeuse [vitesse=moyen, cadence=1000], j'ai ce vehicule Chariot => Vehicule [position=[10,20]] Arret du travail pour le jardinier : Merci, la journée a été dure! Je suis R2-D2 : je n'ai pas d'outil , j'ai ce vehicule Chariot => Vehicule [position=[0,0]]
TD Noté facultatif: remis à votre encadreur par mail ayant pour sujet4) “[S2] modeles : Groupe : Membres du binôme” avec en attachement un document contenant vos diagrammes et votre code. Le fichier des diagrammes sera nommé TP_N_NumeroduTP_NomEtudiant1_NomEtudiant2 sans compression : 8 mai 2015 23h59
Reverse et agrégation
Reverse : La classe ''Point''
- Etant données les spécifications suivantes en omettant tous les accesseurs dessiner la classe
Point
correspondante. Vous pouvez aussi procéder par reverse engineering (classe Point)
Utilisation d'une classe : Chemin et Trajet
- On définit un chemin comme ayant un point de départ, un point d'arrivée et un intitulé.
- Un point peut appartenir à plusieurs chemins.
- On veut connaitre la distance que représente un chemin (cf. si besoin Calcul de distance)
- Un trajet est une suite ordonnée de chemins tels que le point de départ d'un chemin est le point d'arrivée du chemin suivant.
- Modéliser les concepts de Chemin et de Trajet
- Codez-les.
La classe ''Polygone''
Un polygone est composé d'un ensemble de points.
- Modéliser la classe
Polygone
en UML. - Il est possible de créer un polygone comme un ensemble vide de Points ou en passant un tableau de Points
- Générer le code. Quelle structure de données utilisez vous? Regarder le code généré … Evidemment il n'est pas possible de modifier la classe Point fournie par java. Vous ne devez donc pas la générer.
- Tester votre classe, par exemple en ajoutant une méthode
ToString
La classe ''Polygone'': V2
- Pour remplir le tableau de points, on a besoin d'une première méthode
addPoint
qui ajoutera un point à ceux déjà présents.
- Etendez votre modélisation de la classe
Polygone
en UML. - Générer le code.
- Tester votre classe.
- Que retenez-vous de cet exercice? Quand se fait le choix de la structure?
private
et donc ne rien dire, soit le mettre en protected
, soit mieux utiliser les accesseurs.