====== TD Réutilisation ======
Objectifs :
* Apprendre à réutiliser des codes
* Utilisation du pattern Adapter
* Utilisation du pattern Observer
* Utilisation des Mocks
Ce TD est un peu moins guidé que les précédents. Peu à peu vous devez pouvoir lire un énoncé et construire seul votre solution.
Nous y passerons seulement 2 séances. Il est conseillé de commencer à travailler de suite !
===== Présentation générale =====
Faire passer les tests sans les modifier si ce n'est la référence à la classe "//SocialNetwork//" qui implémente //SocialNetworkInterface// et en développant un code propre.
Voici les archives : //((Tips : Prenez chaque archive, déposer la sous Eclipse, dezipper, refresh))//
- les {{:2016_2017:s3:concprogobjet:td:graphex.zip|classes de base de gestion des graphes}}
- {{:2016_2017:s3:concprogobjet:td:graphesimple.zip| les classes de gestion des graphes simples }}(Regardez bien **ces classes** et construisez rapidement à la main le modèle de classe correspondant),
- une {{:2016_2017:s3:concprogobjet:td:graphesimpletest.zip|classe de tests sur les graphes.}} (pensez à la mettre dans un source folder dédié aux tests; Fixer le setup en ajoutant JUnit; exécutez les tests)
- {{:2016_2017:s3:concprogobjet:td:facebookghost.zip|les classes définissant le réseau Facebookghost,}}
- {{:2016_2017:s3:concprogobjet:td:reseausocial.zip|les interfaces à implémenter pour faire passer les tests, }}
- {{:2016_2017:s3:concprogobjet:td:reseausocialtests.zip|la classe de test}} (A bien mettre sous tests; elle ne compile pas puisque VOUS devez implémenter les classes manquantes).
**Vous n'avez que deux interfaces à implémenter : ''SocialNetworkInterface'' et ''MemberInterface''.
Ce qui suit est là pour vous aider.** }}
La figure suivante visualise les interfaces et classes fournies pour les tests.
{{ :2016_2017:s3:concprogobjet:td:capture_d_e_cran_2016-10-16_a_22.07.17.png?direct&300 |}}
{{ :2016_2017:s3:concprogobjet:td:capture_d_e_cran_2016-10-16_a_22.42.15.png?direct&300 |}}
===== Réutilisation par composition et héritage =====
- Vous devez construire un réseau social dont les spécifications sont les suivantes (cf. Interface //SocialNetworkInterface//):
* un membre a un nom, un âge et une description;
* Un membre a est en relation avec membre b avec une force entre 1 et 5 : 5 faible, 1 très forte. a peut se considérer en relation avec b à la force 1 et b ne pas se considérer en relation avec a!
* On veut pouvoir savoir quels sont les membres en relation avec un membre au rang X : exemple : a -> b -> c -> a : a est en relation avec b au rang 1; a est en relation avec c au rang 2; c est relation avec a au rang 1; etc. (Méthode : ''relateToRank(MemberInterface member, int rank)'')
* On veut pouvoir calculer la distance entre 2 personnes, en choisissant la plus courte distance :
* a --1-> b --5-> c et a --2-> d --5-> c : la distance est de 6 entre a et c;(Méthode : ''distance(MemberInterface de, MemberInterface a)'')
D'autres méthodes doivent être définies, il suffit de lire l'interface "SocialNetworkInterface".
Un réseau social peut être vu comme un graphe.
Rechercher des relations entre ses membres, revient à parcourir le graphe.
Pour vous aider (et c'est aussi obligatoire ;-) ) vous utiliserez les classes suivantes,{{:2015_2016:s3:concprogobjet:td:pourlesgraphes.zip| classes pour traiter des graphes.}}, en particulier **la classe ''GrapheSimple'' et la classe ''ParcoursSimple''** pour calculer des chemins ((Ces codes sont basés sur le package GrapheX fournis par l'"X" dans ses cours, pour en savoir plus (page évolutive): https://www.enseignement.polytechnique.fr/informatique/INF431/X06-2007-2008/TD/INF431-td_6-1.php )).
La figure suivante visualise une part de ces codes.
{{ :2015_2016:s3:concprogobjet:td:graphessimple.jpg?direct&300 |}}
{{ :2015_2016:s3:concprogobjet:td:graphex.jpg?link&300 |}}
Cette partie du TD doit être terminée lors de la 1e séance. Si ce n'est pas le cas, vous devez travailler en dehors des heures du TD.
===== Réutilisation par adaptation =====
- On veut intégrer dans notre réseau social, des membres du réseau ''facebookGhost''. Lisez bien toute la suite avant de commencer.
* Vous avez déjà récupéré un "bouchon/proxy". En effet, les classes du package //facebookGhost// s'inspirent très fortement de l'interface fournie par Facebook. En cela, elles se comportent comme un "proxy" simplifié qui pourrait être remplacé par le véritable reseau Facebook à terme((Pour cela, il faudrait quand même mettre à jour ce code avec les dernières évolutions de l'interface et le compléter... donc il reste "un peu" de travail)). ).
* On veut ajouter dans notre réseau des membres qui correspondent à des "users" du reseau facebookGhost (FG). Pour cela, il suffit de créer le membre en déclarant qu'il existe dans un autre réseau((Comme vous le feriez en vous demandant à vous connecter par votre compte facebook par exemple));
* le nom du "user" dans le reseau facebookGhost (name) devient le nom du membre dans notre réseau (nom)
* on garde la référence sur le "User" pour avoir toujours une description à jour qui correspond au profil, ainsi notre réseau ne contient pas la description du membre mais à la demande de description, on va la chercher dans le réseau FG ((En résumé, si vous modifiez votre profil dans facebook, vous n'avez pas besoin de de mettre à jour celle-ci dans l'autre réseau)) ;
* on "récupère" dans notre réseau, les relations qui correspondent soit à des relations familiales, soit à des relations d'amitiés dans le réseau FG **lorsque les users ciblés sont connus de notre réseau**, c'est à dire que nous avons déjà un membre de même nom. Par défaut, une relation de famille correspond à une relation de force 2 dans notre réseau et celle d'amitié ont une force 3.
* Quand on ajoute dans notre réseau un membre correspondant au réseau FG, on recherche parmi ses relations directes dans FG s'il existe des users connus de notre propre réseau et on lui ajoute les relations si elles n'existaient pas, exemples :
* Exemple : Hercule est connu du réseau FG et se déclare comme membre de notre réseau (''addMember("Hercule", true)'')
* On récupère du réseau FG son nom.
* On récupère sa famille (Zeus, Alcmène) et ses amis (Admète)
* Seuls Zeus et Admete sont connus de notre réseau; la relation de Hercule vers Zeus est ajoutée avec une force de 2 (lien de famille), celle entre Hercule et Admete est ajoutée avec une force de 3 (lien d'amitié); nous mettons également à jour les relations inverses avec la même force.
===== Réutilisation par observation =====
Le réseau FG évolue. De nouvelles relations sont régulièrement créées et notre propre réseau peut alors devenir obsolète si les membres impliqués font partie de notre réseau et que nous n'enregistrons pas ces changements de relations. Mais bien sûr, il est impossible de modifier les codes du réseau FG....
Heureusement, le réseau FG est observable. On peut donc demander à être notifiés des modifications du réseau FG!
Chaque fois qu'une nouvelle relation est ajoutée dans FG on veut vérifier si les "users" mis en relation existent dans notre réseau et si c'est le cas on crée les relations correspondantes dans notre réseau.
Il suffit donc de déclarer notre réseau comme Observer du réseau FG et à chaque notification d'ajout d'une relation, de mettre à jour notre propre réseau si c'est nécessaire.
===== Rendu =====
- un diagramme UML qui visualise uniquement les classes/interfaces dont votre code dépend directement.
* le diagramme vise à visualiser l'architecture de votre solution
* les attributs faisant référence à des classes/interfaces sont uniquement représentés sous la forme d'associations (rôle, cardinalité, orientée)
* pas de getter et setter
* pas de classes non directement utilisées par exemple, GrapheX etc.
* les différents patterns apparaissent sous forme d'annotations
* le diagramme peut être obtenu par reverse-engineering mais doit être adapté pour répondre aux points précédents.
- les codes sources des classes que vous avez créées ou modifiées exclusivement.
La date du rendu au plus tard : 28/11 à 23h45
Sur [[http://jalon.unice.fr/cours/blay/Cours-blay-20150930110548/BoiteDepot-blay-20161116105407498020|Jalon]] avec comme nom pour l'archive : Gr + Nom des étudiants dans le groupe