User Tools

Site Tools


2013_2014:s2:td:corrections:td_classes-code

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
2013_2014:s2:td:corrections:td_classes-code [2014/02/14 23:07]
blay [Classe : Code et modélisation]
2013_2014:s2:td:corrections:td_classes-code [2014/03/17 17:59]
blay [La classe ''Polygone'': V2]
Line 1: Line 1:
 ====== Corrections : modélisation et codage ====== ====== Corrections : modélisation et codage ======
  
-===== Exercices d'​entrainement ===== 
  
-==== Classe : Code et modélisation ==== 
  
-=== Classe ''​TailleHaie''​ ===+===== Classe : Code et modélisation ===== 
 + 
 +==== Classe ''​TailleHaie'' ​====
  
 Un exemple initial de code généré à partir du diagramme ci-après et complété par quelques lignes de code. Un exemple initial de code généré à partir du diagramme ci-après et complété par quelques lignes de code.
Line 46: Line 46:
  
  
-=== Classe ''​Tondeuse''​ ===+==== Classe ''​Tondeuse'' ​====
  
 <code java> <code java>
Line 83: Line 83:
  
  
-=== Mise en facteur : OutilElectrique ​  ===+==== Mise en facteur : OutilElectrique ​  ====
    
 Voici le code et le modèle en concordance. Il est possible de ne remonter que des méthodes abstraites si vous ne connaissez pas "​protected"​. Voici le code et le modèle en concordance. Il est possible de ne remonter que des méthodes abstraites si vous ne connaissez pas "​protected"​.
Line 143: Line 143:
 </​code>​ </​code>​
   ​   ​
-=== Tester ===+==== Tester ​====
  
 <​code>​ <​code>​
Line 200: Line 200:
 </​code>​ </​code>​
  
