User Tools

Site Tools


2019_2020:s2:td:td8

Differences

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

Link to this comparison view

Next revision
Previous revision
2019_2020:s2:td:td8 [2020/03/01 21:52] – created blay2019_2020:s2:td:td8 [2020/03/08 15:58] (current) – [De la modélisation au code : FINALE] blay
Line 2: Line 2:
  
  
 +[[2019_2020:s2:td:coorectionexamintermediaire|Corrections de l'examen intermédiaire]]
 +
 +
 +{{:2019_2020:s2:td:exams2-mars2019.pdf|L'examen de l'an passé}}
 ===== La classe "Journey" (30mn) ===== ===== La classe "Journey" (30mn) =====
  
-   * On définit un ''Trajet/Journey'' comme une suite ordonnée de points.+   * On définit un ''Trajet/Journey'' comme une suite ordonnée de points.(( Pour dire qu'une association est ordonnée, il faut le sélectionner dans la partie {{:2019_2020:s2:td:capture_d_e_cran_2020-03-04_a_14.50.04.png|}} properties))
    * Un point a un intitulé (par exemple, "IUT, Fabron").    * Un point a un intitulé (par exemple, "IUT, Fabron").
    * Un point peut appartenir à plusieurs Trajets.    * Un point peut appartenir à plusieurs Trajets.
Line 34: Line 38:
 <note tip>Le choix de l'implémentation dépend de ce que l'on fait des objets.</note> <note tip>Le choix de l'implémentation dépend de ce que l'on fait des objets.</note>
 */ */
 +
 +
 +
 +===== Votre application : SpyMe (2H20) =====
 +
 +<note warning>Attention cette fois-ci, la description de l'étude de cas n'est pas complètement structurée; la structure des classes en particulier exige une analyse "globale" de l'étude de cas.</note>
 +
 +On décide de produire une nouvelle application telle que :
 +       * Un internaute peut s'inscrire  à l'application en utilisant son compte facebook ou twitter ou un formulaire dédié.
 +       * Un membre peut enregistrer son parcours : 
 +                - il déclare sur son téléphone qu'il commence à enregistrer un parcours;
 +                - toutes les 10 secondes, le système crée un nouveau point automatiquement en demandant au GPS du téléphone sa position et l'heure actuelle; le point est ajouté au parcours en cours; Les coordonnées GPS sont des coordonnées sur une sphère et pas des coordonnées cartésiennes, cependant dans le cadre de ce TD, travaillez "simplement" avec des coordonnées cartésiennes;
 +                - le membre signale la fin du parcours qui est automatiquement enregistré dans sa base de parcours.
 +       * Un membre peut visualiser les parcours passés : par la distance parcourue, la durée, la vitesse moyenne, la date (jour et heure), le type d'entrainement, ... 
 +       * Un membre peut demander à visualiser un parcours en utilisant googleMAP.
 +       * Un membre peut savoir quand il était le plus proche d'un point donné lors d'un parcours.
 +       * Un membre peut savoir où il était à une date particulière : le système renvoie la position enregistrée à la date la plus proche.
 +       * Un membre peut préciser qu'il veut enregistrer un parcours d'entrainement; dans ce cas, avant le départ, il précise le mode d'entrainement. Pour chaque mode, un temps de relevé des points différent est prévu : marche rapide (2mn), course à pied (10s), vélos (5s), foot (10s), ...
 +       * Un membre peut créer son propre mode d'entrainement en précisant les temps de consultation etc.
 +       * Un membre qui a précisé son compte twitter, peut demander en début de parcours, que chaque relevé de point soit automatiquement "tweetté" avec le message "Je suis en position ...".
 +
 +
 +
 +
 +==== Questions  ====
 +Evidemment vous commencez par identifier les cas d'utilisation de haut niveau. Mais ensuite vous pouvez travailler comme bon vous semble.
 +  * Définir le diagramme de cas d'utilisation
 +  * Définir le diagramme de classes
 +  * Définir le diagramme de séquence correspondant à l'enregistrement d'un parcours par un membre, vous pouvez vous aider du diagramme ci-après.        
 +  * Implémenter les  scénario de la partie 1 ci-après en vous aidant des codes donnés. En particulier, comme nous ne disposons pas du GPS dans l'exemple donné ci-après c'est l'utilisateur qui saisit sa position. De même comme vous ne connaissez pas encore la parallèlisation des tâches on demande à chaque relevé de position, s'il faut ou non continuer à enregistrer le parcours.
 +  * Pouvez-vous étendre votre application pour donner la vitesse moyenne entre deux points donnés d'un parcours? 
 +
 +
 + * **Partie 1** : Voici des exemples très simples de tests de "validation", c'est à dire des tests qui mettent en exergue certaines des exigences client décrites ci-dessus.
 +      -  "Bipbip" s'inscrit en utilisant son compte "Facebook";
 +      -  "Xavier-Bertrand" s'inscrit en saisissant son nom  et déclare son compte twitter;
 +      -  "Bipbip" demande l'enregistrement de son parcours "lundi": par exemple :  <code> Journey [points=[ [date=Thu Feb 28 21:39:15 CET 2019, Point [x=5, y=5, label=domicile]],  [date=Thu Feb 28 21:39:16 CET 2019, Point [x=7, y=7, label=p1]],  [date=Thu Feb 28 21:39:17 CET 2019, Point [x=10, y=10, label=p2]],..</code>
 +      -   "Bipbip" demande //quand// il était près d'un point d'un parcours donné : 
 +                 - (1) si le point a été enregistré pendant le parcours e.g. ( (7,7) -> ''date=Thu Feb 28 21:39:16 CET 2019''
 +                 - (2) si le point n'a pas été enregistré, il cherche le point le plus proche lors d'un parcours (e.g. (12,12) -> ''date=Thu Feb 28 21:39:17 CET 2019'')
 +      -"Bipbip"  demande où il était à  ''Thu Feb 28 21:39:17 CET 2019'' : le système renvoie (12,12) etc.
 +   * **Partie 2** : "Prévoyez" les tests correspondant aux scénarii suivants, mais, à moins d'être très avancés n'allez pas au code.
 +      - "Bipbip" demande également l'enregistrement de son parcours et précise qu'il s'agit d'un entrainement à la course.
 +      - "Bipbip" demande à voir ses parcours triés par la durée : il a couru lundi pendant 20mn et mercredi 30mn. 
 +      - "Bipbip" demande à voir ses parcours triés par la vitesse moyenne: il a couru lundi à 11km/h et mercredi 10km/h. 
 +      -  "Xavier-Bertrand" déclare un nouveau mode d'entrainement :  le Marathon, les relevés ne se font que toutes les minutes.
 +
 +==== Pour vous aider  ====
 +
 +=== Si vous avez du mal à identifier les "objets" de l'application ... ===
 +
 +{{ :2015_2016:s2:td:courseapiedpk.scenariopointdevuepartiel.jpg?direct&200 |}}
 +
 +    * Avez-vous besoin d'information supplémentaires sur la notion de Point? Comment faire? 
 +    * De quelles informations avez-vous besoin pour construire un Parcours?
 +
 +== Obtenir le moment présent ==
 +
 +<code java>
 +import java.util.Date;
 +................
 + //obtenir la date courante
 + Date date = new Date();
 +</code>
 +
 +=== Gestion du temps ===
 +
 +Si vous voulez représenter la gestion du temps (mais vous pouvez vous en passer), voici une approche très simple : 
 +<code java>
 + try {
 + Thread.sleep(10000);//1000 milliseconds is one second.
 +   } catch (InterruptedException e) {
 + e.printStackTrace();
 +   }
 +</code>
 +
 +=== Saisir des entiers ou des boolean au clavier ===
 +<code java>
 +import java.util.Scanner;
 +
 +.....................
 +Scanner sc = new Scanner(System.in);
 +int y = sc.nextInt();
 +boolean encore = sc.nextBoolean();
 +</code>
 +
 +<accordion  collapsed="true">
 +<panel title="Vision Globale : si vous avez besoin d'aides">
 +=== Vision Globale  ===
 +
 +Attention, votre code ne correspond probablement pas à cela !!
 +
 +<code java>
 + Scanner sc = new Scanner(System.in);
 +        int interval = 1000;
 +
 + public Journey createJourney(Member m) throws InterruptedException{
 + System.out.println("Creating a journey ");
 +        DatedPoint currentPoint = enterDatedPoint(); ;
 + Journey path = new Journey(currentPoint);
 + boolean again = true;
 + while (again){
 + currentPoint = enterDatedPoint();
 + path.addPoint(currentPoint);
 + System.out.println("Distance  : " + path.distance());
 + System.out.println("Duration since departure : " + path.duration() + " soit :" + path.duration()/1000 + " secondes" );
 + System.out.println("We continue ? (true or false)");
 + again = sc.nextBoolean();
 + Thread.sleep(interval);  //1000 milliseconds is one second.
 + }
 + return path;
 + }
 + 
 + private DatedPoint enterDatedPoint() {
 + DatedPoint currentPoint;
 + int x;
 + int y;
 + System.out.println(" X ");
 + x = sc.nextInt();
 + System.out.println(" Y ");
 + y = sc.nextInt();
 + //obtenir la date courante
 + Date date = new Date();
 + currentPoint = new DatedPoint(x,y,date);
 + return currentPoint;
 + }
 +
 +</code>
 +
 +
 +Autres exemples
 +
 +<code java>
 +//To improve taking into account the displacement
 + public Date whenWasYouHere(Point point) {
 + DatedPoint closestPoint = points[0];
 + double distanceMin = point.distance(closestPoint);
 + for (int i =1; i<nextPlace;i++) {
 + double distance = point.distance(points[i]);
 + if (distance < distanceMin) {
 + distanceMin = distance;
 + closestPoint = points[i];
 + }
 + }
 + return closestPoint.getDate();
 + }
 +
 +
 + //To improve taking into account the displacement
 + public DatedPoint whereWereYou(Date date) {
 + long time = date.getTime();
 + DatedPoint closestPoint = points[0];
 + long durationMin = Math.abs(closestPoint.getDate().getTime()-time);
 + for (int i =1; i<nextPlace;i++) {
 + long duration = Math.abs(points[i].getDate().getTime()-time);
 + if (duration < durationMin) {
 + durationMin = duration;
 + closestPoint = points[i];
 + }
 + }
 + return closestPoint;
 + }
 +
 +</code>
 +
 +Et des exemples de tests ...
 +
 +<code java>
 +void testClosestPoint() throws InterruptedException {
 + Date currentDate1 = new Date();
 + DatedPoint currentPoint1 = new DatedPoint(5,5,currentDate1,"domicile") ;
 + Thread.sleep(1000); 
 + Date currentDate2 = new Date();
 + DatedPoint currentPoint2 = new DatedPoint(7,7,currentDate2,"p1") ;
 + Thread.sleep(1000); 
 + DatedPoint currentPoint3 = new DatedPoint(10,10,new Date(),"p2") ;
 + Thread.sleep(1000); 
 + Journey path = new Journey(currentPoint1);
 + path.addPoint(currentPoint2);
 + path.addPoint(currentPoint3);
 + System.out.println(path);
 + assertEquals(currentPoint1.getDate(), path.whenWasYouHere(currentPoint1));
 + assertEquals(currentPoint2.getDate(), path.whenWasYouHere(currentPoint2));
 + assertEquals(currentPoint3.getDate(), path.whenWasYouHere(currentPoint3));
 + assertEquals(currentPoint3.getDate(), path.whenWasYouHere(new Point(12,12)));
 + assertEquals(currentPoint1.getDate(), path.whenWasYouHere(new Point(4,4)));
 + assertEquals(currentPoint2.getDate(), path.whenWasYouHere(new Point(8,8)));
 +
 + }
 +
 +
 + @Test
 + void testWhereWereYou() throws InterruptedException {
 + Date currentDate1 = new Date();
 + DatedPoint currentPoint1 = new DatedPoint(5,5,currentDate1) ;
 + Thread.sleep(1000); 
 + Date currentDate2 = new Date();
 + DatedPoint currentPoint2 = new DatedPoint(7,7,currentDate2) ;
 + Thread.sleep(1000); 
 + DatedPoint currentPoint3 = new DatedPoint(10,10,new Date()) ;
 + Thread.sleep(1000); 
 + Date currentDate3 = new Date();
 + Journey path = new Journey(currentPoint1);
 + path.addPoint(currentPoint2);
 + path.addPoint(currentPoint3);
 + assertEquals(currentPoint1, path.whereWereYou(currentDate1));
 + assertEquals(currentPoint2, path.whereWereYou(currentDate2));
 + assertEquals(currentPoint3, path.whereWereYou(currentDate3));
 + assertEquals(currentPoint3, path.whereWereYou(new Date()));
 + assertEquals(currentPoint1, path.whereWereYou(new Date(currentDate1.getTime()-1000)) );
 + }
 +</code>
 +
 +{{:2019_2020:s2:td:journey.jpg|}}
 +</panel> 
 +</accordion>
 +
 +
  
2019_2020/s2/td/td8.1583099524.txt.gz · Last modified: 2020/03/01 21:52 by blay