Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1548 connectés 

  FORUM HardWare.fr
  Programmation

  Objet VS Structurel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Objet VS Structurel

n°68846
sombresong​e
Posté le 31-10-2001 à 22:48:53  profilanswer
 

:hello: Qu'est-ce qu'on peut faire avec l'approche Objet qu'on ne peut pas faire avec une approche structurel? (je veux dire dans la pratique)

mood
Publicité
Posté le 31-10-2001 à 22:48:53  profilanswer
 

n°68847
verdoux
And I'm still waiting
Posté le 31-10-2001 à 23:00:56  profilanswer
 

De plus, rien.
C'est juste une approche sans doute plus adaptée à des prochains complexes où on cherche à séparer des parties en éléments peu dépendants, exposant entre eux des interfaces.
A partir de là on peut parler de conception objet.
Et ça peut se faire avec des langages non objet. De nombreux frameworks applicatifs ont été écrits en Pascal ou en C.
 
Puis de langages vraiment objets sont apparus (Smalltalk par exemple) pour explorer plus en avant ce concept.
Mais même en C++ ou en Java (avec des méthodes statiques) on peut faire de la prog classique, comme en C.

n°68851
sombresong​e
Posté le 31-10-2001 à 23:08:39  profilanswer
 

DOnc ça sert à rien de me mettre à penser objet? Parceque je suis en train d'essayer d'y passer et j'ai l'impression que ça pose plus de problème que ça n'en résout... :sweat:

n°68853
verdoux
And I'm still waiting
Posté le 31-10-2001 à 23:13:13  profilanswer
 

Disons que dans l'absolu non.
Mais dans pas mal de cas, l'approche objet représente un réel gain.
La conception objet est apparu naturellement à bcp de développeurs alors même qu'il n'existait aucun langage objet.  
C'est une méthode tout de même efficace et quasiment "obligatoire" aujourd'hui dans le monde pro.

n°68859
sombresong​e
Posté le 31-10-2001 à 23:22:41  profilanswer
 

Hum par exemple l'héritage... j'ai l'impression qu'avec des structure imbriqué les une dans les autre je fait pareille en C qu'avec des clesse en C++ sauf que avec les classes ça devient vite le bordel avec les fonction amis, les héritage protéger... du coup je met tous les membre de mes classes en Public (parceque sinon je faisais une méthode set et une méthode get pour chaque données et que ça revenait au même que tout laisser en public) puis avec les référence qui ne sont pas mieux protéger que les pointeurs mais qui sont moins transparent (au moins avec un pointeur on savais qu'il fallait faire gaffe...)
Donc je me disais que quitte à faire la séparation Interface<->Donné je le faisais mieux en C avec des struct et de jolie fichier en tête ... :sweat:

n°68865
wpk
Posté le 01-11-2001 à 00:14:11  profilanswer
 

sombresonge a écrit a écrit :

Hum par exemple l'héritage... j'ai l'impression qu'avec des structure imbriqué les une dans les autre je fait pareille en C qu'avec des clesse en C++ sauf que avec les classes ça devient vite le bordel avec les fonction amis, les héritage protéger... du coup je met tous les membre de mes classes en Public (parceque sinon je faisais une méthode set et une méthode get pour chaque données et que ça revenait au même que tout laisser en public) puis avec les référence qui ne sont pas mieux protéger que les pointeurs mais qui sont moins transparent (au moins avec un pointeur on savais qu'il fallait faire gaffe...)
Donc je me disais que quitte à faire la séparation Interface<->Donné je le faisais mieux en C avec des struct et de jolie fichier en tête ... :sweat:  




 
 :non: cai pô bieng comme dirait l'autre
 
1. Les get et set sont pas la pour faire chier le monde, ca sert juste à encapsuler l'acces à tes attributs. Comme ca, tu peux faire plein de choses en plus : tests, transformations etc qui te permettent de t'assurer de la coherence interne de ton objet. Si tu mets tout en public ou ds une structure, tu ne pourra jamais etre sur que l'utilisateur n'initialisera pas sa classe Point avec des coordonnées en spherique alors que toi tu l'as concu pour marcher en cartezien...
 