-=== Utiliser ​ une classe ===+==== Utiliser ​ une classe ===
 + 
 +Diagramme UML avant génération du code 
 + 
 +{{ :​2013_2014:​s2:​td:​corrections:​jardinier.png?​nolink&​200 |}} 
 + 
 +Puis on génére et compléte la classe ''​jardinier''​ avec son test 
 + 
 +<code java> 
 +package outilsPK; 
 + 
 +public class Jardinier { 
 + 
 + protected OutilElectrique getOutil() { 
 + return outil; 
 +
 + 
 + 
 + protected String getPrenom() { 
 + return prenom; 
 +
 + 
 + 
 + private OutilElectrique outil; 
 + private String prenom; 
 + 
 + /** 
 + *  
 + * @param outil 
 + */ 
 + public void startTravail(OutilElectrique outil) { 
 + if (this.outil != null) 
 + this.outil.switchOff();​ 
 + this.outil = outil; 
 + outil.switchOn();​ 
 +
 + 
 + public void stopTravail() { 
 + outil.switchOff();​ 
 + outil = null; 
 +
 + 
 + @Override 
 + public String toString() { 
 + return "​Jardinier [outil="​ + outil + ", prenom="​ + prenom + "​]";​ 
 +
 + 
 + public Jardinier(String prenom) { 
 + this.prenom = prenom; 
 +
 + 
 +  
 +  
 +
 +</​code>​ 
 + 
 +<code java> 
 + 
 +package outilsPK; 
 + 
 +import static org.junit.Assert.*;​ 
 + 
 +package outilsPK; 
 + 
 +import static org.junit.Assert.*;​ 
 + 
 +import org.junit.Before;​ 
 +import org.junit.Test;​ 
 + 
 +public class JardinierTest { 
 + private TailleHaie th; 
 + private Tondeuse td; 
 + private Jardinier j;  
 +  
 + @Before 
 + public void setUp() throws Exception { 
 + th = new TailleHaie();​ 
 + td = new Tondeuse();​ 
 + j = new Jardinier("​Gaston"​);​ 
 +    } 
 +  
 +  
 + //A revoir car trop de tests en un. 
 + @Test  
 + public void testJardinerTravaille() { 
 + assertEquals(null,​ 
 +                j.getOutil());​ 
 + j.startTravail(th);​ 
 + assertEquals(th,​ 
 +                j.getOutil());​ 
 + // le tailleHaie a été démarré 
 + assertEquals(4500,​ th.getCadence());​ 
 +  
 + j.startTravail(td);​ 
 + // On a bien éteint le tailleHaie 
 + assertEquals(0,​ th.getCadence());​ 
 + assertEquals(td,​ 
 +                j.getOutil());​ 
 +  
 + j.stopTravail();​ 
 + assertEquals(null,​ 
 +                j.getOutil());​ 
 + assertEquals(0,​ 
 +                td.getCadence());​ 
 +
 +  
 + @Test 
 + public void testPrenom() { 
 + assertEquals("​Gaston",​ 
 +                j.getPrenom());​ 
 +
 + 
 +
 +</​code>​ 
 + 
 + 
 +Revoici le diagramme UML après reverse... 
 + 
 + 
 +{{ :​2013_2014:​s2:​td:​corrections:​jardinierv2.png?​nolink&​200 |}}
  
-Il  s’agit ​ de  créer ​ une  représentation ​ UML  d’une ​ classe ​ ''​Jardinier'' ​ dont  les  attributs ​ seront ​ le  prénom  ​ 
-du  jardinier ​ et  l’outil ​ démarrable ​ qu’il ​ doit  utiliser ​ pour  travailler ​ (un  taille haie  ou  une  tondeuse). ​ Au  moment ​  ​de ​  ​sa ​  ​création, ​  ​on ​  ​suppose ​  ​que ​ le  jardiner ​  ​n’a ​  ​pas ​  ​d’outils ​ en  main.   ​L’outil ​ à   ​utiliser ​  ​sera ​ transmis ​ comme  argument ​ à une méthode ''​startTravail''​(…). ​ Prévoyez ​ également ​ une  méthode ​ ''​stopTravail''​(…).  ​ 
-  - Complétez ​ la  représentation ​ UML  des  liens  entre  les  classes. 
-  - 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. 
-  - Ecrire un  petit  programme ​ principal ​ qui  teste  votre  classe.  ​ 
    
 +==== Gérer la vitesse : spécialisation de classes et enuméré ====
 +On ajoute la vitesse comme un enumerate dans le modèle et les méthodes demandées puis on met à jour les codes.
  
-==== Reverse et agrégation ====+<code java> 
 +package outilsPK;
  
-=== Reverse : La classe ''​Point''​ ===+public enum Vitesse { 
 + arret, lent, moyen, rapide 
 +
 +</​code>​
  
-  - Etant données les [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​awt/​Point.html|spécifications suivantes]] ​ +<​code ​java> 
-en omettant tous les accesseurs dessiner la classe ''​Point''​ correspondante.+package outilsPK;
  
 +public class Tondeuse extends OutilElectrique {
  
-=== La classe ''​Polygone''​ ===+ private Vitesse vitesse ; 
 +  
 + protected Vitesse getVitesse() { 
 + return vitesse; 
 +
 + 
 + public void switchOn() { 
 + setCadence(1000);​ 
 +
 + 
 + public Tondeuse() { 
 + setCadence(0);​ 
 + vitesse = Vitesse.arret;​ 
 +
 + 
 + public void setVitesse(Vitesse v){ 
 + vitesse = v; 
 +
 +  
 + 
 + public void switchOff() { 
 + super.switchOff();​ 
 + vitesse = Vitesse.arret;​ 
 +
 +  
 +  
 +
 +</​code>​ 
 + 
 + 
 +<code java> 
 +package outilsPK; 
 +import static org.junit.Assert.*;​ 
 +import org.junit.Before;​ 
 +import org.junit.Test;​ 
 + 
 +public class OutilElectriqueTest { 
 + 
 + private TailleHaie th; 
 + private Tondeuse td; 
 + 
 + @Before 
 + public void setUp() throws Exception { 
 + th = new TailleHaie();​ 
 + td = new Tondeuse();​ 
 +    } 
 +  
 + @Test 
 + public void testSwitchOnTailleHaie() { 
 + th.switchOn();​ 
 + assertEquals(4500,​ 
 +                th.getCadence());​ 
 +
 +  
 + @Test 
 + public void testSwitchOnTondeuse() { 
 + td.switchOn();​ 
 + assertEquals(1000,​ 
 +                td.getCadence());​ 
 +
 + @Test 
 + public void testVitesseTondeuse() { 
 + td.switchOn();​ 
 + td.setVitesse(Vitesse.moyen);​ 
 + assertEquals(Vitesse.moyen,​ 
 +                td.getVitesse());​ 
 + td.switchOff();​ 
 + assertEquals(Vitesse.arret,​ 
 +                td.getVitesse());​ 
 +
 +  
 +  
 + @Test 
 + public void testSwitchOff() { 
 + th.switchOff();​td.switchOff();​ 
 + assertEquals(0,​ 
 +                th.getCadence());​ 
 + assertEquals(0,​ 
 +                td.getCadence());​ 
 +
 + 
 + @Test 
 + public void testSwitchOff_On_Off() { 
 + testSwitchOff();​ 
 + testSwitchOnTondeuse();​ 
 + testSwitchOnTailleHaie();​ 
 + testSwitchOff();​ 
 +
 +
 +</​code>​ 
 +===== Reverse et agrégation ===== 
 + 
 +==== Reverse : La classe ''​Point''​ ==== 
 + 
 +{{ :​2013_2014:​s2:​td:​corrections:​polygonev0.png?​nolink&​400 |}} 
 + 
 + 
 +==== La classe ​ Chemin ==== 
 +<code java> 
 +package trajetPK; 
 + 
 +import java.awt.*;​ 
 + 
 +public class Chemin { 
 + 
 + Point depart; 
 + Point arrivee; 
 + 
 + /** 
 + *  
 + * @param depart 
 + * @param arrivee 
 + */ 
 + public Chemin(Point depart, Point arrivee) { 
 + this.depart = depart; 
 + this.arrivee = arrivee; 
 +
 + public double distance() { 
 + int y = arrivee.y - depart.y; 
 + int x = arrivee.x - depart.x; 
 + return Math.sqrt( y*y + x*x); 
 +
 + @Override 
 + public String toString() { 
 + return "​Chemin [depart="​ + depart + ", arrivee="​ + arrivee + "​]";​ 
 +
 +  
 +  
 +
 +</​code>​ 
 + 
 +<code java> 
 +package trajetPK; 
 + 
 +import static org.junit.Assert.*;​ 
 + 
 +import java.awt.Point;​ 
 + 
 +import org.junit.Before;​ 
 +import org.junit.Test;​ 
 + 
 + 
 +public class CheminTest { 
 + private static final double DELTA = 1e-15; 
 + Chemin c ; 
 + 
 + @Before 
 + public void setUp() throws Exception { 
 + c = new Chemin(new Point(-7,​-2),​ new Point(5,​3));​ 
 +    } 
 +  
 +  
 + @Test 
 + public void testDistance() { 
 + System.out.println(c.distance());​ 
 + assertEquals(13.0,​c.distance(),​DELTA);​  
 +
 + 
 +
 +</​code>​ 
 +==== La classe ​ Trajet ==== 
 + 
 +<code java> 
 +package trajetPK; 
 +public class MauvaisTrajetException extends Exception { 
 +
 +</​code>​ 
 + 
 +<code java> 
 +package trajetPK; 
 + 
 +import java.util.*;​ 
 + 
 +public class Trajet { 
 + 
 + ArrayList<​Chemin>​ chemins; 
 + 
 + public Trajet(ArrayList<​Chemin>​ chemins) throws MauvaisTrajetException { 
 + super();​ 
 + this.chemins = chemins; 
 + Iterator<​Chemin>​ it = chemins.iterator();​ 
 + if (!(it.hasNext())) 
 + throw new MauvaisTrajetException();​ 
 + Chemin courant = it.next();​ 
 + Chemin suivant; 
 + while (it.hasNext()) { 
 + suivant = it.next();​ 
 + if (courant.arrivee.equals(suivant.depart)) 
 + courant = suivant; 
 + else  
 + throw new MauvaisTrajetException();​ 
 +
 +
 + 
 + @Override 
 + public String toString() { 
 + return "​Trajet [chemins="​ + chemins + "​]";​ 
 +
 +
 +</​code>​ 
 + 
 +<code java> 
 +package trajetPK; 
 + 
 +import static org.junit.Assert.*;​ 
 + 
 +import java.awt.Point;​ 
 +import java.util.ArrayList;​ 
 +import java.util.Arrays;​ 
 + 
 +import org.junit.Before;​ 
 +import org.junit.Test;​ 
 + 
 +public class TrajetTest { 
 + 
 + private static final double DELTA = 1e-15; 
 + Trajet trValide ; 
 + Trajet trUn ; 
 + Trajet trInvalide ; 
 + Chemin c1 ; 
 + Chemin c2 ; 
 + Chemin c3; 
 + @Before 
 + public void setUp() throws Exception { 
 + c1 = new Chemin(new Point(-7,​-2),​ new Point(5,3) ); 
 + c2 = new Chemin(new Point(5,3), new Point(7,5) ); 
 + c3 = new Chemin(new Point(7,5) , new Point(9,11) ); 
 +    } 
 +  
 +  
 + @Test 
 + public void testCreerValide() throws MauvaisTrajetException { 
 + trValide = new Trajet (  
 + new ArrayList<​Chemin>​(Arrays.asList(new Chemin[]{ c1, c2, c3 }))); 
 + System.out.println(trValide);​ 
 +
 + @Test 
 + public void testUn() throws MauvaisTrajetException { 
 + trUn = new Trajet (  
 + new ArrayList<​Chemin>​(Arrays.asList(new Chemin[]{ c1}))); 
 +
 + @Test(expected = MauvaisTrajetException.class) ​  
 + public void testInvalide() throws MauvaisTrajetException { 
 +   trInvalide = new Trajet (  
 + new ArrayList<​Chemin>​(Arrays.asList(new Chemin[]{ c1, c3 }))); 
 +
 +</​code>​ 
 + 
 + 
 + 
 +{{ :​2013_2014:​s2:​td:​corrections:​trajet.png?​nolink&​500 |}} 
 +==== La classe ''​Polygone'' ​====
  
 Un polygone est composé d'un ensemble de points. Un polygone est composé d'un ensemble de points.
  
-  * Il est possible de créer un polygone comme un ensemble vide de Points ou en passant un tableau de Points+<code java> 
 +package geometrie;
  
-  - Modéliser la classe ''​Polygone''​ en UML.  +import java.util.ArrayList;​ 
-  - Générer le codeQuelle structure de données utilisez vous? Regarder le code généré ​... +import java.util.Arrays; 
-  ​- Tester votre classe, par exemple en ajoutant une méthode ''​ToString''​+import java.awt.Point; 
 + 
 +public class Polygone { 
 + public ArrayList<​Point>​ _points = new ArrayList<​Point>​();​ 
 + 
 + public Polygone() { 
 +
 + 
 + public Polygone(Point[] points) { 
 + _points = new ArrayList<​Point>​(Arrays.asList(points));​ 
 +
 + 
 + @Override 
 + public String toString() { 
 + String pointsAsString =" "; 
 + for(Point p : _points) 
 +    ​pointsAsString += p + " ; "; 
 + return "​Polygone [_points="​ + pointsAsString + "​]";​ 
 +
 + 
 + /** 
 +  *  
 + * @param p 
 + */ 
 + public void addPoint(Point p) { 
 + _points.add(p);​ 
 +
 +  
 +  
 +  
 +
 +</​code>​
  
-=== La classe ''​Polygone'': ​ V2 === +==== La classe ''​Polygone'': ​ V2 ==== 
-  * Pour   ​remplir ​ le   ​tableau ​ de  points, ​ on  a besoin d'​une ​ première ​ méthode ​ ''​addPoint'' ​ qui  ajoutera ​ un   +  * 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.  ​
-point  à  ceux  déjà ​ présents.  ​+
  
   - Etendez votre modélisation de la classe ''​Polygone''​ en UML.    - Etendez votre modélisation de la classe ''​Polygone''​ en UML. 
2013_2014/s2/td/corrections/td_classes-code.txt · Last modified: 2014/03/17 18:04 by blay