Upload
vinot-bernard
View
834
Download
0
Embed Size (px)
DESCRIPTION
Un micro projet agilePlan de releaseBacklog2 itérationsRefactoring
Citation preview
La vie d’un mini projet Agile
Le Robot Agile
??? Cahier des charges ???
Faire un jeu, il s’agit d’un robot qui se déplace dans un labyrinthe, il doit ramasser des objets et les rapporter dans la pièce de départ pour gagner. Le robot peut rester bloquer dans une pièce et il ne peut pas porter trop d’objets correspondant à un poids max. Si il est en surcharge, le joueur a perdu.
http://bernard.vinot.net/exo/robot/robotApplet/AppletRobot.html
Le Robot Agile
Initialisation du projetEquipe 2 Dvp + 1 client (25%) + 1 expert JDBC
Une itération = 1 jour (8h)Méthode tendant vers XP
Que faire?• UC-US• Backlog planning de release• Iter1
– Tâches– Modélisation– Tests– Codage– Remaniement– Doc– Demo– Bilan
• Iter2• ……….
Le diagramme des Use Case
BackLog du produit
Les risques?
Release complète livréedans 3 joursPrésence de l’expert JDBC obligatoire J2
Le Robot Agile
Iter1 : Jouer sans persistance
Le Scénario : Jouer
• Deplacer:– Le joueur choisit Nord, Sud, Est ou Ouest. Si possible, le
robot va ds la pièce, sinon un message « pas d’issues »• Prendre un objet
– Le système propose la liste des objets, le joueur en prend un (possibilité de perdre si surcharge – Fin du jeu)
• Deposer un objet– Le système propose la liste des objets, le joueur en
choisit un (possibilité de gagner - Fin du jeu)
I1 : Découpe en tâches
I1 : Modélisation (diag classe)
Discussion avecLe client
I1 : Les IHM
I1 : Configurer Les objets
I1 : Exemple de tests (TR)
• Perdu : surcharge
• Gagné– ………….
Perdu
Fichier de sortie (référence)Faites votre choix :Vous etes dans : Entree et vous …..Vous etes dans : Salon et vous …..Bascule Oui,NonVous etes dans : Salonet vous …..…… nom:Bascule,poids:4000,solideWhisky Oui,Non Perdu
Fichier d’entréeSPOPOEOF
I1 : Deplacer
I1 : Prendre
I1 : Deposer
I1 : Diagramme de classe
I1 : Exemple de test(TU) Junit-Deplacerimport org.junit.Before;import junit.framework.TestCase;
//TestDeplacer.javapublic class TestDeplacer extends TestCase{private Robot r;
@Beforepublic void setUp() throws Exception {
Piece e = new Piece ("entree");Piece s = new Piece ("salon");e.AjouterIssue(PointsCardinaux.sud, s);s.AjouterIssue(PointsCardinaux.nord,e);r = new Robot(e,10 );
}
public void testDeplacerOK(){
try {r.Deplacer(PointsCardinaux.sud);assertTrue ( r.GetPiece().GetNom().equals("salon"));r.Deplacer(PointsCardinaux.nord);assertTrue ( r.GetPiece().GetNom().equals("entree"));
} catch (ExceptionRobot e) {fail();
}}
public void testDeplacerNOK() {
try { r.Deplacer(PointsCardinaux.nord); fail(); } catch (ExceptionRobot e) {assertTrue (e.getMessage().equals("pas d'issues dans cette direction"));}
I1 : Exemple de test(TU-TR) Junit-Gagner
import org.junit.*;import junit.framework.TestCase;
public class TestGagner extends TestCase{private Config c;@Beforepublic void setUp() {
c = new Config();}public void testGagner(){
try{ c.Deplacer(PointsCardinaux.nord); fail();}catch (ExceptionRobot e){}
try{c.Deplacer(PointsCardinaux.sud);c.Deplacer(1);//sudc.Deplacer(3);//ouestc.Prendre("Pastis");………………………….c.Deplacer(1);//sudc.Deplacer(3);//ouestc.Prendre("Gauguin");c.Deplacer(2);//estc.Deplacer(0);//nordc.Deposer("Gauguin");}catch (ExceptionRobot e)
{assertEquals(e.getMessage(),"Bravo!!!!!");}}
I1 : Junit TestSuiteimport junit.framework.Test;import junit.framework.TestSuite;
//AllTests.javapublic class AllTests {
public static Test suite() {TestSuite suite = new TestSuite("Test for default package");//$JUnit-BEGIN$suite.addTestSuite(TestGagner.class);suite.addTestSuite(TestDeplacer.class);//$JUnit-END$return suite;
}
}
I1 : Passer les tests NOK
I1 : Codage
Tests JUNIT
I1 : Tests Finaux
I1 : Documentation Seq
I1 : Documentation : Classe
Remaniement
• Mettre une énumération pour les points cardinaux
• Faire une nouvelle classe conteneur d’objets pour éviter les doublons de code
• Retester
I1 : Nouveau diagramme
Robot<<Singleton>>
-poids: int-poidsMax: int
+Deplacer(pc: PC)+GetObjets(): Array<String>+GetObjetsPiece(): Array<String>+Prendre()+Prendre(nom: String)+Deposer()+Deposer(nom: String)+RafraichirPiece(): String
Piece
-nom: String-Issues: Array< Piece>-origine: Piece
+GetIssue(pc: PC): Piece+GetObjets(): Array<String>+Prendre(nom: String): Objet+Deposer(Objet)+SetIssue(pc: PC, piece: Piece)+DeposeInitiale(objet: Objet)+GetNom(): String
-maPiece
1
ConteneurObjets
-conteneur: Array<Objet>
+Ajouter(objet: Objet)+Retirer(nom: String): Objet+GetNbObjets(): int+GetObjets(): Array<String>
-leSac1
-contient
1
Objet
-nom: String-poids: int-nbObjets: boolean
+GetNom(): String+GetPoids(): int+Afficher(): String+GetNbObjets(): int
PC<<enumeration>>
+Nord+Sud+Est+Ouest
Bouteille
-degre: float-volume: float
+Afficher(): String
Chaise
-solide: boolean
+Afficher(): String
Tableau
-auteur: String
+Afficher(): String
IHMDOS IHMLUXE
Bilan de l’itération 1
• Product backLog estimé à 10 points• Itération estimée à 8H et réalisée
– Choisir des fonctionnalités de l’itération 2• Soit la sérialisation (2 points de plus)
• Velocité = 10 + 2 Iter1
I1 : Demo
Bilan de l’itération
• Qu’est ce qui a bien marché ?• Qu’est ce qui n’a pas marché ?• A-t-on besoin de qq chose ?• Que faut-il ne plus faire ?• Comment peut-on améliorer qq chose ?
?
Binôme-Estimation-TU-DP-Moral-Qualité-Client présent
Applet-Selenium
Le Robot Agile
Iter2 : ConfigurerPrendre en compte les retours utilisateurs et
les bugsPuis replanifier
Le Scénario : Configurer
• Charger une partie à partir d’un nom• Sauvegarder la partie en cours en lui donnant un nom• Fabriquer une nouvelle configuration
– Créer les objets• Tableau (nom, poids, auteur)• Chaise (nom, poids, solide ou non)• Bouteille (nom, poids, degré, volume)
– Créer les pièces et les issues– Ranger les objets dans les pièces– Créer le robot (poidsMax, Piece)
TU-Ga Perdu
I2 : Découpe en tâches
• IHM pour la configuration (3H)• Schéma de la base (1H)• Conversion des objets en base avec l’expert
(JDBC – 6H)
ACCESS
Objets
Fichier
IHM-CONF
IHM JOUER
JDBC
SerialisationTU-
Gagner
IHM Configuration
RobotConfig.exe
I2 : Schéma & contenu de la base
I2 : JDBC – ce qu’explique l’expert
PersistenceClient
Persistence -RDBMS - JDBC
Persistent_object
DB_connection
Requestor
Drive_manager
DB_façade
SQL_helper
Result
PersistentClass
getData()setData()command()new()
PersistentClassList
new()add(c: PersistentClass)
Persistent_object_list
DBPersistentClass
create() : PersistentClassread(searchCriteria : string) : PersistentClassListupdate(c : PersistentClass)delete(c : PersistentClass)
ResultSet
getString() : string
Statement
executeQuery(sql : String) : ResultSetexecuteUpdate(sql : String) : int
Connection
createStatement() : Statement
DriverManager
getConnection(url, user, pass) : Connection
DB_façadePersistent_objectPersistent_object_list
Bilan de l’itération 2
• Product backLog estimé à 10H• Itération estimée à 10H et réalisée• Itération 3 est aussi terminée !!!
Iter1Iter2
Bilan de la release
• Velocite – 30 points en 2 release 2*8H– Velocite = 15
Conclusion
IHM-LUXEJouer
IHMConfigurer
Objets
Fichier
IHM-ACCESSConfigurer
IHM-DOSJouer
Access
Fichier-XML
Editeur XML(notePad)Configurer
Serialization JDBC
A vendre pour l’iter3
RQMTestsJUNIT
RQMRobot
<<Singleton>>
-poids: int-poidsMax: int
+Deplacer(pc: PC)+GetObjets(): Array<String>+GetObjetsPiece(): Array<String>+Prendre()+Prendre(nom: String)+Deposer()+Deposer(nom: String)+RafraichirPiece(): String
Piece
-nom: String-Issues: Array< Piece>-origine: Piece
+GetIssue(pc: PC): Piece+GetObjets(): Array<String>+Prendre(nom: String): Objet+Deposer(Objet)+SetIssue(pc: PC, piece: Piece)+DeposeInitiale(objet: Objet)+GetNom(): String
-maPiece
1
ConteneurObjets
-conteneur: Array<Objet>
+Ajouter(objet: Objet)+Retirer(nom: String): Objet+GetNbObjets(): int+GetObjets(): Array<String>
-leSac
1-contient
1
Objet
-nom: String-poids: int-nbObjets: boolean
+GetNom(): String+GetPoids(): int+Afficher(): String+GetNbObjets(): int
PC<<enumeration>>
+Nord+Sud+Est+Ouest
Bouteille
-degre: float-volume: float
+Afficher(): String
Chaise
-solide: boolean
+Afficher(): String
Tableau
-auteur: String
+Afficher(): String
IHMDOS IHMLUXE
<<Sing>>RQM
----------------------Energie
----------------------Deplacer(PC)
<<TM>>Deposer
Nourriture----------------------
energieNe pas les compter en nbObjet