Design Pattern et C++ 2

Design Pattern et C++ 2 - C++ - Programmation

Marsh Posté le 09-05-2002 à 12:04:35    

Me revoilou,...
je tiens tout d'abord à remercier youdontcare car le  
module de gestion d'images marche super bien et c'est super
clean...merci egalement aux autre (j'ai su en plus que kadreg
etait un partisant de linufr, power linux!)...
 
enfin, les choses se compliques un peu, en effet j'aimerai
garder cette structure factory/serializer (classe de base abstraite co interface) et specialisation ds les filles...mais
voilà, j'ai recupere, me suis renseigne sur des sites et mon
probleme se pose par rapport a une regle enoncee ds POO (cf design-up), je cite:
 
L'héritage est donc d'autant plus efficace que la substitution est parfaite.
Comme toujours cela est plus facile à dire qu'à faire : tôt ou tard apparaît une sous-classe qui ne
"rentre pas dans l'interface", et là deux solutions s'offrent au développeur :
?  soit il reste ferme sur l'interface et impose aux utilisateurs de la sous-classe de recourir au
"downcast" pour traiter le cas particulier, ce qui entraîne une violation de l'OCP,
?  soit il élargit l'interface pour couvrir ce cas particulier, mais il impose alors aux autres sous-classes
une partie d'interface qui ne leur correspond pas (typiquement sous la forme de
méthodes définies dans l'interface mais dont l'implémentation restera vide dans les classes
dérivées), avec cette fois-ci une violation du LSP.
 
...Voilà mon probleme,
 
mon interface est la translation d'un objet ds l'espace
(on renvoi le vecteur position P), les classes specialise
n'ayant pas la meme meth pour le calculer
(soit evaluateur(bezier), soit parametric, soit physique (pfd))
 
le pb est que chaque fille ne s'initialise pas de la meme maniere
...d'apres le poo, il ne faut pas toucher à l'interface,
mais alors mes fonction d'init relatives a chaque filles
ne sont que ds las filles...
 
