41
La vie d’un mini projet Agile Le Robot Agile

Le robot agile

Embed Size (px)

DESCRIPTION

Un micro projet agilePlan de releaseBacklog2 itérationsRefactoring

Citation preview

Page 1: Le robot agile

La vie d’un mini projet Agile

Le Robot Agile

Page 2: 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

Page 3: Le robot agile

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

Page 4: Le robot agile

Que faire?• UC-US• Backlog planning de release• Iter1

– Tâches– Modélisation– Tests– Codage– Remaniement– Doc– Demo– Bilan

• Iter2• ……….

Page 5: Le robot agile

Le diagramme des Use Case

Page 6: Le robot agile

BackLog du produit

Les risques?

Release complète livréedans 3 joursPrésence de l’expert JDBC obligatoire J2

Page 7: Le robot agile

Le Robot Agile

Iter1 : Jouer sans persistance

Page 8: Le robot agile

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)

Page 9: Le robot agile

I1 : Découpe en tâches

Page 10: Le robot agile

I1 : Modélisation (diag classe)

Discussion avecLe client

Page 11: Le robot agile

I1 : Les IHM

Page 12: Le robot agile

I1 : Configurer Les objets

Page 13: Le robot agile

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

Page 14: Le robot agile

I1 : Deplacer

Page 15: Le robot agile

I1 : Prendre

Page 16: Le robot agile

I1 : Deposer

Page 17: Le robot agile

I1 : Diagramme de classe

Page 18: Le robot agile

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"));}

Page 19: Le robot agile

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!!!!!");}}

Page 20: Le robot agile

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;

}

}

Page 21: Le robot agile

I1 : Passer les tests NOK

Page 22: Le robot agile

I1 : Codage

Page 23: Le robot agile

Tests JUNIT

Page 24: Le robot agile

I1 : Tests Finaux

Page 25: Le robot agile

I1 : Documentation Seq

Page 26: Le robot agile

I1 : Documentation : Classe

Page 27: Le robot agile

Remaniement

• Mettre une énumération pour les points cardinaux

• Faire une nouvelle classe conteneur d’objets pour éviter les doublons de code

• Retester

Page 28: Le robot agile

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

Page 29: Le robot agile

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

Page 30: Le robot agile

I1 : Demo

Page 31: Le robot agile

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

Page 32: Le robot agile

Le Robot Agile

Iter2 : ConfigurerPrendre en compte les retours utilisateurs et

les bugsPuis replanifier

Page 33: Le robot agile

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)

Page 34: Le robot agile

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

Page 35: Le robot agile

IHM Configuration

RobotConfig.exe

Page 36: Le robot agile

I2 : Schéma & contenu de la base

Page 37: Le robot agile

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

Page 38: Le robot agile

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

Page 39: Le robot agile

Bilan de la release

• Velocite – 30 points en 2 release 2*8H– Velocite = 15

Page 40: Le robot agile

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

Page 41: Le robot agile

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