débutant, design et encapsulation ?

débutant, design et encapsulation ? - C++ - Programmation

Marsh Posté le 19-02-2008 à 11:08:30    

bonjour,

 

je suis débutant en c++ et j'ai une petite question ...j'ai fait une classe qui a une méthode qui retourne un pointeur sur un tableau , du genre :
 

 
Code :
  1. class GeoForm{
  2. public:
  3. int* get_position();
  4. private :
  5. int position[2];
  6. };
  7. int * GeoForm::get_position() {
  8. return position;
  9. }
 

est-ce la bonne manière de faire ?? J'ai lu dans un forum anglais que retourner un pointeur n'est pas une bonne solution du point de vue design parce qu'on perd l'encapsulation : on informe l'utilisateur que la classe utilise un tableau d'entiers.

 

Comment faudrait-il faire ? Que me conseillez vous ...?

 

merci d'avance

 


( ps: j'ai fait du c avant )

 


Message édité par in_your_phion le 19-02-2008 à 11:18:51
Reply

Marsh Posté le 19-02-2008 à 11:08:30   

Reply

Marsh Posté le 19-02-2008 à 11:26:33    

Ben déjà, retourner l'adresse d'une variable privée rien que côté design, c'est très laid, parce que tu n'as du coup aucun contrôle sur le contenu. :/
 
Ensuite, je ne vois pas l'intérêt de retourner un tableau entier, mieux vaut retourner la valeur contenue à un index donné.
 
Enfin, sauf si tu as quelque chose de précis en tête, j'utiliserais plutôt une list plutôt qu'un tableau de valeurs, beaucoup plus facile à gérer.

Reply

Marsh Posté le 19-02-2008 à 11:32:27    

Elmoricq a écrit :

Ben déjà, retourner l'adresse d'une variable privée rien que côté design, c'est très laid, parce que tu n'as du coup aucun contrôle sur le contenu. :/

 

Ensuite, je ne vois pas l'intérêt de retourner un tableau entier, mieux vaut retourner la valeur contenue à un index donné.

 

Enfin, sauf si tu as quelque chose de précis en tête, j'utiliserais plutôt une list plutôt qu'un tableau de valeurs, beaucoup plus facile à gérer.

 

salut, et merci pour ta réponse :)

 

"Ben déjà, retourner l'adresse d'une variable privée rien que côté design, c'est très laid, parce que tu n'as du coup aucun contrôle sur le contenu. :/"

 