de plus, comment arriver (via la factory) a selectionner la
classe, ds la classe image, on passait l'image, donc c'etait
explicite, enfin...voilà a quoi je veux arriver, sachant que
cube est un objet d'une classe OBJECT reprenant par aggregation
le module de MOUVEMENT (pouvant s'appliquer aux camera, light,...)
 
OBJECT cube;
cube.Start(v1);
cube.Stop(v2);
cube.Ctrl(V3);
cube.Ctrl(V4);
....cube.GetPosition();
=>factory selectionne evaluateurs (implicite en fonction des
fonctions passees)
 
OBJECT cube;
cube.Start(v1);
cube.SpeedInit(v2);
cube.ApplyPesanteur(9.81);
cube.ApplyElastic(-1.3);
...cube.GetPosition();
 
=>factory selectionne physical (implicite en fonction des
fonctions passees)
 
OBJECT cube;
cube.Function(V...)
cube.Start(t1);
cube.Stop(t2);
...cube.GetPosition();
 
=>factory selectionne parametric (implicite en fonction des
fonctions passees)
 
...voilà, c'est pas evident a explique, mais j'ai du mal a trouver des infos sur le net, je ne veux pas de code, simplement
l'architecture adequat pour regler ce genre de pbs.....
je cherche tjs de mon cote biensure...
merci.

Reply

Marsh Posté le 09-05-2002 à 12:04:35   

Reply

Marsh Posté le 09-05-2002 à 12:32:45    

voui.....

Reply

Marsh Posté le 09-05-2002 à 12:45:18    

Je crois que tu as besoin d'un Visitor.
 
"The purpose of the Visitor Pattern is to encapsulate an operation that you want to perform on the elements of a data structure. In this way, you can change the operation being performed on a structure without the need of changing the classes of the elements that you are operating on. Using a Visitor pattern allows you to decouple the classes for the data structure and the algorithms used upon them."
 
cf : http://exciton.cs.oberlin.edu/java [...] attern.htm

Reply

Marsh Posté le 09-05-2002 à 13:23:24    

djkurgan a écrit a écrit :

voilà, c'est pas evident a explique


effectivement, je comprends rien :??:

Reply

Marsh Posté le 09-05-2002 à 13:40:41    

Ok, on ne regarde que l'exemple du cube, un p'tit ex
vaux mieu qu'une longue explication...
 
class translation
{
   virtual VERTEX GetPosition()=0;
   virtual Speed(float vit);
   virtual Speedfct(); //ptr de fct
   //je ne sais pas ce que je dois mettre vis a vis des filles
     puisque les les fcts ne sont pas ttes communes
 
}
 
class transFactory
{
//registre contenant les differents mouvement
//GetPosition
}
 
class Bezier:public translation
{
   virtual Start(VERTEX v1);
   virtual Stop(VERTEX v2);
   virtual Control1(VERTEX vc1);
   virtual Control2(VERTEX vc2);
   virtual VERTEX GetPosition();
}
 
class Parametric:public translation
{
   virtual Function(); //ptr de fct
   virtual Start(float t1);
   virtual Stop(float t2);
   virtual VERTEX GetPosition();
}
 
class Physical:public translation
{
   virtual Start(VERTEX v1);
   virtual SpeedStart(VERTEX v2);
   virtual Pesanteur(float gravity);
   virtual Elastic(float coeff);...
   virtual VERTEX GetPosition();
}
 
bis repetita
 
enfin...voilà a quoi je veux arriver, sachant que  
cube est un objet d'une classe OBJECT reprenant par aggregation  
le module de TRANSLATION (pouvant s'appliquer aux camera, light,...)  
 
OBJECT cube;  
cube.Start(v1);  
cube.Stop(v2);  
cube.Ctrl(V3);  
cube.Ctrl(V4);  
....cube.GetPosition();  
=>factory selectionne evaluateurs (implicite en fonction des  
fonctions passees)  
 
OBJECT cube;  
cube.Start(v1);  
cube.SpeedInit(v2);  
cube.ApplyPesanteur(9.81);  
cube.ApplyElastic(-1.3);  
...cube.GetPosition();  
 
=>factory selectionne physical  
OBJECT cube;  
cube.Function(V...)  
cube.Start(t1);  
cube.Stop(t2);  
...cube.GetPosition();  
 
=>factory selectionne parametric  
 
voilà, ca va mieux ? ;)

Reply

Marsh Posté le 09-05-2002 à 13:41:46    

desole j'ai pas mit d'espace ... :p quel con :D

Reply

Marsh Posté le 09-05-2002 à 13:48:13    

Effectivement, les visitors , ca a l'air d'etre pas mal...

Reply

Marsh Posté le 09-05-2002 à 16:06:50    

rien d'autre?
c'est pourtant plus interessant qu'un gars qui demande
500 balles pr 3 lignes de code ;)

Reply

Marsh Posté le 09-05-2002 à 16:24:24    

Le visitor c'est un design assez classique, et ça correspond exactement à ce que tu veux (enfin si j'ai bien compris ton pb).
 
A mettre en oeuvre c'est assez lourd par contre, et ça rend l'architecture assez illisible avec le seul code (un diagramme UML est bien plus clair à ce niveau).
 
Si tu te diriges vers cette solution, n'oublie pas mes 500 balles, merci :)

Reply

Marsh Posté le 09-05-2002 à 17:52:32    

bah voyons ;)
 
bon, si y'a pas plus d'infos, je vais regarde du cote des
visitors, merci....

Reply

Marsh Posté le 09-05-2002 à 17:52:32   

Reply

Marsh Posté le 09-05-2002 à 20:45:00    

je suis toujours pas sûr de comprendre ... :D
 
