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 régulier
    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
    Points : 109
    Points
    109
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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 régulier
    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
    Points : 109
    Points
    109
    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
    Points : 13 017
    Points
    13 017
    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