User Tools

Site Tools


2014_2015:s3:concprogobjet:td:td3

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
2014_2015:s3:concprogobjet:td:td3 [2014/09/19 17:19]
blay [Responsabilités]
2014_2015:s3:concprogobjet:td:td3 [2015/02/16 08:45] (current)
blay [Responsabilités]
Line 41: Line 41:
 {{ :​2014_2015:​s3:​concprogobjet:​td:​busetape2.png?​direct&​200 |}} {{ :​2014_2015:​s3:​concprogobjet:​td:​busetape2.png?​direct&​200 |}}
  
 +<note tip>Pour vous aider vous pouvez dans un premier temps, ne pas tenir compte de la boîte de messages par défaut et n'en tenir compte qu'à la fin du TD en identifiant bien les impacts sur le modèle et sur le code, en particulier avec les responsabilités qui en résultent.</​note>​
  
   - Quels modèles utilisez-vous pour analyser le problème ?   - Quels modèles utilisez-vous pour analyser le problème ?
Line 49: Line 49:
   - Qui est responsable de créer un message ? pourquoi? (Pattern créateur)   - Qui est responsable de créer un message ? pourquoi? (Pattern créateur)
   - Avez-vous des relations bi-directionnelles?​ Si oui, avez-vous décidé de qui est le "​maître"​ et de qui est l'"​esclave"? ​   - Avez-vous des relations bi-directionnelles?​ Si oui, avez-vous décidé de qui est le "​maître"​ et de qui est l'"​esclave"? ​
-  - A partir de maintenant, on s'​intéresse au scénario suivant, sans tenir compte de l'​interface graphique, est-ce que vous pouvez l'​implémenter,​ revenez sur votre code si besoin : +  - A partir de maintenant, on s'​intéresse au scénario suivant, sans tenir compte de l'​interface graphique, est-ce que vous pouvez l'​implémenter,​ revenez sur votre code si besoin ​(Vous pouvez vous aider des tuyaux donnés plus bas si besoin)
       - Je crée un bus "​NiceInformation",​ et une  boite "​Circulation"​ sur ce bus.       - Je crée un bus "​NiceInformation",​ et une  boite "​Circulation"​ sur ce bus.
       - Je poste un message "​Embouteillage"​ dans la boite Circulation.       - Je poste un message "​Embouteillage"​ dans la boite Circulation.
Line 57: Line 57:
       - je demande à effacer le message "​Embouteillage"​.       - je demande à effacer le message "​Embouteillage"​.
       - J'​attends 2s (Thread.sleep(2000));​       - J'​attends 2s (Thread.sleep(2000));​
-      - Je demande à effacer tous les messages postés depuis plus de 2s.+      ​- Je pose un message "​SoireeIntegrationIUT"​ sur le bus "​NiceInformation"​ 
 +      - J'​attends 2s (Thread.sleep(2000));​ 
 +      ​- Je demande à effacer tous les messages postés depuis plus de 4s.
   - Regardez vos codes, et vérifiez que vous avez bien respecté la loi de Demeter. Si ce n'est pas le cas, corrigez vos codes.   - Regardez vos codes, et vérifiez que vous avez bien respecté la loi de Demeter. Si ce n'est pas le cas, corrigez vos codes.
   - Comment avez-vous géré la boîte par défaut? (Avez-vous pensé à définir des constantes?​)   - Comment avez-vous géré la boîte par défaut? (Avez-vous pensé à définir des constantes?​)
Line 66: Line 68:
   - Et si maintenant, on veut afficher les messages en fonction de l'​ordre d'​arrivée?​ Que modifiez-vous?​ Est-ce que vous auriez pu éviter certains changements si vous aviez utilisé des interfaces?   - Et si maintenant, on veut afficher les messages en fonction de l'​ordre d'​arrivée?​ Que modifiez-vous?​ Est-ce que vous auriez pu éviter certains changements si vous aviez utilisé des interfaces?
  