déjà plutôt que de dire "j'ai un problème X je veux utiliser une méthode Y mais ne pas violer la convention Z", tu devrais dire "je veux faire un système d'animation qui supporte ça et ça, qu'on utilise comme ça". (d'ailleurs c'est un des principes de l'"extreme" programming : écrire du code qui utilise les classes qu'on veut écrire, afin de voir si l'interface est OK).
 
parce que là, dériver d'un système d'animation, je trouve toujours que ça n'a pas grand chose à faire là, que ça alourdit la chose.  
 
par exemple dans 3d studio max, tu as une classe objet3d, une classe node qui recense une position dans l'espace et un objet3d. -> le même objet peut être affiché plusieurs fois sans avoir à être dupliqué (ou à hacker du code spécifique). c'est la position de la node qui est animée.
 
et arrête de vouloir tout ranger dans une jolie hiérarchie :) l'objet est utilie pour modéliser certains problèmes, pas pour d'autres. par exemple, un problème qui (a priori) a l'air tout con : tu veux utiliser une ellipse, un cercle. dérives-tu cercle de éllipse ou l'inverse ?  
* si tu dérives cercle de éllipse, ta classe éllipse a deux méthodes : setXRadius(), setYRadius(). mais cercle, dérivé de ellipse, viole cette conception, vu qu'il n'a qu'un seul radius.  
* si tu dérives ellipse de cercle, tu as une méthode setRadius() dans dans cercle. que rajoutes-tu dans ellipse ? setRadius2() ? ça modifie le radius x, y ?  
 
enfin, le problème est plus complexe, tu n'as qu'à jeter un oeil aux multiples threads sur groups.google : http://groups.google.com/groups?q= [...] %20ellipse
 
je t'entends dire "et pourquoi tu racontes tout ça ? ça n'a qu'un loitain rapport avec mon problème tout con d'animation" ! très simple. mettons que ta classe bézier interpole une position bézier. maintenant, tu veux améliorer ton moteur et rajouter la possibilité d'afficher des courbes bézier. que fais-tu, une nouvelle classe qui dérive de translation::bézier pour afficher ta courbe ? pourquoi pas, mais c'est très moche. et l'interface d'animation start() et stop(), tu n'en as que faire. encore mieux, tu veux utiliser translation::bezier de telle sorte qu'elle prenne en entrée une courbe de ta scène : tu peux dessiner une courbe bézier en 3d, tu veux que ton objet la suive. que dérives-tu, comment, pourquoi, combien de temps vas-tu te prendre la tête avec ce genre de problème qui avait l'air tout simple ?  
 
-> même solution que pour tes images, _séparer_. tu veux une classe qui te donne une sorte une position 3d interpolée d'une courbe en fonction d'un paramètre t. tu veux une classe qui affiche cette courbe dans la scène. tu veux une classe d'animation qui donne une nouvelle position à un objet. parmi ces classes d'animation, une qui peut utiliser une courbe, quelle que soit son origine (dans les 'ressources' du moteur, dan sun objet de la scène, etc). ça répondra aux besoins cités dans ce message. par contre, ce n'est pas la solution ultime là non plus.
 
en "relation reading" et pour illustrer le "ne pas utiliser une techno X JUSTE PARCE QUE", un article de jamie zawinski (ex codeur netscape) http://www.jwz.org/doc/mailsum.html , qui raconte comment netscape est passée par justement une phase objets & databases & hype & bloatware & au final c'était plus lent et plus buggé.

Reply

Marsh Posté le 09-05-2002 à 21:18:09    

hmm,
 
je suis ouvert a toutes propositions, qu'est-ce que tu me
conseil?

Reply

Marsh Posté le 09-05-2002 à 21:34:44    

cf premier et avant-dernier paragraphes.

Reply

Marsh Posté le 09-05-2002 à 21:35:37    

ça peut aussi se résumer à "code des tests, regarde la structure des mfc, de la sdk de half life, ..." etc.

Reply

Marsh Posté le 09-05-2002 à 21:40:32    

ok, merci.

Reply

Sujets relatifs:

Leave a Replay

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