2. L'heritage et le polymorphisme, c'est le deuxieme point fort de l'objet qui apporte bien plus que la simple aggregation d'une structure dans une autre. Il est vrai, qu'on peut se creer ses propres vtables en C à partir de pointeurs vers des fonctions, mais c'est bcp plus lourd et moins naturel que l'utilisation tres simple du mot clef virtual.
 
3. Les references, c'est pas compliqué, à la limite, en dehors de qcq cas bien precis (operateur de recopie, cstr de recopie redefinition d'operateurs...) tu peux les oublier.

n°68866
sombresong​e
Posté le 01-11-2001 à 00:19:56  profilanswer
 

wpk a écrit a écrit :

 
3. Les references, c'est pas compliqué, à la limite, en dehors de qcq cas bien precis (operateur de recopie, cstr de recopie redefinition d'operateurs...) tu peux les oublier.  




 
le problème c par exemple:
 
toto& fonction()
{
  toto MonToto;
   
  .
  .
  .
 
  return MonToto;
}
 
On retourne quoi? un pointeur? une recopie? j'y comprend rien à cette syntaxe :heink: !

n°68867
verdoux
And I'm still waiting
Posté le 01-11-2001 à 00:25:57  profilanswer
 

sombresonge a écrit a écrit :

 
 
le problème c par exemple:
 
toto& fonction()
{
  toto MonToto;
   
  .
  .
  .
 
  return MonToto;
}
 
On retourne quoi? un pointeur? une recopie? j'y comprend rien à cette syntaxe :heink: !  




Ca, c'est justement le code à ne pas écrire avec des références :D

n°68869
C_Po_Ma_Fa​ute
Posté le 01-11-2001 à 00:29:04  profilanswer
 

une référence est tout simplement un alias  :D

n°68870
sombresong​e
Posté le 01-11-2001 à 00:30:17  profilanswer
 

Verdoux a écrit a écrit :

 
Ca, c'est justement le code à ne pas écrire avec des références :D  




 
N'empeche que c des trucs que l'on voit de temps en temps dans des tutoriaux... :cry:

mood
Publicité
Posté le 01-11-2001 à 00:30:17  profilanswer
 

n°68871
sombresong​e
Posté le 01-11-2001 à 00:32:52  profilanswer
 

C_Po_Ma_Faute a écrit a écrit :

une référence est tout simplement un alias  :D  




 
Certe et une classe dérivé c une sorte de classe de base et un cercle c'est une sorte d'ellipse et mon programe il plante bizarement :sarcastic: !
 
Sérieusement Physiquement une référence c quoi? un pointeur déréférencer? une variable de recopie?

n°68875
wpk
Posté le 01-11-2001 à 00:54:09  profilanswer
 

cauchemar (desolé pour la blague cetait trop tentant),
est-ce que ca te viendrait à l'idee d'ecrire avec des pointeurs
 
toto * titi()
{
  toto unToto;
 
 
 
  return &unToto;
}
 
avec les references c'est exactement pareil, utilise les comme des pointeurs (sauf ke pour acceder à des mebres d'un obj passé par ref tu utilise le . à la place de -> )
 
ton code, il pourrait s'ecrire pour utiliser la recopie :
 
toto  titi()
{
  toto unToto;
 
 
 
  return unToto;
}
 
auquel cas, c'est pas une ref que tu retournes mais un obj qui va etre recopie de sur la pile vers ton objet à toi.
 
Certe et une classe dérivé c une sorte de classe de base et un cercle c'est une sorte d'ellipse et mon programe il plante bizarement   !
 
un cercle c'est une ellipse et ca peut aussi etre vu comme un objet graphique. Or un objet graphique, la moindre des chose c'est qu'il puisse etre dessiné. Donc si jamais t'as une liste d'obj graphiques (peu importe ce qu'il y a dedans : cercles, elipses, carres....) si tous savent repondre au message dessine toi !, c'est parfait, tu itere cette requette sur toute ta liste et tout se dessine comme par magie pas la peine de connaitre les types de ce ke t'as ds la liste...

n°68878
youdontcar​e
Posté le 01-11-2001 à 01:00:17  profilanswer
 

comme le disait C_Po_Ma_Faute, une référence est un alias : c'est juste un nom différent pour la même variable.  
 
int a = 4;
int& b = a; // b référence a
 
tu peux maintenant utiliser b ou a indifféremment pour accéder à la variable. en interne, les pointeurs sont identiques : &a (adresse de a) est égal à &b (adresse de b).
 
