====== TD Réutilisation ======
Objectifs :
* Apprendre à réutiliser des codes
* Utilisation du pattern Adapter
* Utilisation du pattern Observer
A la fin du TD, se trouvent des ressources (codes entre autre) indispensables à la réalisation de ce TD.
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.
Faire passer le test avec un code propre et sans le modifier si ce n'est la référence à la classe "//SocialNetwork//" qui implémente //SocialNetworkInterface//.
Voici les archives :
- {{:2016_2017:s3:concprogobjet:td:reseausocialtests.zip|contenant la classe de test}}
- {{:2016_2017:s3:concprogobjet:td:reseausocial.zip|les interfaces à implémenter pour faire passer les tests, }}
- {{:2016_2017:s3:concprogobjet:td:facebookghost.zip|les classes définissant le réseau Facebookghost,}}
- {{:2016_2017:s3:concprogobjet:td:graphesimple.zip| les classes de gestion des graphes simples }}, les {{:2016_2017:s3:concprogobjet:td:graphex.zip|classes de base de gestion des graphes}}
- et une {{:2016_2017:s3:concprogobjet:td:graphesimpletest.zip|classe de tests sur les graphes.}}
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 =====
- Construire un réseau social :
* un membre a un nom, un age 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 |}}
===== Réutilisation par adaptation =====
- On veut intégrer dans notre réseau social, des membres du réseau ''facebookGhost'' dont vous avez déjà récupéré un "bouchon/proxy" en récupérant les tests.
* on veut ajouter dans notre réseau des membres qui correspondent à des "users" du reseau facebookGhost (FG); le nom du "user" dans le reseau facebookGhost (name) devient le nom du membre dans notre réseau (nom) et on garde la référence sur le "User" pour avoir toujours une description à jour qui correspond au profil;
* on veut "récupérer" 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 reseau 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 :
* 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, celle entre Hercule et Admete est ajoutée avec une force de 3; nous mettons également à jour les relations inverses.
===== Réutilisation par observation =====
Chaque fois qu'une nouvelle relation est ajoutée dans FG, on vérifie 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.
Pour cela nous utilisons le fait qu'un réseau FG est observable. 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.
===== 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