User Tools

Site Tools


2013_2014:s2:td:etudedecas:etape1

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
2013_2014:s2:td:etudedecas:etape1 [2014/04/29 21:29]
blay [ETAPE 3 : Agilité : Ajout de nouvelles fonctionnalités]
2013_2014:s2:td:etudedecas:etape1 [2014/05/21 16:22] (current)
blay
Line 6: Line 6:
  
  
-<note important>​Cette séance est très dense. Un débordement partiel au niveau des codes est possible sur la séance suivante. Mais plus de retard serait préjudiciable pour les acquis. Il convient donc de travailler ​sans "lambiner"​.</​note>​+<note important>​Cette séance est très dense((évidemment si vous faîtes vraiment le travail et aboutissez à des codes fonctionnels)). Un débordement partiel au niveau des codes est possible sur la séance suivante ​à raison d'une 1/2 heure. Mais plus de retard serait préjudiciable pour les acquis. Il convient donc de travailler ​avec "efficience"​.</​note>​ 
 + 
 + 
 +===== Objectifs de notre logiciel ===== 
  
 Nous avons besoin d'un logiciel qui nous permette de gérer les compétitions mettant en jeu la machine qui est fournie. Nous avons besoin d'un logiciel qui nous permette de gérer les compétitions mettant en jeu la machine qui est fournie.
  
 Ainsi nous aimerions : Ainsi nous aimerions :
-  * qu'un manager puisse déclarer de nouvelles compétitions, +  * qu'un manager puisse déclarer de nouvelles compétitions; 
-  * qu'il puisse gérer les matchs pendant la compétition,​ c'est à dire établir automatiquement la liste des matchs à partir de la liste des participants,​ gérer la succession des matchs et les résultats des joueurs, enregistrer des joueurs forfaits+  * qu'il puisse gérer les matchs pendant la compétition,​ c'est à dire établir automatiquement la liste des matchs à partir de la liste des participants,​ gérer la succession des matchs et les résultats des joueurs;
   * Sur ce dernier point, il s'agit de permettre à un consultant de consulter pour un joueur au cours de la compétition les matchs joués ou à jouer et les scores obtenus.   * Sur ce dernier point, il s'agit de permettre à un consultant de consulter pour un joueur au cours de la compétition les matchs joués ou à jouer et les scores obtenus.
  
Line 30: Line 34:
  
 Une compétition se déroule ainsi ((Il s'agit d'une approximation afin de simplifier un peu l'​étude de cas)) :  Une compétition se déroule ainsi ((Il s'agit d'une approximation afin de simplifier un peu l'​étude de cas)) : 
-  - Elle est créée+  - Elle est créée.
   - Les joueurs absents sont considérés comme forfait.   - Les joueurs absents sont considérés comme forfait.
-  - Les matchs sont calculés en fonction du nombre de joueurs et leur rang +  - Les matchs sont calculés en fonction du nombre de joueurs et de leur rang 
-  - les matchs sont distibués ​sur les pistes disponibles (il peut y avoir plusieurs matchs par piste, ils se déroulent en séquence)+  - les matchs sont distribués ​sur les pistes disponibles (il peut y avoir plusieurs matchs par piste, ils se déroulent en séquence)
   - les pistes sont "​lancées",​   - les pistes sont "​lancées",​
   - Dès que toutes les pistes ont terminé, ​   - Dès que toutes les pistes ont terminé, ​
 +  - On affiche les gagnants de chaque match,
   - Tant qu'il y a encore des tours à faire (c'est à dire que le gagnant de la compétition n'a pas été déterminé) ​   - Tant qu'il y a encore des tours à faire (c'est à dire que le gagnant de la compétition n'a pas été déterminé) ​
       - on calcule une nouvelle série de matchs en fonction des gagnants du **tour** précédent       - on calcule une nouvelle série de matchs en fonction des gagnants du **tour** précédent
      - On ré-initialise les pistes avec les nouveaux matchs ​      - On ré-initialise les pistes avec les nouveaux matchs ​
-     - on ferme les pistes devenues inutiles+     - on ferme les pistes devenues inutiles.
      - On lance les pistes      - On lance les pistes
      - etc.      - etc.
Line 47: Line 52:
  
 <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  > <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  >