-<box round rgb(150,​290,​190) rgb(198,​226,​150) 75%|A la fin de cette séance (au plus tard en fin de semaine) >  +<box round rgb(150,​290,​190) rgb(198,​226,​150) 75%|A la fin de cette séance (au plus tard en fin de semaine) ​**(S3D : 20/2 à 23h59)** ​>  
-  * Dans votre répertoire de projetsous TD3, se trouvent+  * Mettez un mail à votre encadreur avec soit l'​adresse où récupérer le TD soit le TD lui-mêmedans le sujet du mail [S3D][TD3] Noms des participants au rendu : 
 +  * Le rendu consiste en 
        - Un document contenant ​        - Un document contenant ​
              * votre modèle final (Tout le monde n'​aboutit pas au même modèle, c'est certain)              * votre modèle final (Tout le monde n'​aboutit pas au même modèle, c'est certain)
              * des explications sur les raisons de ce modèle, les choix que vous avez faits et les leçons apprises.              * des explications sur les raisons de ce modèle, les choix que vous avez faits et les leçons apprises.
-       ​- ​optionnel : les codes et les tests. ​+       ​- ​Les codes et les tests. ​ 
 +       - Il est préférable que les codes soient commentés en respectant les consignes d'une javadoc ((utilisez simplement eclipse pour générer la stucture des commentaires par exemple)) 
 Dans cet exercice nous évaluons votre capacité à concevoir les bons modèles et la "​bonne"​ architecture relativement à vos objectifs. Des modèles incomplets sont évidemment considérés comme faux au regard de ces objectifs. ​ Dans cet exercice nous évaluons votre capacité à concevoir les bons modèles et la "​bonne"​ architecture relativement à vos objectifs. Des modèles incomplets sont évidemment considérés comme faux au regard de ces objectifs. ​
  
 </​box>​ </​box>​
    
-===== Responsabilités et Couplages =====+==== Tuyaux ​====
  
