GNT sans publicité, site mobile, fonctionnalitées exclusives...

destruction d'un Singleton Pattern : Static ou non Static

Le
requinham
Bonjour,

je parlais avec un amis sur la declaration de la fonction qui se
chargera de la destruction de notre instance unique destroy()

en fait est ce que c'est nécessaire de la déclarer static au niveau
conceptuel. car au niveau codage elle ne dérange pas vue qu'elle sera
la dernière à s'exécuter donc elle retournera la main à un autre ob=
jet
ou fonction différente de l'instance ?

A votre avis comment ça se fait ?
Lire les 18 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
requinham
Le #21213661
On 17 fév, 09:03, Mickaël Wolff
requinham a écrit :

> en fait est ce que c'est nécessaire de la déclarer static au niveau
> conceptuel.

   Oui, sinon on risque de se poser des questions sur le pourquoi de ce
fonctionnement.

--
Mickaël Wolff aka Lupus Michaelishttp://lupusmic.org



A vrai dire, le fait de la déclarer static n'a pas de sens car pouvoir
fair un appel statique à destroy n'aura pas de sens tant qu'il n'y a
pas de singleton en memoire et dans le cas où il y en a on peut
l'appeler à partir du singleton exple : A::getInstance()->destroy()
sans problème vue que c'est la derniere instruction appelé dans la vie
du singleton.
Mickaël Wolff
Le #21213561
requinham a écrit :
en fait est ce que c'est nécessaire de la déclarer static au niveau
conceptuel.



Oui, sinon on risque de se poser des questions sur le pourquoi de ce
fonctionnement.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Michael Doubez
Le #21214111
On 17 fév, 09:02, requinham
On 17 fév, 09:03, Mickaël Wolff
> requinham a écrit :

> > en fait est ce que c'est nécessaire de la déclarer static au nive au
> > conceptuel.

>    Oui, sinon on risque de se poser des questions sur le pourquoi d e ce
> fonctionnement.


A vrai dire, le fait de la déclarer static n'a pas de sens car pouvoir
fair un appel statique à destroy n'aura pas de sens tant qu'il n'y a
pas de singleton en memoire et dans le cas où il y en a on peut
l'appeler à partir du singleton exple : A::getInstance()->destroy()
sans problème vue que c'est la derniere instruction appelé dans la vi e
du singleton.



Ta question laisse supposer que tu vas appeler toi même la fonction de
destruction du singleton.

AMHA il vaut mieux un traitement générique de la durée de vie du
singleton C'est à dire qu'un singleton hérite d'une interface avec une
fonction membre virtual void destroy(); et qu'une fonction de netoyage
soit en charge de l'appeler au moment de la fin de vie.

Cette solution de permet de distinguer les types de singleton et leur
durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un gestionnaire de
singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...

Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
d'avoir à te creuser la tête pour svaoir quand appeler destroy().

Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.

--
Michael
requinham
Le #21218781
On 17 fév, 09:51, Michael Doubez
On 17 fév, 09:02, requinham


> On 17 fév, 09:03, Mickaël Wolff
> > requinham a écrit :

> > > en fait est ce que c'est nécessaire de la déclarer static au ni veau
> > > conceptuel.

> >    Oui, sinon on risque de se poser des questions sur le pourquoi de ce
> > fonctionnement.

> A vrai dire, le fait de la déclarer static n'a pas de sens car pouvoi r
> fair un appel statique à destroy n'aura pas de sens tant qu'il n'y a
> pas de singleton en memoire et dans le cas où il y en a on peut
> l'appeler à partir du singleton exple : A::getInstance()->destroy()
> sans problème vue que c'est la derniere instruction appelé dans la vie
> du singleton.

Ta question laisse supposer que tu vas appeler toi même la fonction de
destruction du singleton.

AMHA il vaut mieux un traitement générique de la durée de vie du
singleton C'est à dire qu'un singleton hérite d'une interface avec un e
fonction membre virtual void destroy(); et qu'une fonction de netoyage
soit en charge de l'appeler au moment de la fin de vie.

Cette solution de permet de distinguer les types de singleton et leur
durée de vie associée à un évènement:
  - détruit par le système (pas enregistré auprès d'un gestionn aire de
singleton)
  - détruit explicitment à l'exit ou en sortie de scope
  - détruit à la sortie d'un thread (pour les singletons TSS)
  - détruit quand une dll est déchargée
  - ...

Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
d'avoir à te creuser la tête pour svaoir quand appeler destroy().

Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.

--
Michael



bon si on a un cas dans lequel on devra détruire à la main le
singleton au milieu d'exécution du programme. Par exemple si on a un
GUI comportant plusieurs fonctionnalité parmi lesquelles une qui prend
un nom de fichier et appelle une dll pour le parser charger au fur et
à mesur ses données dans des structures spécifiques et mets ces
dernières à la disposition d'autres fonctionnalité. dans le cas ou je
veux changer le fichier je détruit le singleton (initialement créer
par le dll) et re-crée un autre pour le nouveau fichier.
Bon ça reste à titre d'exemple, mais la question est doit on déclarer
la fonction destroy() static ou non, conceptuellement parlant biensûr.

Merci
James Kanze
Le #21218991
On Feb 16, 11:41 am, requinham
je parlais avec un amis sur la declaration de la fonction qui
se chargera de la destruction de notre instance unique
destroy()



en fait est ce que c'est nécessaire de la déclarer static au
niveau conceptuel. car au niveau codage elle ne dérange pas
vue qu'elle sera la dernière à s'exécuter donc elle retournera
la main à un autre objet ou fonction différente de
l'instance ?



A votre avis comment ça se fait ?



Que normalement, on ne detruit pas un singleton. Le detruire
laisse la porte ouverte aux problèmes d'ordre de destruction.

Si on veut le detruire, il suffit que l'instance même soit
static, et le compilateur s'en occupera.

--
James Kanze
Publicité
Suivre les réponses
Poster une réponse
Anonyme