-  * Construire le diagramme de séquence de niveau analyse correspondant. Faîtes apparaître les "​pistes", ​il s'agit de "​FencingPiste"​.+  * Construire le diagramme de séquence de niveau analyse correspondant. Faîtes apparaître les "​pistes", ​pour la suite des TDs, nous gérerons des "''​FencingPiste''​". 
 +  * [[2013_2014:​s2:​td:​etudedecas:​etape1:​VP UML Forge|Sauvegarder dans la forge.]] ​
  
 </​box>​ </​box>​
 +
 ===== Déclaration des compétitions ===== ===== Déclaration des compétitions =====
  
    
-Nous nous focalisons à présent sur la déclaration d'une compétition ​et l'​établissement des matchs.+Sur la base de ce qui précède ​et avec les informations complémentaires suivantes, vous devez identifier les objets de notre application.
  
 Une compétition est définie par la liste des joueurs inscrits. Une compétition se caractérise par une arme et une tranche d’âge. ​ Une compétition est définie par la liste des joueurs inscrits. Une compétition se caractérise par une arme et une tranche d’âge. ​
  
-Avant le début de la compétition,​ l'​appel des joueurs est fait. Sur la base des joueurs présents la liste des matchs initiaux est établie (voir plus bas). Puis, des machines sont enregistrées,​ une par piste. Les matchs sont alors distribués sur les machines.  +La liste des matchs initiaux est établie comme suit : 
-Chaque machine est alors en prête à contrôler une piste.  +
- +
-la liste des matchs initiaux est établie comme suit : +
   * Le premier joueur présent (celui de rang le plus fort) est affecté au même match que celui de plus faible rang présent,   * Le premier joueur présent (celui de rang le plus fort) est affecté au même match que celui de plus faible rang présent,
   * le 2e joue avec l'​avant dernier s'il n'a pas encore été affecté   * le 2e joue avec l'​avant dernier s'il n'a pas encore été affecté
-  * etc.+  * etc.  
 +  * Si le nombre de joueurs est impair, le dernier joueur est automatiquement qualifié pour le tour d'​après. Pour l'​instant vous n'en tenez pas compte.
  
-//​Extension//​ : vous pouvez étendre l'​algorithme en ne mettant pas deux joueurs d'même club l'un contre l'​autre si c'est possible.+//​Extension//​ : vous pouvez étendre l'​algorithme en ne mettant pas deux joueurs d'un même club l'un contre l'​autre si c'est possible.
  
 <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  > <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  >
   * Définir le diagramme des classes d'​analyse   * Définir le diagramme des classes d'​analyse
-  * Définir le diagramme de séquence correspondant à la construction "​automatiquement"​ de la liste initiale des matchs. On considère que ce diagramme de séquence est  déclenché par le manager. ​+  * <del>Définir le diagramme de séquence correspondant à la construction "​automatiquement"​ de la liste initiale des matchs. On considère que ce diagramme de séquence est  déclenché par le manager.</​del> ​
 </​box>​ </​box>​
  
Line 75: Line 80:
 <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  > <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  >
   * Définir le diagramme des classes en conception   * Définir le diagramme des classes en conception
-  * Définir ​le diagramme de séquence en conception+  * Eventuellement,​ définir ​le diagramme de séquence en conception.
 </​box>​ </​box>​
  
Line 81: Line 86:
  
 <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  > <box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  >
-  * écrire ​les codes de distribution des matchs. ​+  * Ecrire ​les codes de distribution des matchs. ​
   * N'​oubliez pas de bien "​commiter"​ vos codes.   * N'​oubliez pas de bien "​commiter"​ vos codes.
 </​box>​ </​box>​
  
 +**Optionnel**
  
 +Vous pouvez continuer en prévoyant d'​affecter les matchs aux tours suivants : 
 +  * Si un joueur du tour précédent n'a pas joué il est pris en compte pour le dernier match à affecter
 +  * Le gagnant du premier match joue contre le gagnant du dernier match etc..
 +  * Si le nombre de match est impair, le gagnant du match milieu est automatiquement qualifié pour le tour d'​après.
  
