This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
2018_2019:s2:td:td_final [2019/02/16 21:09] blay [Votre application : SpyMe (1H20)] |
2018_2019:s2:td:td_final [2019/04/12 16:10] blay [Rendu pour ce devoir] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== De la modélisation au code : FINALE ====== | ====== De la modélisation au code : FINALE ====== | ||
- | FIXME | + | <panel title="Attention pour la semaine prochaine!"> |
+ | {{:2018_2019:s2:td:exams2-mars2018.pdf| Examen 2018}} | ||
- | Dans ce TD nous avons pour objectif de partir de la modélisation et d'arriver au codage en 4h ! | + | {{:2018_2019:s2:td:exams2-avril2017.pdf|Examen 2017}} |
- | + | </panel> | |
- | comprendre la relation entre la modélisation et le code, et ceci en utilisant tous les éléments de modélisation. | + | |
+ | <box round rgb(255,204,153) rgb(255,255,204) 97%|Dans ce TD : > | ||
+ | nous avons pour objectif de partir de la modélisation et d'arriver au codage en 4h ! | ||
+ | </box> | ||
/* | /* | ||
===== Reverse : La classe ''Point'' (10 mn) ===== | ===== Reverse : La classe ''Point'' (10 mn) ===== | ||
Line 17: | Line 20: | ||
*/ | */ | ||
- | ===== Chemin et Parcours (30mn) ===== | + | ===== La classe "Journey" (30mn) ===== |
- | * On définit un Chemin comme ayant un point de départ, un point d'arrivée et un intitulé. | + | * On définit un ''Trajet/Journey'' comme une suite ordonnée de points. |
- | * Un point peut appartenir à plusieurs chemins. | + | * Un point a un intitulé (par exemple, "IUT, Fabron"). |
- | * On veut connaitre la distance que représente un chemin (cf. si besoin [[http://fr.wikipedia.org/wiki/Distance_entre_deux_points_sur_le_plan_cart%C3%A9sien|Calcul de distance]]) | + | * Un point peut appartenir à plusieurs Trajets. |
- | * Un Parcours est une suite ordonnée de chemins tels que le point de départ d'un chemin est le point d'arrivée du chemin suivant. | + | * Un point ne sait pas à quel(s) trajet(s) il est associé. |
- | * On veut connaitre la distance que représente un Parcours (c'est la somme des distances des chemins qui le composent). | + | * On veut connaitre la distance que représente un Trajet, c'est la somme des distances entre les points (cf. si besoin [[http://fr.wikipedia.org/wiki/Distance_entre_deux_points_sur_le_plan_cart%C3%A9sien|Calcul de distance]]) |
- | - Modéliser les concepts de Chemin et de Parcours. | + | - Modéliser le concept de Trajet, y compris les autres concepts dont vous pouvez avoir besoin. |
- | * Un chemin ne sait pas de quel(s) Parcours il fait éventuellement parti. | + | |
- Codez-les. | - Codez-les. | ||
- | |||
- | <note warning>Dans le modèle de la classe CHEMIN, IL N'Y A PAS D'ATTRIBUTS ''DEPART'' et ''ARRIVEE'' mais des associations !</note> | ||
- | <note important>Dans cet exercice, faîtes particulièrement attention aux rôles et à la navigation dans les associations. | ||
- | </note> | ||
<note tip>Je sais représenter des associations entre classes et je comprends leur correspondance en java. </note> | <note tip>Je sais représenter des associations entre classes et je comprends leur correspondance en java. </note> | ||
Line 63: | Line 61: | ||
* Un membre peut enregistrer son parcours : | * Un membre peut enregistrer son parcours : | ||
- il déclare sur son téléphone qu'il commence à enregistrer un parcours; | - il déclare sur son téléphone qu'il commence à enregistrer un parcours; | ||
- | - toutes les 10 secondes, un nouveau point est automatiquement créé 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; | + | - 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. | - 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 visualiser les parcours passés : par la distance parcourue, la durée, la vitesse moyenne, la date (jour et heure), le type d'entrainement, ... | ||
- | * En sélectionnant un parcours, un membre peut visualiser un parcours en utilisant googleMAP. | + | * 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 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 peut créer son propre mode d'entrainement en précisant les temps de consultation etc. | ||
Line 77: | Line 77: | ||
Evidemment vous commencez par identifier les cas d'utilisation de haut niveau. Mais ensuite vous pouvez travailler comme bon vous semble. | 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 cas d'utilisation | ||
- | * "Prévoyez" les tests correspondant aux scénarii suivants (soit dans l'outil, soit sur papier) : | + | * **Partie 1** : "Prévoyez" les tests correspondant aux scénarii suivants : |
- "Bipbip" s'inscrit en utilisant son compte "Facebook"; | - "Bipbip" s'inscrit en utilisant son compte "Facebook"; | ||
- "Xavier-Bertrand" s'inscrit en saisissant son nom et déclare son compte twitter; | - "Xavier-Bertrand" s'inscrit en saisissant son nom et déclare son compte twitter; | ||
- | - "Bipbip" demande l'enregistrement de son parcours lundi. | + | - "Bipbip" demande l'enregistrement de son parcours "lundi": par exemple : 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 également l'enregistrement de son parcours et précise qu'il s'agit d'un entrainement à la course. | + | - "Bipbip" demande quand il était près d'un point d'un parcours donné : (1) point enregistré pendant le parcours e.g. ( (7,7) -> ''date=Thu Feb 28 21:39:16 CET 2019'') ; (2) point le plus proche quand il était le plus proche d'un point donné 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 durée : il a couru lundi pendant 20mn et mercredi 30mn. | ||
- | - "Bipbip" demande à voir ses parcours triés par la vitesse moyenne: il a courru lundi à 11km/h et mercredi 10km/h. | + | - "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. | - "Xavier-Bertrand" déclare un nouveau mode d'entrainement : le Marathon, les relevés ne se font que toutes les minutes. | ||
* Définir le diagramme de classes | * 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. | * 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 ce scénario en vous aidant des codes ci-aprè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. | + | * Implémenter les scénario de la partie 1 en vous aidant des codes ci-aprè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? | * Pouvez-vous étendre votre application pour donner la vitesse moyenne entre deux points donnés d'un parcours? | ||
Line 99: | Line 102: | ||
* Avez-vous besoin d'information supplémentaires sur la notion de Point? Comment faire? | * Avez-vous besoin d'information supplémentaires sur la notion de Point? Comment faire? | ||
* De quelles informations avez-vous besoin pour construire un Parcours? | * De quelles informations avez-vous besoin pour construire un Parcours? | ||
- | * | ||
== Obtenir le moment présent == | == Obtenir le moment présent == | ||
Line 114: | Line 116: | ||
Si vous voulez représenter la gestion du temps (mais vous pouvez vous en passer), voici une approche très simple : | Si vous voulez représenter la gestion du temps (mais vous pouvez vous en passer), voici une approche très simple : | ||
<code java> | <code java> | ||
- | Thread.sleep(10000); //1000 milliseconds is one second. | + | try { |
+ | Thread.sleep(10000);//1000 milliseconds is one second. | ||
+ | } catch (InterruptedException e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
</code> | </code> | ||
Line 127: | Line 133: | ||
</code> | </code> | ||
+ | <accordion collapsed="true"> | ||
+ | <panel title="Vision Globale : si vous avez besoin d'aides"> | ||
=== Vision Globale === | === Vision Globale === | ||
Line 132: | Line 140: | ||
<code java> | <code java> | ||
- | public Parcours creerParcours(Membre m) throws InterruptedException{ | + | Scanner sc = new Scanner(System.in); |
- | System.out.println("Creation de parcours "); | + | int interval = 1000; |
- | ... | + | |
- | .... | + | public Journey createJourney(Member m) throws InterruptedException{ |
- | PointDate pCourant = saisirPointDate(); ; | + | System.out.println("Creating a journey "); |
- | Parcours parcours = new Parcours(pCourant); | + | DatedPoint currentPoint = enterDatedPoint(); ; |
- | boolean encore = true; | + | Journey path = new Journey(currentPoint); |
- | while (encore){ | + | boolean again = true; |
- | pCourant = saisirPointDate(); | + | while (again){ |
- | parcours.addPoint(pCourant); | + | currentPoint = enterDatedPoint(); |
- | System.out.println("Distance parcourue : " + parcours.distance()); | + | path.addPoint(currentPoint); |
- | System.out.println("Durée depuis le départ : " + parcours.duree() + " soit :" + parcours.duree()/1000 + " secondes" ); | + | System.out.println("Distance : " + path.distance()); |
- | .... | + | System.out.println("Duration since departure : " + path.duration() + " soit :" + path.duration()/1000 + " secondes" ); |
- | System.out.println("On continue ? (true or false)"); | + | System.out.println("We continue ? (true or false)"); |
- | encore = sc.nextBoolean(); | + | again = sc.nextBoolean(); |
- | Thread.sleep(intervalle); //1000 milliseconds is one second. | + | Thread.sleep(interval); //1000 milliseconds is one second. |
} | } | ||
- | return parcours; | + | return path; |
} | } | ||
- | + | ||
- | private PointDate saisirPointDate() { | + | private DatedPoint enterDatedPoint() { |
- | PointDate pCourant; | + | DatedPoint currentPoint; |
int x; | int x; | ||
int y; | int y; | ||
Line 162: | Line 170: | ||
//obtenir la date courante | //obtenir la date courante | ||
Date date = new Date(); | Date date = new Date(); | ||
- | pCourant = new PointDate(x,y,date); | + | currentPoint = new DatedPoint(x,y,date); |
- | return pCourant; | + | 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> | </code> | ||
+ | |||
+ | Et des exemples de tests ... | ||
+ | |||
+ | <code java> | ||
+ | @Test | ||
+ | void testClosestPoint() 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.getDate(), path.whenWasYouHere(currentPoint1)); | ||
+ | assertEquals(currentPoint2.getDate(), path.whenWasYouHere(currentPoint2)); | ||
+ | assertEquals(currentPoint3.getDate(), path.whenWasYouHere(currentPoint3)); | ||
+ | assertEquals(currentPoint3.getDate(), path.whenWasYouHere(new DatedPoint(12,12,new Date()))); | ||
+ | assertEquals(currentPoint1.getDate(), path.whenWasYouHere(new DatedPoint(4,4,new Date()))); | ||
+ | assertEquals(currentPoint2.getDate(), path.whenWasYouHere(new DatedPoint(8,8,new Date()))); | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | @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> | ||
+ | |||
+ | |||
+ | </panel> | ||
+ | </accordion> | ||
+ | |||
+ | |||
+ | ==== Rendu pour ce devoir ==== | ||
+ | |||
+ | - Les rendus se font sous [[http://jalon.unice.fr/cours/blay/Cours-blay-20160226085155/BoiteDepot-blay-20190217142915655329?mode_etudiant=true&tab=deposit|jalon]] avant <color red>11 mars 9h/color> | ||
+ | - Le rendu respecte ce qui suit : | ||
+ | - il se fait à 2 maximum | ||
+ | - le titre est composé de FIN<NumeroDuGroupe>_NomEtudiant__NomEtudiant //(e.g. DS1_Doe_Smith ou UC2_Harry)// | ||
+ | - Un document qui comprend : | ||
+ | - votre diagramme de cas d'utilisation | ||
+ | - votre diagramme de séquence | ||
+ | - votre diagramme de classes cohérent relativement à l'ensemble de l'étude de cas et donc complété relativement au diagramme de séquence | ||
+ | - les codes sources (là où vous en êtes) | ||
+ | - les tests si vous en avez, sinon le main de test | ||
+ | |||
+ | **Erreurs** | ||
+ | * Livrer les binaires | ||
+ | * ne pas livrer un document mais des images | ||
+ | * | ||