User Tools

Site Tools


2016_2017:s2:td:td_codeavance

This is an old revision of the document!


Approfondissements

Dans ce TD nous avons pour objectif de mieux comprendre la relation entre la modélisation et le code, et ceci en utilisant tous les éléments de modélisation.

Reverse : La classe ''Point'' (10 mn)

  1. Etant données les spécifications suivantes en omettant tous les accesseurs dessiner la classe Point correspondante. Vous pouvez aussi procéder par reverse engineering (classe Point)
Je sais faire le lien entre une classe java et une classe modélisée en UML.
Et si nous voulions à présent travaillez avec des points en coordonnées polaires, que ferions-nous?

Utilisation d'une classe : Chemin et Trajet (30mn)

  • On définit un Chemin comme ayant un point de départ, un point d'arrivée et un intitulé.
  • Un point peut appartenir à plusieurs chemins.
  • On veut connaitre la distance que représente un chemin (cf. si besoin Calcul de distance)
  • Un Trajet 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.
  1. Modéliser les concepts de Chemin et de Trajet.
    • Un chemin ne sait pas de quel trajet il fait éventuellement parti.
  2. Codez-les.
Comme vu en cours ce matin, conclusion du cours, IL N'Y A PAS D'ATTRIBUTS DEPART et ARRIVEE dans le modèle de la classe CHEMIN
Dans cet exercice, faîtes particulièrement attention aux rôles et à la navigation dans les associations.
Je sais représenter des associations entre classes et je comprends leur correspondance en java.

Votre application : SpyMe

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.

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 :
    1. il déclare sur son téléphone qu'il commence à enregistrer un parcours;
    2. 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;
    3. 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, …
  • En sélectionnant un parcours, un membre peut visualiser un parcours en utilisant googleMAP.
  • 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 …”.

Pouvez-vous étendre votre application pour donner la vitesse moyenne entre deux points donnés d'un parcours?

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
  • “Prévoyez” les tests correspondant aux scénarii suivants (soit dans l'outil, soit sur papier) :
    1. “Bipbip” s'inscrit en utilisant son compte “Facebook”;
    2. “Xavier-Bertrand” s'inscrit en saisissant son nom et déclare son compte twitter;
    3. “Bipbip” demande l'enregistrement de son parcours lundi.
    4. “Bipbip” demande également l'enregistrement de son parcours et précise qu'il s'agit d'un entrainement à la course.
    5. “Bipbip” demande à voir ses parcours triés par la durée : il a couru lundi pendant 20mn et mercredi 30mn.
    6. “Bipbip” demande à voir ses parcours triés par la vitesse moyenne: il a courru lundi à 11km/h et mercredi 10km/h.
    7. “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 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.

Pour vous aider

Si vous avez du mal à identifier les "objets" de l'application ...

  • 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
import java.util.Date;
................
 //obtenir la date courante
 Date date = new Date();

Gestion du temps

Si vous voulez représenter la gestion du temps (mais vous pouvez vous en passer), voici une approche très simple :

Thread.sleep(10000);  //1000 milliseconds is one second.

Saisir des entiers ou des boolean au clavier

import java.util.Scanner;
 
.....................
Scanner sc = new Scanner(System.in);
int y = sc.nextInt();
boolean encore = sc.nextBoolean();

Vision Globale

Attention, votre code ne correspond probablement pas à cela !!

public Parcours creerParcours(Membre m) throws InterruptedException{		
		System.out.println("Creation de parcours ");
	...
	....
                PointDate pCourant = saisirPointDate();	;
		Parcours parcours = new Parcours(pCourant);
		boolean encore = true;
		while (encore){
			pCourant = saisirPointDate();		
			parcours.addPoint(pCourant);
			System.out.println("Distance parcourue : " + parcours.distance());
			System.out.println("Durée depuis le départ : " + parcours.duree() + " soit :" + parcours.duree()/1000 + " secondes" );
		....
			System.out.println("On continue ? (true or false)");
			encore = sc.nextBoolean();
			Thread.sleep(intervalle);  //1000 milliseconds is one second.
		}
		return parcours;	
	}
 
	private PointDate saisirPointDate() {
		PointDate pCourant;
		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();
		pCourant = new PointDate(x,y,date);
		return pCourant;
	}
2016_2017/s2/td/td_codeavance.1488641644.txt.gz · Last modified: 2017/03/04 16:34 by blay