2013_2014:s2:td:corrections:td_classes-code
This is an old revision of the document!
Table of Contents
Corrections : modélisation et codage
Exercices d'entrainement
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.
package outilsPK; public class TailleHaie { private int _cadence = 4500; public void switchOn() { _cadence = 4500; } public void switchOff() { _cadence = 0; } //Ajoutée pour accéder à la cadence public int get_cadence() { return _cadence; } //non demandée et ne doit pas être accessible private void set_cadence(int cadence) { this._cadence = cadence; } public TailleHaie(){ _cadence = 0; } }
Classe ''Tondeuse''
package outilsPK; public class Tondeuse { private int _cadence = 4500; public void switchOn() { _cadence = 1000; } public void switchOff() { _cadence = 0; } /** * non demandée et ne doit pas être accessible */ private void set_cadence(int aCadence) { throw new UnsupportedOperationException(); } public Tondeuse() { throw new UnsupportedOperationException(); } public int getCadence() { return this._cadence; } }
On remarque alors que l'attribut (variable d'instance) cadence
et la méthode switchOff
sont les mêmes dans les deux classes.
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”.
package outilsPK; public abstract class OutilElectrique { private int cadence = 4500; public int get_cadence() { return this.cadence; } public void switchOff() { cadence = 0; } public abstract void switchOn(); protected void setCadence(int cadence){ this.cadence = cadence; } } package outilsPK; public class TailleHaie extends OutilElectrique{ public void switchOn() { this.setCadence(4500); } public TailleHaie(){ this.setCadence(0); } } package outilsPK; public class Tondeuse extends OutilElectrique { public void switchOn() { setCadence(1000); } public Tondeuse() { setCadence(0); } }
Tester
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 testSwitchOff() { th.switchOff();td.switchOff(); assertEquals(0, th.getCadence()); assertEquals(0, td.getCadence()); } @Test public void testSwitchOff_On_Off() { testSwitchOff(); testSwitchOnTondeuse(); testSwitchOnTailleHaie(); testSwitchOff(); } }
Utiliser une classe
Diagramme UML avant génération du code
Puis on génére et compléte la classe jardinier
avec son test
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) { this.outil = outil; } public void stopTravail() { outil = null; } @Override public String toString() { return "Jardinier [outil=" + outil + ", prenom=" + prenom + "]"; } public Jardinier(String prenom) { this.prenom = prenom; } } 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"); } @Test public void testJardinerTravaille() { assertEquals(null, j.getOutil()); j.startTravail(th); assertEquals(th, j.getOutil()); j.startTravail(td); assertEquals(td, j.getOutil()); j.stopTravail(); assertEquals(null, j.getOutil()); } @Test public void testPrenom() { assertEquals("Gaston", j.getPrenom()); } }
Revoici le diagramme UML après reverse…
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.
La classe ''Polygone''
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
- Modéliser la classe
Polygone
en UML. - Générer le code. Quelle structure de données utilisez vous? Regarder le code généré …
- 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. Quelle structure de données utilisez vous? Regarder le code généré …
- Tester votre classe.
- Que retenez-vous de cet exercice? Quand se fait le choix de la structure?
2013_2014/s2/td/corrections/td_classes-code.1392417450.txt.gz · Last modified: 2014/02/14 22:37 by blay