-===== ETAPE 3 : Agilité : Ajout de nouvelles fonctionnalités =====+<note important>​**Pour les étudiants en S2A**\\ 
 +Les rendus se font sur la forge. Vous avez jusqu'​au 9 juin 18h pour le rendu. 
 +Votre modélisation et votre code doit prendre en compte ce qui est noté comme optionnel, qui ne l'ai pas pour vous.
  
-Notre objectif est d'​être capable d'​utiliser les modèles en mode "​agile"​ pour faire évoluer une application et de comprendre la nécessité d'​aborder de manière "​incrémentale"​ le développement d'une application. +Attention ​dans les rendus ​il a donc de la modélisation ​et du code et les deux doivent ​être en concordance.
- +
- +
-??? Prévoir un google doc pour que chaque groupe partage les informations de changements?​ +
-Ou bien on le fait au tableau +
- +
- +
- +
-Pour chacune des fonctionnalités suivantes, vous devez répondre aux questions suivantes :  +
-    * Que devez-vous modifier pour prendre en compte cette nouvelle fonctionnalité?​  +
-    * Plus formellement,​ quels modèles devez-vous modifier? Quels modèles créeriez-vous?​ +
-    * Quelles recherches d'​information feriez-vous?​ +
-    * Quels codes seraient modifiés? Créez?  +
-Soyez rigoureux ​dans cette analyse. Identifiez bien tous les impacts d'un changement aussi bien en terme de cas d'​utilisation que des codes touchés.  +
- +
-Fonctionnalités additionnelles demandées +
- +
-  - Pendant le match, ​il est possible qu'un joueur se blesse et abandonne la partie. On veut pouvoir tenir compte de cet abandon dans la gestion des matchs suivants. +
-  - On veut gérer des évènements. La portée d'un évènement peut être nationale, internationale,​ régionale ou locale à un club. Un événement peut comporter plusieurs compétitions,​ par exemple //fleuret dames junior// et //sabre vétéran messieurs//​. Ainsi, une compétition se caractérise par une arme, un type "​individuel"​ ou "par équipe",​ un genre, et une tranche d’âge.  +
-  - En cas de panne de courant, la compétition est interrompue. Mais elle doit pouvoir reprendre dès que l'​électricité revient.  +
-  - Alors que comme vous l'avez vu les pistes sont identifiées par un numéro dans la machine qui vous été livrée, cependant il est d'​usage de les identifier par un nom de couleur....  +
-  - On désire afficher en temps réel les résultats de chaque piste (donc le détail des rounds) sur un grand écran. +
-  - Si un joueur est gaucher on doit pouvoir permuter les joueurs sur le terrain afin que l’arbitre puisse suivre l’assaut. +
-  - La liste des joueurs vous est transmis via des fichiers XML dont le format vous est donné ici. http://​betton.escrime.free.fr/​documents/​BellePoule/​doc/​XML_Specifications_FIE.pdf +
- +
- +
- +
-==== Prise de recul ==== +
- +
-  - Evaluez ​la complexité des modifications demandées. +
-  - Quelle fonction développeriez-vous en premier? Pourquoi? Quels sont vos critères de choix? (( et si maintenant on vous dit quelles sont les fonctionnalités les plus utiles au client? )). +
- +
-==== Faire ==== +
- +
-  - Choisissez une ou des fonctionnalité(s) ​et faîtes le travail associé. +
-  - Les 3 heures sont terminées... Avez-vous réussi ? +
- +
- +
- +
-====== Etape 2 : "​Reverse Engineering"​ & Intégration ====== +
-<​note>​L'​objectif de cette séance est de savoir lire des diagrammes fournis et de savoir par analyse des modèles repérer ​les éléments importants des codes, pour les intégrer. +
- +
-A l'​issue de cette séance, un étudiant doit savoir se connecter à des codes existants en implémentant les  interfaces données, et en utilisant judicieusement les classes "​frontières"​ données.  +
- +
-Ces aspects, peut être pas en terme de code, seront abordés ​en examen.+
 </​note>​ </​note>​
  
