IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

destruction d'un Singleton Pattern : Static ou non Static


Sujet :

C++

  1. #1
    Membre tr�s actif
    Homme Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    Janvier 2006
    Messages
    105
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2006
    Messages : 105
    Par d�faut destruction d'un Singleton Pattern : Static ou non Static
    supposant que je d�finie mon singleton avec la classe suivante :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class A {
     
    private:
    A(){};
    A(const A& instance){};
    ~A(){};
    static A* uniqueInstance=NULL;
     
    public:
    static A* getInstance(){
    if (uniqueInstance==NULL)
       uniqueInstance=new A();
    return uniqueInstance;
     
    }
     
    void destroy(){
    if (uniqueInstance != NULL){
    delete uniqueInstance;
    uniqueInstance=NULL;
     
    }
    }
    est ce que la fonction destroy() qui d�truit le singleton doit �tre static vue qu'elle sera la derni�re ex�cuter par le singleton donc elle retournera la main � la fonction sup�rieur (le main par exemple) donc inutile de la d�clarer static ???

    Qu'elle est la vrai recommendation au niveau conceptuel et pourquoi ?

    merci

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    La r�ponse tient en un mot : oui...

    La raison est bien simple: si la fonction membre destroy n'�tait pas statique, elle d�pendrait... d'une instance de ton singleton.

    Or, il est parfaitement possible que tu veuille utiliser (en cr�ant au besoin) ton instance de singleton "un peu partout" et que tu ne veuille la d�truire qu'� un seul endroit (typiquement, lors de "l'extinction" finale), alors que... tu ne dispose pas forc�ment d'un pointeur sur l'instance de ton singleton...

    Du coup, si la fonction destroy n'�tait pas statique, tu en viendrait � devoir �crire un code proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    void finalize()
    {
        /*tout ce qu'il faut faire avant de détruire le singleton */
        A::getInstance()->destroy();
        /* tout ce qu'il faut faire après avoir détruit le singleton */
    }
    et tu admettra qu'il est pour le moins paradoxal de demander (et �ventuellement cr�er) l'instance du singleton pour... la d�truire directement

    Ceci �tant dit, l'invocation de delete sur NULL est garanti n'avoir aucun effet...

    Tu peux donc parfaitement �viter le test if (uniqueInstance != NULL) dans la fonction destroy qui peut parfaitement prendre la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    static A::destroy()
    {
        delete uniqueInstance; // pas besoin de test
        uniqueInstance = NULL; // tant pis si uniqueInstance vallait déjà NULL
                               // maintenant, on en est sur :D
    }
    Enfin, on ne r�p�te jamais assez le risque que l'on court � vouloir tout transformer en singleton...

    Dans bien des cas, il est tout � fait possible d'assurer l'unicit� de l'instance d'un type donn� en veillant simplement �... interdire la cr�ation de plus d'une instance

    Je n'ai pas le lien sous la main, mais il y a plusieurs discussions sur le forum qui pr�sentent un lien sur le danger d'�tre atteint de singletonite...

    Une petite recherche devrait te permettre de remettre la main dessus, et je ne peux que t'inciter � lire l'article vis�
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Membre tr�s actif
    Homme Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    Janvier 2006
    Messages
    105
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2006
    Messages : 105
    Par d�faut
    Bonsoir,

    � vrai dire cette question a fait une longue discussion avec des experts que j'ai rencontr� dans le r�seau Usenet dans comp.lang.c++ et croyez moi ils n'ont pas trouv� de cause concr�te mais avec ton explication c'est tr�s convaincant comme argument.

    J'ai tr�s bien saisie et bravo

  4. #4
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    Je n'ai pas le lien sous la main, mais il y a plusieurs discussions sur le forum qui pr�sentent un lien sur le danger d'�tre atteint de singletonite...
    Etes-vous atteint de Singletonite ?
    Comme le dit souvent Luc, si tu ne veux qu'une instance, et bien n'en cr�� qu'une ! Ensuite, le probl�me du singleton est d'en faire un objet 'facilement' accessible qui a tendance par ce fait � �tre utilis� partout et accroitre l'inter-d�pendance des diff�rents �l�ments de ton projet.
    Mais pour r�pondre � ta question, l'explication de Koala pour une version statique m'a l'air tr�s convaincante

Discussions similaires

  1. static ou non static?
    Par wassim_boy dans le forum JDBC
    R�ponses: 3
    Dernier message: 06/01/2012, 15h22
  2. transformer une methode static a non static
    Par maaizou dans le forum D�buter avec Java
    R�ponses: 2
    Dernier message: 22/03/2011, 09h14
  3. Du non static context au static context
    Par JeanNoel53 dans le forum NetBeans
    R�ponses: 14
    Dernier message: 29/12/2010, 19h28
  4. [Debutant]difference entre static et non static
    Par jeremypd dans le forum D�buter avec Java
    R�ponses: 5
    Dernier message: 07/03/2008, 08h13
  5. Static et non static. Comment faire?
    Par cmako dans le forum Langage
    R�ponses: 16
    Dernier message: 19/09/2007, 23h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo