[RESOLU] Intéraction entre deux objets - Meilleure façon de faire

Intéraction entre deux objets - Meilleure façon de faire [RESOLU] - C++ - Programmation

Marsh Posté le 13-03-2006 à 14:36:10    

Bonjour,
 
j'aimerais avoir un conseil sur la meilleure (plus élégante) façon de programmer une intéraction entre 2 objets
 
J'ai un objet A avec une méthode X et un objet B qui aura besoin, dans une méthode à lui (appelons-là "Y" ), d'appeler la méthode A::X pour un des objets A
 

Code :
  1. class A {
  2.    public:
  3.    ...
  4.    ...
  5.    void X(void);
  6. };
  7. void A::X(void)
  8. {
  9.     ...
  10. }
  11. class B {
  12.   public:
  13.   ...
  14.   ...
  15. };


 
Là, je me heurte à un dilemne. Pour que B puisse appeler A::X(), il faut que B connaisse l'objet A (évident). Donc j'ai plusieurs choix :

  • quand j'appelle la méthode "Y" de B, je lui passe en paramètre l'adresse du A que je veux traiter. Cela me donne :
Code :
  1. class B {
  2.   public:
  3.   void Y(A *pt);
  4.   ...
  5. };
  6. void B::Y(A *pt)
  7. {
  8.     pt->X();
  9. }


Ca fonctionne correct... mais si j'ai maintenant 50 méthodes de B qui ont besoin d'appeler X(), je dois passer à chaque méthode un pointeur vers A. Je suis pas emballé outre mesure.
 

  • quand je construits B, je passe à son constructeur un pointeur sur l'objet A. B stocke ce pointeur dans un de ses membres. Mais ensuite, toutes ses méthodes peuvent utiliser ce pointeur pour appeler X() et ça donne :
Code :
  1. class B {
  2.   public:
  3.   B(A *pt);
  4.   void Y(void);
  5.   ...
  6.   private:
  7.   A *pt;
  8. };
  9. B::B(A *pt)
  10. {
  11.      this->pt=pt;
  12.      ...;
  13. }
  14. void B::Y(void)
  15. {
  16.     pt->X();
  17. }


 
Zavez des conseils ou des idées sur la meilleure ou la plus élégante des solutions ? (ou une 3° que je ne connessoirais pas encore ?)
 
En vous remerciant.


Message édité par Sve@r le 13-03-2006 à 19:34:24
Reply

Marsh Posté le 13-03-2006 à 14:36:10   

Reply

Marsh Posté le 13-03-2006 à 14:43:47    

Les deux solutions que tu présentes ici montrent deux niveaux de dépendances différents.
 
Le premier cas est l'exemple d'une classe B qui utilise des objets de la classe A.  Le même objet B peut utiliser des objets A différents. Dans un diagramme UML, cela se traduit par une relation de dépendance de A sur B mais pas d'association. Un objet A est simplement employé en paramètre de signaux de B.
 
Le deuxième cas est caractéristique d'une association entre les classes A et B. Un seul objet A est associé à un objet B (il est possible de définir des accesseurs qui modifient cette relation). Le pointeur sur l'objet A que tu conserves a donc un rôle bien particulier dans la relation.  
 
La solution à retenir dépend donc de la relation qui lie tes classes A et B.

Message cité 2 fois
Message édité par slash33 le 13-03-2006 à 14:55:00
Reply

Marsh Posté le 13-03-2006 à 15:43:06    

slash33 a écrit :

Les deux solutions que tu présentes ici montrent deux niveaux de dépendances différents.
 
Le premier cas est l'exemple d'une classe B qui utilise des objets de la classe A.  Le même objet B peut utiliser des objets A différents. Dans un diagramme UML, cela se traduit par une relation de dépendance de A sur B mais pas d'association. Un objet A est simplement employé en paramètre de signaux de B.
 
Le deuxième cas est caractéristique d'une association entre les classes A et B. Un seul objet A est associé à un objet B (il est possible de définir des accesseurs qui modifient cette relation). Le pointeur sur l'objet A que tu conserves a donc un rôle bien particulier dans la relation.  
 
La solution à retenir dépend donc de la relation qui lie tes classes A et B.


 [:plusun]


---------------
TriScale innov
Reply

Marsh Posté le 13-03-2006 à 16:34:32    

Bonjour franceso. Comment va ?

Reply

Marsh Posté le 13-03-2006 à 18:55:09    

slash33 a écrit :

Les deux solutions que tu présentes ici montrent deux niveaux de dépendances différents.
 
Le premier cas est l'exemple d'une classe B qui utilise des objets de la classe A.  Le même objet B peut utiliser des objets A différents.


En effet...
 

slash33 a écrit :

Le deuxième cas est caractéristique d'une association entre les classes A et B. Un seul objet A est associé à un objet B (il est possible de définir des accesseurs qui modifient cette relation). Le pointeur sur l'objet A que tu conserves a donc un rôle bien particulier dans la relation.


Certes... mais comme tu les dis, je peux très bien avoir une méthode de B qui modifie "pt". Donc le même objet B peut utiliser des objets A différents (mais cela devient un peu plus compliqué si B va travailler sur A1 puis sur A2 puis de nouveau sur A1)
 

slash33 a écrit :

La solution à retenir dépend donc de la relation qui lie tes classes A et B.


Merci :)


Message édité par Sve@r le 13-03-2006 à 18:55:43

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-03-2006 à 18:56:34    

tu sais que en c++ void en parametre ca ne sert à rien ?

Reply

Marsh Posté le 13-03-2006 à 18:58:36    

skelter a écrit :

tu sais que en c++ void en parametre ca ne sert à rien ?


Euh, non je savais pas. C'est une habitude que j'ai du C d'indiquer qu'il n'y a pas de paramètre...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-03-2006 à 19:01:31    

Bon si tu as 50 méthodes qui utilises A dans ta classe B, j'opterai pour la seconde solution. Enfin à ce stade, il faut diviser ta classe.

Reply

Marsh Posté le 13-03-2006 à 19:06:59    

Mais d'après ta réponse, B peux utiliser des objets A différents. En dehors de toute considération de contexte, il est risqué de prendre la deuxième solution car il est probable que tu oublies une fois sur deux de changer la référence.
 
Pour moi, c'est assez simple: si un objet B est associé au même objet A ou si tu gères une espèce de contexte, optes pour la deuxième solution.
Sinon, utilises la première solution.
 
Un exemple classique d'utilisation : la gestion d'une session (1 seul objet pour toute la durée de la session). Pour ne pas te prendre la tête, tu décides de donner une visibilité sur la session en cours. Mais tu aurais pu gérer une méthode statique (3ème solution) !

Message cité 1 fois
Message édité par slash33 le 13-03-2006 à 19:10:33
Reply

Marsh Posté le 13-03-2006 à 19:33:30    

slash33 a écrit :

Bon si tu as 50 méthodes qui utilises A dans ta classe B, j'opterai pour la seconde solution. Enfin à ce stade, il faut diviser ta classe.


Le terme "50" n'avait qu'un but illustratif signifiant "plusieurs"  ;)  
 

slash33 a écrit :

Mais d'après ta réponse, B peux utiliser des objets A différents. En dehors de toute considération de contexte, il est risqué de prendre la deuxième solution car il est probable que tu oublies une fois sur deux de changer la référence.


Probablement...
 

slash33 a écrit :

Pour moi, c'est assez simple: si un objet B est associé au même objet A ou si tu gères une espèce de contexte, optes pour la deuxième solution.
Sinon, utilises la première solution.


Oui, c'est probablement ce qu'il y a de mieux à faire
Merci :)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-03-2006 à 19:33:30   

Reply

Marsh Posté le 14-03-2006 à 10:02:11    

slash33 a écrit :

Bonjour franceso. Comment va ?


Ca va bien, merci. Et toi ?

Reply

Marsh Posté le 14-03-2006 à 10:37:21    

Ben toujours en recherche d'emploi (la réponse qui tue) :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed