10 votes

Aidez-moi à supprimer un Singleton : cherchez une alternative

Contexte : J'ai quelques classes qui mettent en œuvre un modèle de conception sujet/observateur que j'ai rendu sûr pour les threads. A subject notifiera à son observers par un simple appel de méthode observer->Notified( this ) si le observer a été construit dans le même fil de discussion que celui de la notification. Mais si le observer a été construit dans un autre fil de discussion, la notification sera affichée dans un fichier queue qui sera traité ultérieurement par le thread qui a construit le fichier observer puis l'appel à la méthode simple peut être effectué lorsque l'événement de notification est traité.

J'ai donc une carte qui associe les threads et les files d'attente et qui est mise à jour lorsque les threads et les files d'attente sont construits et détruits. Cette carte utilise elle-même un mutex pour protéger l'accès multithread à cette carte.

La carte est un singleton.

J'ai été coupable d'utiliser des singletons dans le passé parce qu'il n'y en aurait qu'un seul dans cette application, et croyez-moi, j'ai payé ma pénitence !

Une partie de moi ne peut s'empêcher de penser qu'il n'y aura vraiment qu'une seule carte de file d'attente/thread dans une application. L'autre voix dit que les singletons ne sont pas bons et qu'il faut les éviter.

J'aime l'idée de supprimer le singleton et de pouvoir l'insérer dans mes tests unitaires. Le problème, c'est que j'ai du mal à trouver une bonne solution alternative.

La solution "habituelle" qui a fonctionné dans le passé est de passer un pointeur sur l'objet à utiliser au lieu de référencer le singleton. Je pense que ce serait délicat dans ce cas, puisque les observateurs et les sujets sont à 10 cents dans mon application et qu'il serait très gênant d'avoir à passer un objet file d'attente/thread map dans le constructeur de chaque observateur.

Ce que je comprends, c'est que je peux très bien n'avoir qu'une seule carte dans mon application, mais ce n'est pas dans les entrailles du code du sujet et de la classe d'observateurs que cette décision est prise.

Il s'agit peut-être d'un singleton valide, mais j'apprécierais également toute idée sur la façon dont je pourrais le supprimer.

Merci.

PS. J'ai lu Quelle est l'alternative à Singleton ? y cet article mentionné dans la réponse acceptée. Je ne peux m'empêcher de penser que l'ApplicationFactory n'est qu'un autre singleton sous un autre nom. Je ne vois vraiment pas l'avantage.

0voto

Chris Powell Points 11

Pourquoi ne pas ajouter une méthode Reset qui renvoie un singleton à son état initial et que vous pouvez appeler entre les tests ? Cela pourrait être plus simple qu'un stub. Il pourrait être possible d'ajouter une méthode générique Reset à un modèle de singleton (supprime le singleton interne pimpl et réinitialise le pointeur). Cela pourrait même inclure un registre de tous les singletons avec une méthode principale ResetAll pour les réinitialiser tous !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X