S2T
- TDs
Objectifs :
Puis après avoir relancé Eclipse, sous New > Other > Object Aid..> Classes …. ensuite vous posé simplement les classes à visualiser sur votre diagramme.
Le concept d'“Engin” modélisé ici sous la forme d'une classe sera représenté par le code suivant :
En Java
public class Engine { }
En C#
public class Engine { };
En PHP
<?php public class Engine { } ?>
Engine defiance = new Engine();
On crée un autre engin par :
Engine xwing = new Engine();
Le concept d'“Engin” modélisé ici sous la forme d'une classe contient à présent un attribut qui permet d'exprimer la puissance. Il sera représenté par le code suivant :
Code généré en Java
public class Engine { private int power; }
Code généré en C#
public class Engine { private int power; }
Code généré en php
<?php class Engine { /** * @AttributeType int */ private $_power; } ?>
Pour pouvoir accéder à cet attribut nous allons à présent dans le code définir des accesseurs.
Le code de la classe Engin en java devient :
public class Engine { private int power; //Accesseur en lecture : on lit la valeur de l'attribut power public int getPower() { return power; } //Accesseur en écriture : on modifie la valeur de l'attribut power (noté this.power) avec la valeur en parametre power public void setPower(int power) { this.power = power; } }
A partir de ce code, nous pouvons à présent créer une “instance” de la classe “Engine” et lui affecter une puissance de 2000.
public class TestInMain { public static void main(String[] args) { Engine defiance = new Engine(); //Set Power to 2000 defiance.setPower(2000); //Get power of defiance int defiancePower = defiance.getPower(); //Print Defiance's power System.out.println("Power : " + defiancePower); } }
Code généré en java
public class Engine { private int power; public void stop() { throw new UnsupportedOperationException(); } }
Code généré en php
<?php /** * @access public * @author blay */ class Engine { /** * @AttributeType int */ private $_power; /** * @access public */ public function stop() { // Not yet implemented } } ?>
Une proposition d'implémentation en java pour stop
:
public class Engine { private int power; public void stop() { power = 0; } }
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class EngineTest { @BeforeEach void setUp() throws Exception { //Because you are beginners, we don't use it. // Nevertheless, it would be better. } @Test void testInit() { Engine defiance = new Engine(); assertEquals(0, defiance.getPower()); } @Test void testSetPower() { Engine defiance = new Engine(); defiance.setPower(2000); int defiancePower = defiance.getPower(); assertEquals(2000,defiancePower, "expected power : 2000" ); } @Test void testStop() { Engine defiance = new Engine(); defiance.setPower(2000); assertEquals(2000,defiance.getPower(), "expected power : 2000" ); //Stop the engine defiance defiance.stop(); assertEquals(0,defiance.getPower(), "expected power should be 0" ); //Stop the engine defiance } }
public class TestInMain { public static void main(String[] args) { Engine defiance = new Engine(); //Set Power to 2000 defiance.setPower(2000); //Get power of defiance int defiancePower = defiance.getPower(); //Print Defiance's power : expected 2000 System.out.println("Power : " + defiancePower); //Stop the engine defiance defiance.stop(); //Get power of defiance defiancePower = defiance.getPower(); //Print Defiance's power : expected 0 System.out.println("Power : " + defiancePower); } }
Code java correspondant
public class Engine { private int power; //Association becomes an attribute ; multiplicity * => array or any collections private Pilot[] pilots; // = new Pilot[0]; //array de dimension 1 public int getPower() { return power; } public void setPower(int power) { this.power = power; } public void stop() { power = 0; } }
et une nouvelle classe :
public class Pilot { }
Complétons la classe Engine
pour manipuler les pilotes.
public class Engine { private int power; private Pilot[] pilots = new Pilot[1]; public Pilot[] getPilots() { return pilots; } public void setPilots(Pilot[] pilots) { this.pilots = pilots; } public void addPilotAtRank(Pilot onePilot, int rank) { if (rank < pilots.length & rank >=0 ) this.pilots[rank] = onePilot; //else //too many pilots, do nothing } public int getPower() { return power; } public void setPower(int power) { this.power = power; } public void stop() { power = 0; } }
On ajoute des tests
@Test void testInitPilot() { Engine defiance = new Engine(); assertTrue(defiance.getPilots()!=null); } @Test void testAddPilot() { Engine defiance = new Engine(); //Admiral Nammo Pilot nammo = new Pilot(); defiance.addPilotAtRank(nammo, 0); //Get the pilots of defiance Pilot[] pilots = defiance.getPilots(); assertEquals(nammo, pilots[0]); }
Utilisons notre nouveau code en complétant le main
//Admiral Nammo Pilot nammo = new Pilot(); defiance.addPilotAtRank(nammo, 0); //Get the pilots of defiance Pilot[] ourPilots = defiance.getPilots(); //Print the first pilot (only object reference) System.out.println("Pilot : " + ourPilots[0]); }
On peut naviguer à présent du pilote à l'engin et inversement.
La classe Pilot
générée est donc modifiée.
Remarquez que la multiplicité de 1 cette fois-ci crée un attribut simple de type Engine
public class Pilot { private Engine drivenEngine; }
Nous complétons le code pour pouvoir accéder et modifier le moteur associé au pilot.
public class Pilot { private Engine drivenEngine; public Engine getDrivenEngine() { return drivenEngine; } public void setDrivenEngine(Engine newEngine) { this.drivenEngine = newEngine; } }
Pour tester nous ajoutons à présent l'engin defiance comme celui conduit par l'amiral nammo
nammo.setDrivenEngine(defiance);
Nous décidons à présent que l'on ne veut pas que n'importe qui affecte un engin à un pilote (on passe la méthode setDrivenEngine en Protected) et que lorsque l'on affecte un pilote à un engin alors il en devient pilote. Nous modifions nos codes.
package tdS2; public class Engine { private int power; private Pilot[] pilots = new Pilot[1]; public Pilot[] getPilots() { return pilots; } public void setPilots(Pilot[] pilots) { this.pilots = pilots; } public void addPilotAtRank(Pilot onePilot, int rank) { if (rank < pilots.length & rank >=0 ) this.pilots[rank] = onePilot; onePilot.setDrivenEngine(this); //else //too many pilots, do nothing } public int getPower() { return power; } public void setPower(int power) { this.power = power; } public void stop() { power = 0; } }
public class Pilot { private Engine drivenEngine; public Engine getDrivenEngine() { return drivenEngine; } protected void setDrivenEngine(Engine newEngine) { this.drivenEngine = newEngine; } }
Nous testons ce code.
@Test void testSetDriver() { Engine defiance = new Engine(); Pilot nammo = new Pilot(); defiance.addPilotAtRank(nammo, 0); assertEquals(defiance, nammo.getDrivenEngine(),"The pilot of an engine drives it"); }
Nous utilisons ce code.
Engine X100rocketBoosters = new Engine(); Pilot r2D2 = new Pilot(); X100rocketBoosters.addPilotAtRank(r2D2, 0); //expected one pilot pilots = X100rocketBoosters.getPilots(); System.out.println("expected one pilot" + pilots); Engine engine4R2D2 = r2D2.getDrivenEngine(); System.out.println("expected one engine" + engine4R2D2);
Classe Weapon
public class Weapon { private Jedi belongsTo ; public Jedi getBelongsTo() { return belongsTo; } public void setBelongsTo(Jedi owner) { this.belongsTo = owner; } }
Classe MeleeWeapon “hérite de”/“Spécialise” Weapon
public class MeleeWeapon extends Weapon{ }
Classe Lightsaber “hérite de”/“Spécialise” MeleeWeapon
public class Lightsaber extends MeleeWeapon{ }
Je peux accéder au propriétaire d'une arme quelconque.
Lightsaber excaLight = new Lightsaber(); Jedi Revan = new Jedi(); excaLight.setBelongsTo(Revan);
Armada
d'attaquer, quelle méthode devez-vous ajouter?public void attack() { //All engines must attack for (Engine e : engines) //e is one Engine in engines e.attack(); }
Armada
, de lui associer 10 Engine
et de déclencher une attaqueArmada sithArmada = new Armada(); //Array of 10 Engines Engine[] machines = new Engine[10]; //Initialise with 10 Engine for(int i=0; i<10; i++){ machines[i] = new Engine(); } sithArmada.setEngines(machines); sithArmada.attack();
public class Avatar { private String name; private Position pos; private Weapon[] weapons; public Position moveDelta(int x, int y) { pos.addX(x); pos.addY(y); return pos; } } public class Submarine extends Engine{ private int capacity; private DecompressionChamber decompressionChamber; }
Voici un diagramme de séquence, complétez le diagramme de classe pour tenir compte des nouveaux éléments.
Pour vous aider :
Compléter les diagrammes de classes et séquence pour introduire :