User Tools

Site Tools


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

This is an old revision of the document!


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) {
		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;
	}
 
 
 
}
 
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());
	}
 
}

Revoici le diagramme UML après reverse…

Reverse et agrégation

Reverse : La classe ''Point''

La classe ''Polygone''

Un polygone est composé d'un ensemble de points.

package geometrie;
 
import java.util.ArrayList;
import java.util.Arrays;
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);
	}
 
 
 
}

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.

  1. Etendez votre modélisation de la classe Polygone en UML.
  2. Générer le code. Quelle structure de données utilisez vous? Regarder le code généré …
  3. Tester votre classe.
  4. Que retenez-vous de cet exercice? Quand se fait le choix de la structure?
2013_2014/s2/td/corrections/td_classes-code.1392492798.txt.gz · Last modified: 2014/02/15 20:33 by blay