 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Vincent Richard Guest
|
Posted: Thu Sep 18, 2003 6:40 pm Post subject: Re: Setteurs et Getteurs |
|
|
Le Jeudi 18 Septembre 2003 19:34, Michaël Monerau a écrit :
| Quote: | Je ne sais pas si mon titre est bien français, mais je pense que vous avez
tous compris de quoi il retournait ;-)
Je voudras savoir si, pour faire une paire de Setteurs et de Getteurs
(pour ceux qui ne voient pas, je parle d'une paire 'GetDonnee' et
'SetDonnee' pour manipuler un membre privé d'une classe), il est mieux
d'adopter la techinque de std::iostream, c'est-à-dire :
|
Il existe aussi une autre solution (élégante à mon goût) qui consiste à
utiliser un objet "proxy".
Ca peut sembler un peu lourd mais ça permet de faire des choses assez
intéressantes :
#include <string>
#include <iostream>
template <class TYPE>
class proxyPropriete
{
public:
proxyPropriete(const proxyPropriete& p)
: m_var(p.m_var)
{
}
proxyPropriete(TYPE& var)
: m_var(var)
{
}
void set(const TYPE& var)
{
m_var = var;
}
proxyPropriete& operator=(const TYPE& var)
{
m_var = var;
return *this;
}
const TYPE& get() const
{
return m_var;
}
operator TYPE() const
{
return m_var;
}
private:
TYPE& m_var;
};
class objet
{
public:
// Donnée 1
const proxyPropriete <const int> donnee1() const
{
return proxyPropriete <const int>(m_donnee1);
}
proxyPropriete <int> donnee1()
{
return proxyPropriete <int>(m_donnee1);
}
// Donnée 2
const proxyPropriete <const std::string> donnee2() const
{
return proxyPropriete <const std::string>(m_donnee2);
}
proxyPropriete <std::string> donnee2()
{
return proxyPropriete <std::string>(m_donnee2);
}
private:
int m_donnee1;
std::string m_donnee2;
};
int main()
{
objet o;
// affectation
o.donnee1().set(1234);
o.donnee1() = 1234;
// lecture
std::cout << "La donnee 1 vaut " << o.donnee1().get() << std::endl;
std::cout << "La donnee 1 vaut " << o.donnee1() << std::endl;
}
Vincent
--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-
|
|
| Back to top |
|
 |
Michaël Monerau Guest
|
Posted: Thu Sep 18, 2003 8:01 pm Post subject: Re: Setteurs et Getteurs |
|
|
"Vincent Richard" <chere-loque.MARRE-DE-LA-PUB (AT) wanadoo (DOT) fr.invalid> a écrit
dans le message de news: 3f69fd59$0$27569$626a54ce (AT) news (DOT) free.fr...
| Quote: | Le Jeudi 18 Septembre 2003 19:34, Michaël Monerau a écrit :
Je ne sais pas si mon titre est bien français, mais je pense que vous
avez
tous compris de quoi il retournait ;-)
Je voudras savoir si, pour faire une paire de Setteurs et de Getteurs
(pour ceux qui ne voient pas, je parle d'une paire 'GetDonnee' et
'SetDonnee' pour manipuler un membre privé d'une classe), il est mieux
d'adopter la techinque de std::iostream, c'est-à-dire :
Il existe aussi une autre solution (élégante à mon goût) qui consiste à
utiliser un objet "proxy".
|
<snip du code>
En effet, ça peut être pratique, et la syntaxe est assez sympa je trouve.
Je pense adopter cette technique
Merci.
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Sep 18, 2003 8:16 pm Post subject: Re: Setteurs et Getteurs |
|
|
Michaël Monerau wrote:
| Quote: | class A
{
public:
int Donnee () const {return mDonnee;}
int Donnee (int newvalue)
{
int tmp = mDonnee;
mDonnee = newvalue;
return tmp;
}
|
L'utilisation de A& comme valeur de retour est aussi à considérer dans
ton choix.
--
Loïc
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Thu Sep 18, 2003 11:53 pm Post subject: Re: Setteurs et Getteurs |
|
|
le Thursday 18 September 2003 20:40,
[email]chere-loque.MARRE-DE-LA-PUB (AT) wanadoo (DOT) fr.inva[/email]lid écrivit :
| Quote: | o.donnee1().set(1234);
o.donnee1() = 1234;
|
cette classe proxyPropriete perd un peu du sens initial qui fait qu'on évite
de donner accès au membre.
Je veux dire, si on donne accès à un proxyPropriete, pourquoi ne pas fournir
directement accès au membre ?
[ contrairement à un .set(..), proxyPropriete ne permet pas d'effectuer une
action lors du set ]
Remarque, on peut imaginer que le jour où l'accès au membre a des
implications à gèrer dans le set(..), donnee1() renvoie un autre genre
d'objet proxy qui, lui, prend une référence vers this et éxécute un set(..)
sur l'objet. Il faut juste éviter qu'un utilisateur de la classe se mette à
attendre de donnee1() qu'il retourne toujours un objet proxyPropriete.
Mais à la base, l'avantage par rapport à faire 2 fonctions get / set est
ténu : il faut de toute façon faire une fonction const et l'autre
non-const ..
Au final, je préfère un simple get_donnee1 / set_donnee1.
(et je préfère 2 noms différents plutot que la surcharge Donnee1() /
Donnee(int) car c'est plus pratiques pour utiliser avec des algos
génériques -for_each, etc..-, avec lesquels des membres surchargés sont
lourdingues à appeler)
--
Sam
|
|
| Back to top |
|
 |
Michaël Monerau Guest
|
Posted: Fri Sep 19, 2003 5:36 am Post subject: Re: Setteurs et Getteurs |
|
|
Loïc Joly wrote:
| Quote: | Michaël Monerau wrote:
class A
{
public:
int Donnee () const {return mDonnee;}
int Donnee (int newvalue)
{
int tmp = mDonnee;
mDonnee = newvalue;
return tmp;
}
L'utilisation de A& comme valeur de retour est aussi à considérer dans
ton choix.
|
Dans quelle fonction ? Je ne vois pas bien de que tu veux dire...
Si on retourne A& dans Donnee (), ça ne donne toujours pas accès à la donnée
private.
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Sep 19, 2003 7:18 am Post subject: Re: Setteurs et Getteurs |
|
|
"Michaël Monerau" <cort (AT) meloo (DOT) com> wrote
| Quote: | Je ne sais pas si mon titre est bien français, mais je pense que vous
avez tous compris de quoi il retournait ;-)
Je voudras savoir si, pour faire une paire de Setteurs et de Getteurs
(pour ceux qui ne voient pas, je parle d'une paire 'GetDonnee' et
'SetDonnee' pour manipuler un membre privé d'une classe), il est mieux
d'adopter la techinque de std::iostream, c'est-à-dire :
class A
{
public:
int Donnee () const {return mDonnee;}
int Donnee (int newvalue)
{
int tmp = mDonnee;
mDonnee = newvalue;
return tmp;
}
private:
int mDonnee;
};
Ou alors, une paire "normale" :
class B
{
public:
int GetDonnee () const {return mDonnee;}
int SetDonnee (int newvalue)
{
int tmp = mDonnee;
mDonnee = newvalue;
return tmp;
}
private:
int mDonnee;
};
Voilà. C'est bien long pour peu de choses finalement... Qu'est-ce qui
semble le plus propre, le plus utilisé et / ou le plus idiomatique ?
|
Les deux sont aussi propre l'un que l'autre. C'est simplement une
question de style. Le premier idiome est peut-être légèrement plus
fréquent en C++, mais autant que j'ai pû voir, c'est propre à C++ --
dans tous les autres langages, l'idiome préféré est avec deux noms
différente.
| Quote: | Laquelle des deux classes préférez-vous ?
|
Je suis plus habitué au premier. Mais comme j'ai dit, c'est vraiment une
question de style. La seule chose qui importe vraiment, c'est d'être
cohérent.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Michaël Monerau Guest
|
Posted: Fri Sep 19, 2003 3:30 pm Post subject: Re: Setteurs et Getteurs |
|
|
Guillaume Gourdin wrote:
| Quote: | sans utiliser de référence pour les types de base. En fait, je ne
vois pas trop l'intérêt de renvoyer l'ancienen valeur sur un SetData,
ce qui a pour effet de créer une variable temporaire qui ne sera
utilisée que dans une minorité de cas.
|
Il est vrai que la création d'une variable (enfin, 2 du coup, à cause du
renvoi) est assez embêtant. En vérité, je ne le mets pas dans mon code.
Et ça peut être assez facilement remplacé dans le code appelant (Get puis
Set).
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
Michaël Monerau Guest
|
Posted: Fri Sep 19, 2003 3:37 pm Post subject: Re: Setteurs et Getteurs |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: | Voilà. C'est bien long pour peu de choses finalement... Qu'est-ce qui
semble le plus propre, le plus utilisé et / ou le plus idiomatique ?
Les deux sont aussi propre l'un que l'autre. C'est simplement une
question de style. Le premier idiome est peut-être légèrement plus
fréquent en C++, mais autant que j'ai pû voir, c'est propre à C++ --
dans tous les autres langages, l'idiome préféré est avec deux noms
différente.
|
En effet, l'important est d'être cohérent... Je trouve que la solution de
l'overloading est assez jolie :p mais bon, c'est personnel.
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
LEMAITRE Guillaume Guest
|
Posted: Sat Sep 20, 2003 7:01 am Post subject: Re: Setteurs et Getteurs |
|
|
Michaël Monerau wrote:
| Quote: | Bonjour,
Je ne sais pas si mon titre est bien français, mais je pense que vous avez
tous compris de quoi il retournait ;-)
Je voudras savoir si, pour faire une paire de Setteurs et de Getteurs (pour
ceux qui ne voient pas, je parle d'une paire 'GetDonnee' et 'SetDonnee' pour
manipuler un membre privé d'une classe), il est mieux d'adopter la techinque
de std::iostream, c'est-à-dire :
class A
{
public:
int Donnee () const {return mDonnee;}
int Donnee (int newvalue)
{
int tmp = mDonnee;
mDonnee = newvalue;
return tmp;
}
private:
int mDonnee;
};
Ou alors, une paire "normale" :
class B
{
public:
int GetDonnee () const {return mDonnee;}
int SetDonnee (int newvalue)
{
int tmp = mDonnee;
mDonnee = newvalue;
return tmp;
}
private:
int mDonnee;
};
|
D'une manière générale, une méthode ne devrait faire que le minimum du
service qu'elle peut rendre. Ainsi l'accesseur en écriture ne devrait
pas renvoyer l'ancienne valeur. L'accesseur en lecture est là pour ça.
Ensuite, il faut autant que faire se peut donner des noms explicites à
ses méthodes pour perdr emoins de temps à la compréhension du code, et
donc je préfère donc deux noms séparés.
Enfin, on peut considérer que l'accesseur en lecture donne accès à une
référence constante sur le membre de classe dans le cas des objets de
taille plus importante qu'un int. Ou bien encore, qu'il ne renvoit pas
la valeur mais par contre prenne en argument un objet dans lequel devra
être copiée la valeur. Cela empêche l'utilisateur de savoir s'il a accès
à un champ ou à une valeur calculée.
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Sep 21, 2003 10:53 am Post subject: Re: Setteurs et Getteurs |
|
|
"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:
| Quote: | Guillaume Gourdin wrote:
sans utiliser de référence pour les types de base. En fait,
je ne vois pas trop l'intérêt de renvoyer l'ancienen valeur
sur un SetData, ce qui a pour effet de créer une variable
temporaire qui ne sera utilisée que dans une minorité de
cas.
Il est vrai que la création d'une variable (enfin, 2 du coup,
à cause du renvoi) est assez embêtant. En vérité, je ne
le mets pas dans mon code. Et ça peut être assez facilement
remplacé dans le code appelant (Get puis Set).
|
Mais l'arguement ne vaut que pour les types où la copie est chère.
En fait, à choisir, je crois que je préfère renvoyer la
référence à *this, pour permettre le chaînage. Mais dans la
pratique, comme pour le nom, je me conforme à ce que font les
collègues.
--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|
|
| Back to top |
|
 |
Michaël Monerau Guest
|
Posted: Sun Sep 21, 2003 11:22 am Post subject: Re: Setteurs et Getteurs |
|
|
James Kanze wrote:
| Quote: | "Michaël Monerau" <cort (AT) meloo (DOT) com> writes:
Guillaume Gourdin wrote:
sans utiliser de référence pour les types de base. En fait,
je ne vois pas trop l'intérêt de renvoyer l'ancienen valeur
sur un SetData, ce qui a pour effet de créer une variable
temporaire qui ne sera utilisée que dans une minorité de
cas.
Il est vrai que la création d'une variable (enfin, 2 du coup,
à cause du renvoi) est assez embêtant. En vérité, je ne
le mets pas dans mon code. Et ça peut être assez facilement
remplacé dans le code appelant (Get puis Set).
Mais l'arguement ne vaut que pour les types où la copie est chère.
|
Oui, mais justement. Si la copie est chère, on ne veut pas qu'elle ait lieu
à chaque fois qu'on appelle Set ! On en a besoin que certaines fois, où on
accepte une copie coûteuse.
| Quote: | En fait, à choisir, je crois que je préfère renvoyer la
référence à *this, pour permettre le chaînage. Mais dans la
pratique, comme pour le nom, je me conforme à ce que font les
collègues.
|
Et ils font en fonction de ce que tu fais ?
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Sep 21, 2003 3:46 pm Post subject: Re: Setteurs et Getteurs |
|
|
"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:
| Quote: | En fait, à choisir, je crois que je préfère renvoyer la
référence à *this, pour permettre le chaînage. Mais
dans la pratique, comme pour le nom, je me conforme à ce que
font les collègues.
Et ils font en fonction de ce que tu fais ?
|
Ça dépend du contexte. Quand je travaille sur un projet nouveau,
on discute ensemble pour établir nos conventions, et effectivement,
mon avis est pris en compte. Mais souvent, il y a déjà beaucoup de
code existant quand j'arrive sur un projet. Dans ce cas-là, je
m'aligne sur l'existant.
--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|