Après bien des tâtonnements, j'ai fini par me ranger à la même m éthode
que James Kanze pour faire mes singletons, à savoir :
-----------------------------------------------------
class Machin
{
public:
static Machin &instance();
...
private:
Machin();
~Machin();
};
static Machin &Machin::instance()
{
static Machin LeSeul;
return LeSeul;}
-----------------------------------------------------
) ;
static UserClass* createInstance( Discrim< destructOnExit
) ;
} ;
et je me demandais si ça ne valait pas le coup de faire une deuxième
fonction, const celle-là, pour accéder au singleton en s'interdisant de
le modifier, pour détecter d'éventuelles erreurs. Quelque chose comme :
-----------------------------------------------------
static const Machin &Machin::const_instance()
{
return Machin::instance();}
-----------------------------------------------------
Éventuellement, en renommant instance() la version const, et
mutable_instance() la version non-const (pour inciter le
programmeur à utiliser la version const le plus souvent
possible).
Après bien des tâtonnements, j'ai fini par me ranger à la même m éthode
que James Kanze pour faire mes singletons, à savoir :
-----------------------------------------------------
class Machin
{
public:
static Machin &instance();
...
private:
Machin();
~Machin();
};
static Machin &Machin::instance()
{
static Machin LeSeul;
return LeSeul;}
-----------------------------------------------------
) ;
static UserClass* createInstance( Discrim< destructOnExit
) ;
} ;
et je me demandais si ça ne valait pas le coup de faire une deuxième
fonction, const celle-là, pour accéder au singleton en s'interdisant de
le modifier, pour détecter d'éventuelles erreurs. Quelque chose comme :
-----------------------------------------------------
static const Machin &Machin::const_instance()
{
return Machin::instance();}
-----------------------------------------------------
Éventuellement, en renommant instance() la version const, et
mutable_instance() la version non-const (pour inciter le
programmeur à utiliser la version const le plus souvent
possible).
Après bien des tâtonnements, j'ai fini par me ranger à la même m éthode
que James Kanze pour faire mes singletons, à savoir :
-----------------------------------------------------
class Machin
{
public:
static Machin &instance();
...
private:
Machin();
~Machin();
};
static Machin &Machin::instance()
{
static Machin LeSeul;
return LeSeul;}
-----------------------------------------------------
) ;
static UserClass* createInstance( Discrim< destructOnExit
) ;
} ;
et je me demandais si ça ne valait pas le coup de faire une deuxième
fonction, const celle-là, pour accéder au singleton en s'interdisant de
le modifier, pour détecter d'éventuelles erreurs. Quelque chose comme :
-----------------------------------------------------
static const Machin &Machin::const_instance()
{
return Machin::instance();}
-----------------------------------------------------
Éventuellement, en renommant instance() la version const, et
mutable_instance() la version non-const (pour inciter le
programmeur à utiliser la version const le plus souvent
possible).
On Jul 22, 10:38 am, Serge Paccalin
wrote:Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Sauf que ce n'est pas la méthode que j'utilise la plupart du
temps:-). En fait, j'ai fini dépuis par en faire une classe
générique :
[snip]
On Jul 22, 10:38 am, Serge Paccalin
<s...@mailclub.no.spam.net.invalid> wrote:
Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Sauf que ce n'est pas la méthode que j'utilise la plupart du
temps:-). En fait, j'ai fini dépuis par en faire une classe
générique :
[snip]
On Jul 22, 10:38 am, Serge Paccalin
wrote:Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Sauf que ce n'est pas la méthode que j'utilise la plupart du
temps:-). En fait, j'ai fini dépuis par en faire une classe
générique :
[snip]
On Jul 22, 10:38 am, Serge Paccalin
wrote:Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
[snip]Sauf que ce n'est pas la méthode que j'utilise la plupart du
temps:-). En fait, j'ai fini dépuis par en faire une classe
générique :
[snip]
Dans la classe Machin de Serge, le constructeur est prive, donc
tu ne peux pas declarer une autre instance de Machin que celle du
singleton.
Dans ta classe Singleton<>, que j'aime assez par ailleurs, je ne vois
pas comment on obtient le meme comportement, a part declarer le
constructeur de la classe derivee en privé, mais il faut alors un
friend sinon createInstance() ne compile plus:
class MySingleton : public Singleton< MySingleton >
{
private:
friend class Singleton< MySingleton >;
MySingleton();
~MySingleton();
};
Je n'ai rien contre le ctor/dtor en privé, ca indique clairement
ce que ca veut dire, mais je trouve que le friend est un peu redondant.
Est-ce qu'il y a un moyen de s'en passer ? Est-ce que j'ai raté
quelque-chose ?
On Jul 22, 10:38 am, Serge Paccalin
<s...@mailclub.no.spam.net.invalid> wrote:
Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
[snip]
Sauf que ce n'est pas la méthode que j'utilise la plupart du
temps:-). En fait, j'ai fini dépuis par en faire une classe
générique :
[snip]
Dans la classe Machin de Serge, le constructeur est prive, donc
tu ne peux pas declarer une autre instance de Machin que celle du
singleton.
Dans ta classe Singleton<>, que j'aime assez par ailleurs, je ne vois
pas comment on obtient le meme comportement, a part declarer le
constructeur de la classe derivee en privé, mais il faut alors un
friend sinon createInstance() ne compile plus:
class MySingleton : public Singleton< MySingleton >
{
private:
friend class Singleton< MySingleton >;
MySingleton();
~MySingleton();
};
Je n'ai rien contre le ctor/dtor en privé, ca indique clairement
ce que ca veut dire, mais je trouve que le friend est un peu redondant.
Est-ce qu'il y a un moyen de s'en passer ? Est-ce que j'ai raté
quelque-chose ?
On Jul 22, 10:38 am, Serge Paccalin
wrote:Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
[snip]Sauf que ce n'est pas la méthode que j'utilise la plupart du
temps:-). En fait, j'ai fini dépuis par en faire une classe
générique :
[snip]
Dans la classe Machin de Serge, le constructeur est prive, donc
tu ne peux pas declarer une autre instance de Machin que celle du
singleton.
Dans ta classe Singleton<>, que j'aime assez par ailleurs, je ne vois
pas comment on obtient le meme comportement, a part declarer le
constructeur de la classe derivee en privé, mais il faut alors un
friend sinon createInstance() ne compile plus:
class MySingleton : public Singleton< MySingleton >
{
private:
friend class Singleton< MySingleton >;
MySingleton();
~MySingleton();
};
Je n'ai rien contre le ctor/dtor en privé, ca indique clairement
ce que ca veut dire, mais je trouve que le friend est un peu redondant.
Est-ce qu'il y a un moyen de s'en passer ? Est-ce que j'ai raté
quelque-chose ?
Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
On Jul 30, 5:03 pm, Michel Decima wrote:class MySingleton : public Singleton< MySingleton >
{
private:
friend class Singleton< MySingleton >;
MySingleton();
~MySingleton();
};
Tout à fait.Je n'ai rien contre le ctor/dtor en privé, ca indique clairement
ce que ca veut dire, mais je trouve que le friend est un peu redondant.
Est-ce qu'il y a un moyen de s'en passer ? Est-ce que j'ai raté
quelque-chose ?
Je ne vois pas comment s'en passer, au moins de laisser le
constructeur public (ce qui permettrait d'autres
instantiations -- parfois, c'est acceptable, mais c'est un peu
contre l'idée de singleton).
On Jul 30, 5:03 pm, Michel Decima <michel.dec...@orange-ft.com> wrote:
class MySingleton : public Singleton< MySingleton >
{
private:
friend class Singleton< MySingleton >;
MySingleton();
~MySingleton();
};
Tout à fait.
Je n'ai rien contre le ctor/dtor en privé, ca indique clairement
ce que ca veut dire, mais je trouve que le friend est un peu redondant.
Est-ce qu'il y a un moyen de s'en passer ? Est-ce que j'ai raté
quelque-chose ?
Je ne vois pas comment s'en passer, au moins de laisser le
constructeur public (ce qui permettrait d'autres
instantiations -- parfois, c'est acceptable, mais c'est un peu
contre l'idée de singleton).
On Jul 30, 5:03 pm, Michel Decima wrote:class MySingleton : public Singleton< MySingleton >
{
private:
friend class Singleton< MySingleton >;
MySingleton();
~MySingleton();
};
Tout à fait.Je n'ai rien contre le ctor/dtor en privé, ca indique clairement
ce que ca veut dire, mais je trouve que le friend est un peu redondant.
Est-ce qu'il y a un moyen de s'en passer ? Est-ce que j'ai raté
quelque-chose ?
Je ne vois pas comment s'en passer, au moins de laisser le
constructeur public (ce qui permettrait d'autres
instantiations -- parfois, c'est acceptable, mais c'est un peu
contre l'idée de singleton).
Serge Paccalin wrote:Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Pour java, mais bon le raisonnement s'applique totalement au C++, Google
diffuse un outils de détection automatique des Singleton, dans
l'objectif avoué de leur élimination systématique :
http://code.google.com/p/google-singleton-detector/
L'outils signale aussi l'arbre de dépendance des classe dépendant de la
classe Singleton, et aussi les autres usage de données statiques,
mingleton et fingleton, les classes contenant un membre ou bien un champ
stockant un état statique.
Bref pour Google la guerre anti-singleton, et tous dérivés, est ouverte,
et l'usage de l'artillerie lourde est encouragé.
Serge Paccalin wrote:
Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Pour java, mais bon le raisonnement s'applique totalement au C++, Google
diffuse un outils de détection automatique des Singleton, dans
l'objectif avoué de leur élimination systématique :
http://code.google.com/p/google-singleton-detector/
L'outils signale aussi l'arbre de dépendance des classe dépendant de la
classe Singleton, et aussi les autres usage de données statiques,
mingleton et fingleton, les classes contenant un membre ou bien un champ
stockant un état statique.
Bref pour Google la guerre anti-singleton, et tous dérivés, est ouverte,
et l'usage de l'artillerie lourde est encouragé.
Serge Paccalin wrote:Après bien des tâtonnements, j'ai fini par me ranger à la même méthode
que James Kanze pour faire mes singletons, à savoir :
Pour java, mais bon le raisonnement s'applique totalement au C++, Google
diffuse un outils de détection automatique des Singleton, dans
l'objectif avoué de leur élimination systématique :
http://code.google.com/p/google-singleton-detector/
L'outils signale aussi l'arbre de dépendance des classe dépendant de la
classe Singleton, et aussi les autres usage de données statiques,
mingleton et fingleton, les classes contenant un membre ou bien un champ
stockant un état statique.
Bref pour Google la guerre anti-singleton, et tous dérivés, est ouverte,
et l'usage de l'artillerie lourde est encouragé.
L'outils signale aussi l'arbre de dépendance des classe dépendant de
la classe Singleton, et aussi les autres usage de données statiques,
mingleton et fingleton, les classes contenant un membre ou bien un
champ stockant un état statique.
Par curiosité, c'est quoi les {m|f|h}ingleton ? J'ai suivi le lien,
cherché un peu autour, mais rien trouvé...
Bref pour Google la guerre anti-singleton, et tous dérivés, est
ouverte, et l'usage de l'artillerie lourde est encouragé.
Est-ce vraiment utile ? [...]
D'un autre coté, un Singleton utilise a bon escient (et bien
sur avec parcimonie), ca se remplace difficilement.
L'outils signale aussi l'arbre de dépendance des classe dépendant de
la classe Singleton, et aussi les autres usage de données statiques,
mingleton et fingleton, les classes contenant un membre ou bien un
champ stockant un état statique.
Par curiosité, c'est quoi les {m|f|h}ingleton ? J'ai suivi le lien,
cherché un peu autour, mais rien trouvé...
Bref pour Google la guerre anti-singleton, et tous dérivés, est
ouverte, et l'usage de l'artillerie lourde est encouragé.
Est-ce vraiment utile ? [...]
D'un autre coté, un Singleton utilise a bon escient (et bien
sur avec parcimonie), ca se remplace difficilement.
L'outils signale aussi l'arbre de dépendance des classe dépendant de
la classe Singleton, et aussi les autres usage de données statiques,
mingleton et fingleton, les classes contenant un membre ou bien un
champ stockant un état statique.
Par curiosité, c'est quoi les {m|f|h}ingleton ? J'ai suivi le lien,
cherché un peu autour, mais rien trouvé...
Bref pour Google la guerre anti-singleton, et tous dérivés, est
ouverte, et l'usage de l'artillerie lourde est encouragé.
Est-ce vraiment utile ? [...]
D'un autre coté, un Singleton utilise a bon escient (et bien
sur avec parcimonie), ca se remplace difficilement.
Michel Decima wrote:
Par curiosité, c'est quoi les {m|f|h}ingleton ? J'ai suivi le lien,
cherché un peu autour, mais rien trouvé...
C'est décrit ici
http://code.google.com/p/google-singleton-detector/wiki/Usage et c'est
ce que je résumais, member singleton => mingleton, field singleton =>
fingleton, helper singleton => hingleton, la définition est un peu plus
floue pour le dernier.
Les singleton évitent de passer des paramètres, mais introduisent un
état statique qui finit un jour ou un autre par être génant, en
particulier qui pose des problèmes par rapport à une programmation
parallèle (ça doit probablement être absolument essentiel pour Google)
et qui gène pour tester.
Michel Decima wrote:
Par curiosité, c'est quoi les {m|f|h}ingleton ? J'ai suivi le lien,
cherché un peu autour, mais rien trouvé...
C'est décrit ici
http://code.google.com/p/google-singleton-detector/wiki/Usage et c'est
ce que je résumais, member singleton => mingleton, field singleton =>
fingleton, helper singleton => hingleton, la définition est un peu plus
floue pour le dernier.
Les singleton évitent de passer des paramètres, mais introduisent un
état statique qui finit un jour ou un autre par être génant, en
particulier qui pose des problèmes par rapport à une programmation
parallèle (ça doit probablement être absolument essentiel pour Google)
et qui gène pour tester.
Michel Decima wrote:
Par curiosité, c'est quoi les {m|f|h}ingleton ? J'ai suivi le lien,
cherché un peu autour, mais rien trouvé...
C'est décrit ici
http://code.google.com/p/google-singleton-detector/wiki/Usage et c'est
ce que je résumais, member singleton => mingleton, field singleton =>
fingleton, helper singleton => hingleton, la définition est un peu plus
floue pour le dernier.
Les singleton évitent de passer des paramètres, mais introduisent un
état statique qui finit un jour ou un autre par être génant, en
particulier qui pose des problèmes par rapport à une programmation
parallèle (ça doit probablement être absolument essentiel pour Google)
et qui gène pour tester.