-On distingue deux formes ​de consommation ​pour un même modèle de voiture ​:  +Vous avez besoin dans ce TD de manipuler des collections et des dates, voici quelques tuyaux que vous pourriez retrouver sur le Web et qui sont extraits des codes que nous avons mis en oeuvre ​pour ce TD. Vous pouvez évidemment avoir d'​autres solutions ​:  
-  la consommation moyenne sur route ou urbaine [[http://​www.fiches-auto.fr/​articles-auto/​chiffres-consommation/​peugeot.php|exemples]] +   ​Pour parcourir une ArrayList (le for qui suit) 
-  la consommation ​en fonction de la vitesse ​ qui suit la règle suivante ​((extraite d'un [[http://www.ilemaths.net/​forum-sujet-219647.html|forum de mathématiques]])), elle ne prétend pas être vraie  +   ​Pour pouvoir effacer dans une liste que l'on parcourt, il faut d'​abord ​en faire une copie 
-<​code>​ C(v= 2(d/v+ K v^2 avec t en heures, d en km et k un coefficient variable en fonction des voitures. ​</​code>​ +<code Java> 
-Si une voiture roule à ''​150 km/​h''​ sa consommation ​est donc en ''​litre au 100km'' ​de : +ArrayList<​Message>​ messagesContenus = new ArrayList<​Message>​(messages);​ 
-<​code> ​C(150) = 2(100/150+ K 150^2 pour la Cl </​code>​ +        for (Message m messagesContenus) { 
-Avec un coefficient de ''​3,​85*10^-4'',​ ''​C(150= 9.99583333333;​ C(64= 4,7 litres au 100km''​+            if (m.perime(i)) { 
 +                ​m.detruire()
 +                messages.remove(m)
 +            } 
 +</​code>​ 
 +   * Une manière "​facile"​ pour savoir si un message ​est périmé ​de plus de x secondes ​:  
 +<​code ​java> 
 +  public boolean estPerime(int second)
 +        Date d new Date()
 +        long ms = d.getTime();​ 
 +        ms = ms - second*1000; 
 +        d.setTime(ms);​ 
 +        return this.dateEmission.before(d);​ 
 +    } 
 +</​code>​ 
 +    Si vous avez utilisé des HashMap vous avez peut être besoin de récupérer la liste des objets contenus comme par exemple :  
 +<code java> 
 +    public void detruireMessages(int i
 +       for (Boite b : boites.values()) { 
 +           ​b.detruire(i);​ 
 +       } 
 +</​code>​
  
-<note warning>​Essayez de ne pas tricher, répondez aux questions une par une. </​note>​ 
  
-  - Pour certains modèles de voitures, nous disposons de ces informations. Quelle modélisation proposez-vous pour répondre à des questions comme :  +===== Responsabilités et Couplages ​=====
-      * quelle est la consommation moyenne du modèle Clio sur Route (rep. 6,3)? urbaine(rep. 8,1)? +
-      * quelle est la consommation moyenne d'une Clio à 150km/h? (mettons 3,85*10^-4 et donc une réponse de quasi 10, ... ce qui n'est pas du tout la réalité!!! ).  +
-  - Réfléchissez à l'​implémentation sur papier au moins.  +
-  - On intègre à présent la consommation "​Mixte",​ qu'​est-ce qui change dans votre modèle? dans votre code? +
-  - On vient d'​établir une formule ((C'​est possible, mais je ne l'ai pas trouvé...)) qui, **pour certains modèles de voitures**, à partir des données connues en circulation urbaine ou sur route permet de déterminer le coefficient K, selon la formule suivante : Au dessus de 100 on prend en compte la consommation sur route que l'on multiplie par 10^-4, entre 100 et 50, la consommation mixte et en dessous urbaine. Quelle modèlisation proposez-vous ?  Quel est le couplage entre vos classes? Avez-vous bien supporté l'​extension?​  +
-  - Comment est-il possible de créer un modèle de voiture? Quel est le diagramme de séquence associé (sur papier a minima)? Quel est le code? +
-  - En fait, pour certains modèles de voiture (par exemple, les Renaults), les consommations moyennes sont obtenues par des requêtes à un service externe qui, en fonction des informations sur le modèle (on se limite au nom et à l'​année,​ par exemple // Clio 2// et  //2000//), nous renvoie une chaine de caractères au format JSON, par exemple ''​{"​consommation":​ {"​route"​ : "​6.3",​ "​urbaine"​ : "​8.1"​ } }'',​ Intégrer ce type de "​calcul"​ de la consommation dans votre modélisation,​ quel est l'​impact?​ +
-  - Que retenez-vous?​ +
- +
- +
- +
-<box round rgb(150,​290,​190) rgb(198,​226,​150) 75%|A la fin de cette séance (au plus tard en fin de semaine) >  +
-  * Dans votre répertoire de projet, sous TD2, se trouvent:  +
-       - Un document contenant  +
-             * votre modèle final (Tout le monde n'​aboutit pas au même modèle, c'est certain) +
-             * des explications sur les raisons de ce modèle (dont vous êtes très fiers) et les leçons apprises. +
-       - Les codes et les tests. Pensez bien que le service externe ne doit pas être implémenté. Une fonction qui pour l'​instant retourne à chaque fois la même chaine de caractère convient très bien, et vous considérerez aussi la transformation d'une chaine de caractère JSON en "autre chose" comme donnée. +
-</​box>​ +
-  +
-<​html>​ +
-<!-- +
- +
-AJOUTER la gestion de l'​ordre des messages dans une boîte +
- +
-===== Refactoring et Duplication ===== +
- +
-Le bus est maintenant composée de boîtes à messages. +
-Plusieurs producteurs peuvent émettre des messages vers une même boîte, plusieurs consommateurs peuvent lire les messages dans une boite.  +
- +
-//Exemples de scénario ://  +
-   - La voiture A a choisi d'​émettre son message vers la boîte "Etat Des Routes"​. +
-   - La voiture B demande combien il y a de messages dans la boite "Etat Des Routes"​ +
-   - La voiture B demande les messages qui se trouvent dans la boite "Etat des Routes"​ et récupère le message émis par la voiture A.  +
-   - La voiture A efface le message qui se trouve dans la boite "Etat Des Routes"​. +
-   - L'​agence "​X"​ demande tous les messages courants. +
- +
- +
-**A FAIRE :**  +
-  - Proposer un modèle de classes en conception +
-  - Vérifier que tous les scénarios sont "​faisables"​. Pour cela vous pouvez construire des diagrammes de séquence. +
-  - Vérifier les propriétés vues en cours : orthogonalité?​ +
-  - Implémenter et tester votre code sur les scénarios donnés. +
- +
-  - On sait que l'on a très souvent besoin de connaître le nombre de messages dans une boîte que proposez-vous?​ +
-===== Donnez-nous des exemples ===== +
- +
-Prenez le cours et vos codes passés un peu "​conséquent"​ et donner des exemples de codes STUPID (au moins Deux exemples différents) et ce que vous feriez maintenant pour ne plus faire les mêmes erreurs. +
-Rendu noté sur la pertinence des réponses. +
- +
- +
-===== Polymorphisme ===== +
- +
-Le bus supporte à présent différents types de messages : Rémanent, Ephemere, Fondamental,​ Protegé, Intelligent ... +
- +
-Chacun de ces types de messages répond aux exigences suivantes concernant leur cycle de vie. +
- +
-^  ^ Création ^ Lecture ^ MiseAJour ^ Destruction^ +
-^ Rémanent| Il connait son créateur | --- | Peut être mis à jour par son créateur| Ne peut être détruit que pas son créateur| +
-^ Ephemere| --- | Est automatiquement retiré de sa boîte dès qu'il est lu| Ne peut pas être mis à jour| Ne peut être détruit que s'il n'est plus dans une boite| +
-^Temporel|Il connait la date où il a été créé et sa durée |Il ne peut être lu que s'il n'est pas périmé. S'il est périmé, il est détruit lorsque l'on demande à le lire|Peut être mis à jour| Est automatiquement détruit quand il est périmé| +
-^ Intelligent|Il connait son créateur|N'​est proposé qu'à ceux qui ne l'ont pas encore lu| Ne peut pas être mis à jour|Ne peut être détruit que si il a été lu au moins une fois|| +
-^ Re-armable | --- | --- | Il peut être réactivé | Il disparait en lecture au bout d'un temps donné, il doit alors être réactivé et s'il n'est pas re-armé, au bout d'un certain temps il est détruit| +
-  +
-**A FAIRE** +
-  - Proposer un modèle de classes en conception +
-  - Vérifier que tous les scénarios sont "​faisables"​... +
-  - Vérifier les propriétés vues en cours  +
-  - Implémenter et tester votre code sur les scénarios donnés. +
-  - Vérifier que tous vos scénarios précédents sont toujours fonctionnels,​ en utilisant les tests. Si ce n'est pas le cas, mettez vos codes à jour pour satisfaire les tests. +
-  - Quel impact sur le calcul du nombre de messages dans une boîte ? +
- +
-Proposer un modele d'IHM de reception des messages pour les aider à comprendre... ou les laisser faire? +
-ou la leur donner et les laisser la connecter?​ +
- +
- +
- +
-===== Responsabilités ​===== +
- +
-En fonction des mots clefs qui constituent le contenu des messages, ils sont automatiquement associés à une boîte de message. Si aucune correspondance n'est détectée une boîte "​Divers"​ est utilisée. +
- +
-Exemples : +
-     - "​Accident " conduit à poster le message dans la boite "​URGENCE"​ +
-     - "​Danger " conduit à poster le message dans la boite "​URGENCE"​ +
-     - "photo " conduit à poster le message dans la boite "​SNAPCHAT"​ +
- +
-**A FAIRE** +
-    - Qui crée les messages? +
-    - Qui est responsable de filtrer les mots clefs?  +
-    - Quel est la complexité du filtrage? +
-    - Déterminer le couplage de vos classes +
- +
- +
-===== Abstraction ===== +
- +
-Si maintenant, on veut créer une nouvelle boîte qui reçoit les messages contenant contenant "​photo",​ que faut-il faire pour que votre système le prenne en compte? +
- +
-Si maintenant on veut que tout message dans la boite SNAPCHAT soit ephemere ? +
- +
- +
-===== Estimation de performance ===== +
- +
- +
-Une route est définie par des Tronçons. Un tronçon est défini par deux Positions ​et une longueur. Une Position est définie par un nom. +
- +
-Calculer le plus cours chemin entre deux positions. +
-Déterminer la complexité de votre algorithme. +
- +
- +
-=> Outils de recherche de code dupliqué?​ +
- +
- +
-===== Suites prévues pour ce projet =====  +
- +
-  * //​Objectifs ​ : refactoring,​ incrémentalité et agilité// : Le bus est maintenant composée de boîtes à messages :  +
-Le bus gère des "​boîtes à message"​. Plusieurs producteurs peuvent émettre des messages vers une même boîte, plusieurs consommateurs peuvent lire les messages dans une boite.  +
-Dans le scénario de base, la voiture A a choisi d'​émettre son message vers la queue "Etat Des Routes"​. Les consommateurs déclarent les boîtes qui les intéressent. Ils peuvent lire les messages qui les intéressent sur une boîte donnée ou obtenir tous les messages qui les intéressent indépendamment des boîtes. ​ Plusieurs types de messages? Qui est responsable de créer les messages? Qui connait les boîtes de messages ?  +
-  * //Objectifs : Apprentissage d'une famille courante de patterns (fabrique, builder) mais uniquement par l'​usage,​ la formalisation se fera en S4//: Les messages pouvant être de différentes natures, un bus devient "​porteur"​ d'une fabrique à messages. +
-  * //Objectifs : Prise en compte des IHMs et mise en place du pattern MVC à tous les niveaux// : Définir les interfaces graphiques qui nous permettraient d'​accéder "​simplement"​ à un bus pour émettre, lire et effacer des messages uniquement. +
-  * //Objectifs : Prise en considération des responsabilités uniques// : Routage en fonction des messages : La voiture A emet un message et le bus décide de la ou des boîtes à messages concernées. +
-  * //Objectifs : mise en oeuvre du pattern DAO + différents modèles de persistance + intégration par les interfaces + travail en équipe// : Les messages seront rendus persistants. Pour certaines boîtes les messages sont persistants,​ pour d'​autres non :   +
-  * Il est assez surprenant d'​effacer les messages au bout d'un certain temps alors que certains consommateurs ne les ont pas lu et de redonner le même message au même consommateur qui l'a déjà lu. Que feriez-vous pour : a) ne pas redonner le même message au même consommateur;​ b) donner les messages aux consommateurs qui ne les ont pas encore lu? quel écueil( le bus ne connait pas ses consommateurs!) ? quelle solution envisageriez-vous (un consommateur se déclare, une file d'​attente par consommateur,​ et le message est détuit lorsque plus aucune file n'y fait référence)?​  +
-- Il sera possible de définir différentes formes de souscription. +
- +
-Nous n'​aborderons,​ hélas, pas les aspects distribués.+
  
---!+Déplacé dans td4 
-</​html>​+
2014_2015/s3/concprogobjet/td/td3.1411139961.txt.gz · Last modified: 2014/09/19 17:19 by blay