-<note important>​Cette séance doit être réalisée en entier, sinon vous n'​aurez pas les acquis attendus.</​note>​ 
-===== Des codes fonctionnels ===== 
- 
-Voici les codes d'une piste reliée à une machine. 
-Fournir aussi l'​interface de match... 
- 
-Fournir la javadoc 
- 
-Voici le modèle associé et le scénario de lancement général envisagé. 
- 
-==== Retour sur l'​interface de Match ==== 
- 
-Comme vous avez dû le constater la "​FencingPiste"​ est fournie avec une interface ''​MatchInterface'',​ qui vous permet d'​utiliser votre propre classe Match, il suffit pour cela qu'​elle "​implemente"​ l'​interface. 
- 
-Voici l'​interface ''​MatchInterface''​ qui vous est fournie. 
-<code java> 
-??? 
-</​code>​ 
- 
-Votre code ne correspond probablement pas exactement à l'​interface de ''​MatchInterface''​. 
- 
-Vous devez donc adapter** VOTRE CODE** (et pas l'​inverse,​ en général, on n'a pas le droit de modifier les codes fournis) pour qu'il implémente l'​interface ''​MatchInterface''​. 
- 
-//Rappel : Pour dire qu'une classe implémente une interface// 
-<code java> 
-public class Match implements MatchInterface { 
-</​code>​ 
- 
-<box round rgb(185,​211,​238) rgb(220,​226,​255) 95%|A Faire :  > 
-  * Modifier au niveau du code et du modèle (dans l'​ordre qui vous convient) votre classe Match pour qu'​elle implémente l'​interface. 
-</​box>​ 
-==== Approche incrémentale ==== 
-  - Vous commencerez par créer une piste et tester 
-  - Par exemple 
- 
-<code java> 
-  FencingPiste pist1 = new FencingPiste(1);​ 
-  FencingPiste pist2 = new FencingPiste(2);​ 
-  Match m1 = new Match();//​attention à bien mettre vos propres parametres dans les constructeurs et votre propre type "​Match"​ 
-  Match m2 = new Match(); 
-  Match m3 = new Match(); 
-  
-  pist1.addMatch(m1);​ 
-  pist1.addMatch(m2);​ 
-  pist2.addMatch(m3);​ 
-  
-  pist1.start();​ 
-  pist2.start();​ 
-  
-  while (!(pist1.isOver() && pist2.isOver()) ​ ) { 
- Thread.sleep(6000);​ 
- System.out.println("​pas fini-------------------"​);​ 
-  } 
-  
-  System.out.println("​gagnant de m1" + m1.getWinner());​ 
-  System.out.println("​gagnant de m2" + m2.getWinner());​  
-  System.out.println("​gagnant de m3" + m3.getWinner());​  
-  
-/* 
- * Quand tous les matchs ont eu lieu sur toutes les pistes on re-initialise les match 
- * puis on ré-affecte les pistes. 
- * On ferme les pistes inutiles 
- */ 
- ​pist1.clear();​ 
- ​Match1 m4 = new Match1(); 
- ​pist1.addMatch(m4);​ 
- ​pist1.start();​ 
-// On ferme l'​autre piste 
- ​pist2.close();​ 
-</​code>​ 
- 
-==== Intégration : Lancement d'une compétition ==== 
-  
-Vous avez modélisé la semaine dernière une compétition. 
-Vous devez à présent connecter une compétition aux pistes. 
-Pour cela vous reprenez votre classe compétition... 
- 
- 
-Amusez vous  
-===== Principes des codes donnés ===== 
- 
-Diagramme de composants 
- 
-Mettre en avant  
-1) diagramme de classes 
- 
-2)  
- 
-3) Diagramme de séquence qui dit ce que vous devez faire 
- 
- 
-==== Questions ==== 
-  
- 
-- où se trouve les codes qui valide une fin de match ((MachineControler)) ?  
- 
-- Quel code devez vous modifier pour implémenter la validation conformément aux règles ci-après ? 
- 
-- De quelles informations disposez-vous pour faire ces calculs? ​ 
- 
- 
- 
- 
-===== A vous de modifier les codes  ===== 
- 
-Règles de validation 
- 
-- Implémenter les rgles ci-après 
- 
-- Vérifier que les jeux de données correspondent bien 
- 
-Faire un tableau 
- 
-Joueur1 Joueur2 ScoreJoueur1 ScoreJoueur2 Temps Résultat 
- 
- 
-Voici un jeu de tests 
- 
-<code java> 
-public class MachineControllerTest { 
- public static final int THREE_MINUTES = 1000 * 60 * 3; 
- public static final int TWO_MINUTES = 1000 * 60 * 2; 
- public static final int ONE_MINUTE = 1000 * 60 ; 
- Score sleft = new Score(PlayerType.left);​ 
- Score sright = new Score(PlayerType.right);​  
- MachineController mc = new MachineController();​ 
- StateMachine stateMachineOnChrono = new StateMachine(sleft,​sright,​ THREE_MINUTES);​ 
- StateMachine stateMachineOnPoints= new StateMachine(sleft,​sright,​ 360); 
-  
-/* Des que un des joueurs a fait 5 touches et s'il y a une différence de au moins 1 touches entre les deux joueurs ​ 
- alors il est déclaré gagnant 
- Par exemple un score de 5 pour l'un et de 3 pour l'​autre 
- mais aussi 7 et 5 
- par contre 5 et 4 ne suffisent pas. 
-*/  
- @Test 
- public void testValidateOnScoreForLeft() { 
- sleft.setScore(5);​ 
- sright.setScore(3);​ 
- assertEquals(PlayerType.left,​ mc.validate(stateMachineOnPoints));​ 
- } 
- @Test 
- public void testValidateOnScoreForRight() { 
- sright.setScore(5);​ 
- sleft.setScore(3);​ 
- assertEquals(PlayerType.right,​ mc.validate(stateMachineOnPoints));​ 
- } 
-  
- @Test 
- public void testValidateFailOnScoreGap() { 
- sleft.setScore(5);​ 
- sright.setScore(4);​ 
- assertEquals(PlayerType.fail,​ mc.validate(stateMachineOnPoints));​ 
- } 
-  
- @Test 
- public void testValidateFailOnScoreLevel() { 
- sleft.setScore(4);​ 
- sright.setScore(2);​ 
- assertEquals(PlayerType.fail,​ mc.validate(stateMachineOnPoints));​ 
- } 
-  
-  
- 
- // VERSION SIMPLIFIEE ​ 
- // Si aucun des joueurs n'a marqué 5 touches mais que les 3 minutes sont écoulées alors celui qui a fait le plus de touches est déclaré gagnant du round. 
- // Si les deux ont le même score, le jeux doit se prolonger 2minutes. ​ 
- // Des que l'un des joueurs touche, il gagne. 
- // AU bout de 5minute, le gagnant est tiré au sort. 
-  
- @Test 
- public void testValidateOnChronoLeft() { 
- sleft.setScore(4);​ 
- sright.setScore(2);​ 
- assertEquals(PlayerType.left,​ mc.validate(stateMachineOnChrono));​ 
- } 
-  
- @Test 
- public void testValidateOnChronoRight() { 
- sleft.setScore(1);​ 
- sright.setScore(2);​ 
- stateMachineOnChrono.setClockTime(THREE_MINUTES ); 
- assertEquals(PlayerType.right,​ mc.validate(stateMachineOnChrono));​ 
- } 
-  
- @Test 
- public void testValidateFailOnChrono() { 
- sleft.setScore(2);​ 
- sright.setScore(2);​ 
- stateMachineOnChrono.setClockTime(THREE_MINUTES + ONE_MINUTE);​ 
- assertEquals(PlayerType.fail,​ mc.validate(stateMachineOnChrono));​ 
- } 
-  
- @Test 
- public void testValidateRandomOnChrono() {  
- sleft.setScore(2);​ 
- sright.setScore(2);​ 
- stateMachineOnChrono.setClockTime(THREE_MINUTES + TWO_MINUTES);​ 
- assertFalse(PlayerType.fail.equals( mc.validate(stateMachineOnChrono)));​ 
- } 
-  
- 
-</​code>​ 
-===== Amorçons la suite  ===== 
- 
-Cette fois-ci vous allez devoir utiliser vos propres capacités à modéliser. 
- 
-Notre premier objectif est d'​implémenter la méthode next. 
- 
-IL s'agit de : 
-- gérer une liste de rounds ​ 
-- prendre le prochain round affecté à cette table 
- 
- 
-EXtension : a chaque round, les joueurs changent de côté. 
2013_2014/s2/td/etudedecas/etape1.1398799746.txt.gz · Last modified: 2014/04/29 21:29 by blay