c'est pour ça que ton exemple ...
 
toto& fonction()  
{  
 toto MonToto;  
 return MonToto;  
}  
 
... ne marche pas, car tu retournes une variable temporaire (allouée sur la pile) qui est détruite en sortie de la fonction.
 
concrètement, à quoi ça sert ?
 
* à garantir que l'objet est non null :
 
void myFunc(myObject& a)
{
}
 
te garantit d'avoir un objet valide dans a. si tu étais passé par un paramètre myObject* a, il aurait fallu tester s'il était null. (ok, pour les programmeurs tordus, on peut passer un *pointeur en paramètre, mais bon).
 
* à donner un nouveau nom à une variable au nom complexe que tu utilises souvent :
 
myObject.myPoints[i].rx = myObject.myPoints[i].x * cos(a) - myObject.myPoints[i].y * sin(a);
 
peut être remplacé par
 
Point& p = myObject.myPoints[i];
p.rx = p.x * cos(a) - p.y * sin(a);
 
* à chaîner les appels. une classe dont les méthodes retournent la classe utilisée permet de faire de la haute voltige :
 
class myWorld
{
  myWorld&  ProcessInput();
  myWorld&  UpdateWorld();
  myWorld&  Render();
  myWorld&  BlitScreen();
}
 
les méthodes étant définies comme
 
myWorld& myWorld::ProcessInput()
{
  // le code ...
  return *this;
}
 
tu peux alors faire :
 
myWorld world;
world.ProcessInput().UpdateWorld().Render().BlitScreen();

 

[edtdd]--Message édité par youdontcare--[/edtdd]

n°68880
youdontcar​e
Posté le 01-11-2001 à 01:03:23  profilanswer
 

wpk a écrit a écrit :

un cercle c'est une ellipse et ca peut aussi etre vu comme un objet graphique.


LE problème récurrent :D
 
un cercle est une ellipse particulière. quand on dérive les formes graphiques d'une classe de base, faut-il dériver cercle de ellipse ou ellipse de cercle ? hmmmm :)

n°68882
sombresong​e
Posté le 01-11-2001 à 01:04:24  profilanswer
 

Autre problème qui me semble insoluble: J'ai essayé d'empaqueter une fenetre dans une classe, me suis dit ce serra cool comme ça j'aurrais qu'à faire dans l'avenir
 
#include "MaFenetre.h"
 
...  
WinMain()
{
  MaFenetre Fenetre(640,480,16);
  .
  .
  .
  MaFenetre.GereMessage();
  .
  .
  .
}
 
Mais je suis tombé sur un os: il est impossible de convertir un pointeur this->point_sur_fonction en void*!
 
Du coup lorsque par exemple il faut spécifier à windows la fonction callback de gestion de fenetre on peut pas lui passer une fonction membre d'une classe, d'où on est obliger de gérer ça par des fonction global d'où on peut pas accéder au membre privé à partir de la fonction callback. Finallement j'ai été obligé de mettre tout un tas de membre de ma classe en public... :sweat:

n°68886
wpk
Posté le 01-11-2001 à 01:09:31  profilanswer
 

la solution c'est une methode statique de ton objet fenetre

n°68887
sombresong​e
Posté le 01-11-2001 à 01:10:05  profilanswer
 

Citation :


myWorld& myWorld::ProcessInput()
{
 // le code ...
 return *this;
}


 
Là je comprend plus... myWorld& c une référence à *this??? et *this c l'objet. Donc myWorld est un alias de l'objet? mais this n'existe-t-il pas à l'extérieur de l'objet?

n°68891
sombresong​e
Posté le 01-11-2001 à 01:11:52  profilanswer
 

wpk a écrit a écrit :

la solution c'est une methode statique de ton objet fenetre  




 
J'y ai penser sauf que:
 
WNDPROC Fenetre::winproc() != WNDPROC winproc() !!!!

n°68892
wpk
Posté le 01-11-2001 à 01:16:07  profilanswer
 

sombresonge a écrit a écrit :

 
 
J'y ai penser sauf que:
 
WNDPROC Fenetre::winproc() != WNDPROC winproc() !!!!  




 
ca devrait pourtant passer un  
 
static WNDPROC Fenetre::winproc()
 
