This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
2019_2020:s3:concprogobjet:td:tdreutilisation [2019/11/04 22:43] blay [Réutilisation par composition et héritage] |
2019_2020:s3:concprogobjet:td:tdreutilisation [2019/11/08 17:19] blay [Réutilisation par composition et héritage] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== TD Réutilisation ====== | + | ====== TD Introduction aux "Design Patterns" et Réutilisation ====== |
Objectifs : | Objectifs : | ||
Line 45: | Line 45: | ||
===== Réutilisation par composition et héritage ===== | ===== Réutilisation par composition et héritage ===== | ||
+ | <note tip>Un réseau social peut être vu comme un graphe. | ||
+ | * //Rechercher des relations entre ses membres// revient à parcourir le graphe. | ||
+ | * Utilisez la classe ''GrapheSimple''((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 )). | ||
+ | </note> | ||
+ | |||
+ | <note warning>Personne n'écrit la moindre ligne de code sans avoir réfléchi sur papier au modèle UML correspondant à l'implémentation qu'il s'apprête à réaliser. Aucune aide ne sera apportée si ce modèle ne peut pas être montré. </note> | ||
+ | |||
+ | |||
+ | |||
- Vous devez construire un réseau social dont les spécifications sont les suivantes (cf. Interfaces //SocialNetworkInterface// et //MemberInterface//): | - Vous devez construire un réseau social dont les spécifications sont les suivantes (cf. Interfaces //SocialNetworkInterface// et //MemberInterface//): | ||
- | * un membre //a// un nom, une localisation (String) et une introduction (String); | + | * un réseau social est un ensemble de membres qui sont en relation; |
- | * Un membre //a// est en relation avec membre //b// avec une force entre Faible (LOW) et Très forte (STRONG). Plus la relation est forte plus on considère que la distance est courte. | + | * un membre a un nom, une localisation (String) et une introduction (String); |
+ | * Un membre //a// est en relation avec membre //b// avec une force entre Faible (LOW) et Très forte (STRONG). Plus la relation est forte plus on considère que la distance est courte. La classe //Strength// qui représente cette force vous est donnée. | ||
* //a// peut se considérer en relation avec //b// à la force STRONG et //b// ne pas se considérer en relation avec //a//! | * //a// peut se considérer en relation avec //b// à la force STRONG 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 : | * On veut pouvoir savoir quels sont les membres en relation avec un membre au rang X : | ||
Line 56: | Line 66: | ||
* Méthode : ''relateToRank(MemberInterface member, int rank)'' | * Méthode : ''relateToRank(MemberInterface member, int rank)'' | ||
* On veut pouvoir calculer la distance entre 2 personnes, en choisissant la plus courte distance : | * On veut pouvoir calculer la distance entre 2 personnes, en choisissant la plus courte distance : | ||
- | * exemple : a --1--> b --5--> c et a --2--> d --5-> c : | + | * exemple : a --STRONG(1)--> b --LOW(4)--> c et a --HIGH(2)--> d --LOW(4)-> c : |
- | * la distance est de 1 entre a et b ; | + | * la distance est : de 1 entre a et b ; de 2 entre a et d; |
- | * elle est de 2 entre a et d; | + | * la distance est de 5 entre a et c (1 + 4 qui est plus court que 2+4 ) |
- | * la distance est de 6 entre a et c (1 + 5 qui est plus court que 2+5 ) | + | |
* Méthode : ''distance(MemberInterface de, MemberInterface a)'') | * Méthode : ''distance(MemberInterface de, MemberInterface a)'') | ||
+ | * D'autres méthodes doivent être définies, il suffit de lire l'interface "SocialNetworkInterface". | ||
- | D'autres méthodes doivent être définies, il suffit de lire l'interface "SocialNetworkInterface". | ||
- | |||
- | <note tip>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 **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. | ||
- | {{ :2018_2019:s3:concprogobjet:td:existant.gif?direct&300 |}} | ||
- | |||
- | Celle-ci les interfaces à implémenter | ||
- | {{ :2018_2019:s3:concprogobjet:td:reseau.gif?direct&300 |}} | ||
- | |||
- | </note> | ||
<note warning>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.</note> | <note warning>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.</note> | ||
Line 82: | Line 78: | ||
- On veut intégrer dans notre réseau social, des membres du réseau ''facebookGhost''. Lisez bien toute la suite avant de commencer. | - On veut intégrer dans notre réseau social, des membres du réseau ''facebookGhost''. Lisez bien toute la suite avant de commencer. | ||
- | * Les classes du package //facebookGhost// s'inspirent très fortement de l'interface fournie par Facebook. En cela, elles se comportent comme un "Mock" 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)). ). | + | * Les classes du package //facebookGhost// s'inspirent très fortement de l'interface fournie par Facebook. En cela, elles se comportent comme un "Mock" simplifié qui pourrait être remplacé par le véritable réseau 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)); | + | * On veut ajouter dans notre réseau des membres qui correspondent à des "Users" du réseau 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//) | + | - 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 les membres de notre réseau qui sont associés à un User de FG ne contiennent pas de //description//. La demande de description d'un tel membre dans notre réseau correspond à retourner son profil défini dans le réseau FG ((En résumé, si vous modifiez votre profil dans facebook, vous n'avez pas besoin de le mettre à jour notre réseau)) ; | + | - l'accès à son introduction ou à sa localisation correspondent respectivement à son profil et à sa Home dans FG. Ces dernières informations peuvent évoluer dans FG. Nous voulons donc qu'elle soit toujours à jour dans notre réseau. Que faire? En tous cas, IL NE FAUT PAS simplement recopier ces valeurs dans le membre de notre réseau. |
+ | - on garde la référence sur le "User" pour avoir toujours une **introduction** à jour qui correspond au //profil//. Ainsi les membres de notre réseau qui sont associés à un User de FG ne contiennent pas de //introduction//. La demande de introduction d'un tel membre dans notre réseau correspond à retourner son profil défini dans le réseau FG ((En résumé, si vous modifiez votre profil dans facebook, vous n'avez pas besoin de le mettre à jour notre réseau)) ; | ||
- on "récupère" dans notre réseau, les **relations** définies dans le réseau FG lorsque | - on "récupère" dans notre réseau, les **relations** définies 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; | - les users ciblés sont connus de notre réseau, c'est à dire que nous avons déjà un membre de même nom; |