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 22:52]
blay created
2019_2020:s2:td:td8 [2020/03/08 16:58] (current)
blay [De la modélisation au code : FINALE]
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 22:52 by blay