je sais ... mais je sais pas comment faire autrement :(

 


en fait j'ai pas grand chose de précis en tête, j'ai une position dans l'espace 2d (position x et y) et au lieu de retourner la position x et la position y (donc faire deux get() ) j'avais pensé faire comme en c et retourner une addresse. Par exemple si je travaillais dans un espace a N dimensions j'aurais N valeurs a retourner, ce serait peut etre pas super pratique. Comment je pourrait faire avec une liste? pourquoi est-ce plus simple ?

 

d'avance merci

Message cité 1 fois
Message édité par in_your_phion le 19-02-2008 à 11:34:54
Reply

Marsh Posté le 19-02-2008 à 11:36:43    

Même en C je n'aurais pas fait comme ça, pour une raison simple : ce n'est pas intuitif.
En C, je travaillerais avec une structure comprenant la position sous forme de deux variables x et y.
C'est beaucoup plus lisible et compréhensible de travailler avec position.x et position.y qu'avec position[0] et position[1].
 
Du coup, rien ne t'empêche de faire la même chose en C++.
 
Pour la list, oublie ça dans ce cas-là, ça ne te sera pas utile.

Reply

Marsh Posté le 19-02-2008 à 11:36:51    

in_your_phion a écrit :

en fait j'ai pas grand chose de précis en tête, j'ai une position dans l'espace 2d (position x et y) et au lieu de retourner la position x et la position y (donc faire deux get() ) j'avais pensé faire comme en c et retourner une addresse. Par exemple si je travaillais dans un espace a N dimensions j'aurais N valeurs a retourner, ce serait peut etre pas super pratique. Comment je pourrait faire avec une liste? pourquoi est-ce plus simple ?


Pourquoi ne pas tout simplement créer une classe Point (ou même une struct, c-style) et renvoyer ça?

 

Classe de préférence immutable, et du côté de l'appelant tu aurais un truc genre:

Code :
  1. Point p = geoForm.get_position();
  2. p.x;
  3. p.y;
 

edit: elmo :fou:


Message édité par masklinn le 19-02-2008 à 11:37:58

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-02-2008 à 11:42:01    

Ouais moi je suis d'accord avec Masklinn. Tu est en langage objet donc profites en. Fait des classes! Ce sera plus clair rien que pour coder correctement.

Reply

Marsh Posté le 19-02-2008 à 11:43:44    

certes ....  :sweat:

 

merci pour vos réponses !!!

 

edit: si je fait une classe avec que des membres publiques, autant faire une structure non ?

Message cité 1 fois
Message édité par in_your_phion le 19-02-2008 à 11:45:39
Reply

Marsh Posté le 19-02-2008 à 11:45:24    

Bah, struct, class... en C++, ça fait pas une énorme différence. [:dawa]

Reply

Marsh Posté le 19-02-2008 à 11:46:09    

Elmoricq a écrit :

Bah, struct, class... en C++, ça fait pas une énorme différence. [:dawa]


Tu peux déclarer que les membres d'une struct sont const final toussa?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-02-2008 à 11:49:53    

Bah en fait, struct == class, y a que la visibilité des membres par défaut qui change (public pour struct, private pour class).

Reply

Marsh Posté le 19-02-2008 à 11:49:53   

Reply

Marsh Posté le 19-02-2008 à 11:50:50    

Elmoricq a écrit :

Bah en fait, struct == class, y a que la visibilité des membres par défaut qui change (public pour struct, private pour class).


Ah ok :o

 

edit: c'est vrai que j'avais vu passer un truc sur le sujet il y a pas longtemps [:figti]


Message édité par masklinn le 19-02-2008 à 11:51:09

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-02-2008 à 11:52:14    

Reply

Marsh Posté le 19-02-2008 à 11:52:16    

ok ...

 

donc si je suis bien, pour mon exemple, je pourrait faire :

 
Code :
  1. class Point {
  2. public:
  3. int x;
  4. int y;
  5. };
 

ou, alternativement :

 


Code :
  1. struct Point {
  2. int x;
  3. int y;
  4. };
 

et dans ma classe GeoFrom :

 
Code :
  1. class GeoForm {
  2. public:
  3. Point get_position ();
  4. private:
  5. Point p;
  6. };
 

?


Message édité par in_your_phion le 19-02-2008 à 11:54:15
Reply

Marsh Posté le 19-02-2008 à 11:52:51    

in_your_phion a écrit :

edit: si je fait une classe avec que des membres publiques, autant faire une structure non ?


Pourquoi faire que des membres publics???
Tu déclares tes attributs en private et tu fait des get et des set pour les modifier comme une classe normale.

Citation :

sont const final toussa?

:ouch: J'ai pas tout compris là!!!

Reply

Marsh Posté le 19-02-2008 à 11:52:52    

Exactement. [:romf]

 

edit > j'répondais à in_your_phion :o


Message édité par Elmoricq le 19-02-2008 à 11:55:23
Reply

Marsh Posté le 19-02-2008 à 11:54:14    


Non :D

fardke1 a écrit :


Pourquoi faire que des membres publics???
Tu déclares tes attributs en private et tu fait des get et des set pour les modifier comme une classe normale.


Il n'y a pas à les modifier, le Point est juste utilisé pour encapsuler des informations, pourquoi se faire chier à créer des accesseurs qui n'ont strictement aucun intérêt?

fardke1 a écrit :

Citation :

sont const final toussa?

:ouch: J'ai pas tout compris là!!!


Ben déclarer les membres de la struct comme étant e.g. const histoire d'éviter qu'ils puissent être modifiés (puisqu'ils n'ont pas à l'être)


Message édité par masklinn le 19-02-2008 à 11:55:11

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-02-2008 à 11:58:28    

Merci pour toutes vos réponses :)))

Reply

Marsh Posté le 19-02-2008 à 12:01:30    

Citation :


Ben déclarer les membres de la struct comme étant e.g. const histoire d'éviter qu'ils puissent être modifiés (puisqu'ils n'ont pas à l'être)


Excuse moi Masklinn après avoir lu les post suivant j'ai compris ce que tu voulais dire mais il y a un certain temps pour moi entre la lecture de vos post et l'écriture du mien :pt1cable: !!!!!!
 

Citation :

Il n'y a pas à les modifier, le Point est juste utilisé pour encapsuler des informations, pourquoi se faire chier à créer des accesseurs qui n'ont strictement aucun intérêt?


 
Pour les raison qui font les points fort du langage objet :
 -réutilisabilité de ta classe point.
 -protection de tes variables pour ne pas faire tout et n'importe quoi
 
Et puis sa te permet une meilleure lisibilité de ton code et c'est beaucoup plus propre.
De plus un get et un set pour une classe point c'est grand maximum une ligne... Je trouve quand même pas sa énorme!!

Message cité 1 fois
Message édité par fardke1 le 19-02-2008 à 12:02:25
Reply

Marsh Posté le 19-02-2008 à 12:34:47    

fardke1 a écrit :

Pour les raison qui font les points fort du langage objet :
 -réutilisabilité de ta classe point.
 -protection de tes variables pour ne pas faire tout et n'importe quoi
 
Et puis sa te permet une meilleure lisibilité de ton code et c'est beaucoup plus propre.
De plus un get et un set pour une classe point c'est grand maximum une ligne... Je trouve quand même pas sa énorme!!


N'importe quoi en barres de 12.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

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