j'ai pas teste avec la pompe a messages mais par contre avec
les threads oui (et c'est un cas similaire), on a besoin de passer en param d'une fonction de l'API, un ptr vers une autre fonction qui sera le corps du thread...

n°68894
wpk
Posté le 01-11-2001 à 01:20:29  profilanswer
 

sombresonge a écrit a écrit :

Citation :


myWorld& myWorld::ProcessInput()
{
 // le code ...
 return *this;
}


 
Là je comprend plus... myWorld& c une référence à *this??? et *this c l'objet. Donc myWorld est un alias de l'objet? mais this n'existe-t-il pas à l'extérieur de l'objet?  




 
faut pas t'emeller les idees comme ca, qd tu dereference un pointeur, t'obtiens une reference donc *this est une ref vers ton objet. Par contre, ici, l'objet pointé par this n'est pas du tout alloué sur la pile de la methode myWorld:: ProcessInput(), il a soit ete alloué via un new sur le heap, soit sinon, alloué sur la pile de la methode qui appelle le myWorld:: ProcessInput()
donc, retourner une reference *this, ne presente pas de danger particuliers.

 

[edtdd]--Message édité par wpk--[/edtdd]

n°68896
sombresong​e
Posté le 01-11-2001 à 01:30:23  profilanswer
 

Je crois que pour l'instant je vais laisser tomber les référence... je devrais pouvoir m'en sortir avec mes pointeurs :) (enfin j'espère).
 
Pour la fonction callback le seul truc qu'a marcher c'est:
 
class MyWin
{
public:
  ...
  static gestfenetre();
  ...
}
...
 
MyWingetfenetre()
{
 ...
}
 
...
 
WNDPROC GlobalWindowProc()
{
  MyWin::gestfenetre();
}
 
MyWin::Init()
{
  WNDCLASS wc;
  ...
  wc.lpfnWndProc = GlobalWindowProc();
  ...
}
 
 
C quand même un peu lourdingue!!! :o

n°68949
n0mad
inscrit au XXe siècle
Posté le 01-11-2001 à 16:43:17  profilanswer
 

sombresonge a écrit a écrit :

:hello: Qu'est-ce qu'on peut faire avec l'approche Objet qu'on ne peut pas faire avec une approche structurel? (je veux dire dans la pratique)  




 
Dans la pratique, pas grand chose en plus mais à ce compte là, pourquoi ne pas programmer en Assembleur au lieu du C ?  
 
L'objet permet un niveau d'abstraction supérieur à celui du C lui même supérieur à celui de l'ASM.


---------------
Pipiru piru piru pipiru pi
n°69027
benou
Posté le 01-11-2001 à 22:32:32  profilanswer
 

quand je lis tout ca, je me dis  : vive le java !!!! ;)

n°69060
C_Po_Ma_Fa​ute
Posté le 02-11-2001 à 01:46:19  profilanswer
 

benou a écrit a écrit :

quand je lis tout ca, je me dis  : vive le java !!!! ;)  




 
alors là ce serais un autre débat ;)
débat lancé maintes fois sur ce forum ... quel est le meilleur langage ? en quel langage préférez vous programmer ? ... ne nous emportons pas !!! :non:  :non:

n°69119
benou
Posté le 02-11-2001 à 14:30:45  profilanswer
 

désolé ... ca a été plus fort que moi ... :)

n°69131
sombresong​e
Posté le 02-11-2001 à 15:04:06  profilanswer
 

n0mad a écrit a écrit :

 
 
Dans la pratique, pas grand chose en plus mais à ce compte là, pourquoi ne pas programmer en Assembleur au lieu du C ?  
 




 
Quand je programe en C il m'arrive de mettre des bout de code en assembleur inline justement :p

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Objet VS Structurel

 

Sujets relatifs
[VB + Access ] debutant avec ADO ... " un objet est requis"Kesako un "language orienté objet"?
C'est quoi un objet OLE ?[JAVA] est-il possible de faire des opérations sur un objet date ?
Erreur sous Windows (VB/VC++) : La méthode ~ de l'objet ~ a échoué[C++] objet File complet
Pourquoi l'objet c'est y mieux?[Javascript] Tester si un objet existe
[ javascript ] objet history && comment obtenir le titre d'une page ?[c++] comment recuperer le type dynamique d'un objet?
Plus de sujets relatifs à : Objet VS Structurel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR