97 votes

Pourquoi Singleton est-il considéré comme un anti-modèle ?

Duplicata possible :
Qu'est-ce que les singletons ont de si mauvais ?

Modèle de conception singleton : Pièges

Anti-modèle singleton

J'ai entendu récemment que Singleton était un anti-modèle. Je sais que cela a à voir avec le fait que rendre une classe singleton revient à faire de cette instance unique une variable globale, mais cela fait aussi beaucoup plus que cela (limiter le nombre d'instances de cet objet, gérer l'instanciation, etc ).

Pourquoi exactement Singleton est-il considéré comme un anti-modèle ? Et quelles sont les alternatives ?

88voto

James Black Points 26183

Pour vous aider à répondre, voici un complément d'information sur le commentaire anti-modèle :

elle est surutilisée, introduit des restrictions inutiles dans des situations où une seule instance d'une classe n'est pas réellement nécessaire, et introduit un état global dans une application

De : http://en.wikipedia.org/wiki/Singleton_pattern

Pour en savoir plus, vous pouvez consulter le site : https://www.michaelsafyan.com/tech/design/patterns/singleton

Voici une excellente conclusion au blog ci-dessus :

En bref, le modèle singleton rend le code plus complexe, moins utile, et une vraie douleur à réutiliser ou à tester. Éliminer les singletons peut être délicat, mais c'est un effort qui en vaut la peine.

OK, donc, la raison pour laquelle il s'agit d'un anti-modèle est bien décrite dans ce paragraphe, et, comme l'exprime l'auteur, cela couple étroitement votre code au singleton.

Si vous voulez utiliser un singleton, vous pouvez réfléchir à votre conception, mais il y a des moments où il est utile.

Par exemple, une fois, j'ai dû écrire une application qui pouvait avoir au maximum une connexion à une base de données, pour traiter des milliers de demandes. Un singleton est donc logique puisque je suis contraint par les ressources à n'avoir qu'une seule instance.

Mais, généralement, cela est utilisé pour simplifier le code, sans penser aux difficultés qui seront introduites.

Par exemple, et cela s'applique également aux classes statiques, si vous effectuez des tests unitaires, ou si vous avez de la concurrence, alors l'état d'une requête changera l'état et cela peut causer des problèmes, car la classe qui appelle l'instance peut supposer que l'état est celui qu'elle attendait.

Je pense que la meilleure façon de contester l'utilisation est de réfléchir à la façon de le gérer si votre programme est multithreadé, et une façon simple de le faire est de le tester en unité, si vous avez plusieurs tests qui s'exécutent en même temps.

Si vous constatez que vous en avez encore besoin, alors utilisez-la, mais prenez conscience des problèmes que vous rencontrerez plus tard.

30voto

Jack Edmonds Points 10264

Je ne considérerais pas exactement le singleton comme un anti-modèle.

Cependant, un singleton est essentiellement un moyen d'utiliser des variables globales. Et les variables globales sont mauvaises car n'importe quel code n'importe où dans le système peut changer leurs valeurs. Ainsi, lors du débogage, il peut être difficile de déterminer quel chemin de code mène à l'état actuel du singleton.

9voto

daniel Points 1326

Les singletons sont souvent mal implémentés. Voir double-checked-locking.

Dans quelle mesure une instance Singleton doit-elle être unique ? Comme les environnements multithreads, le clustering, etc.

Les singletons peuvent être difficiles à tester.

La mémoire allouée à un Singleton ne peut pas être libérée.

Avec un usage excessif des singletons, on passe de la programmation orientée objet à la programmation procédurale.

9voto

peter.aryanto Points 482

Je pense que c'est considéré comme un anti-modèle parce qu'une classe Singleton ne peut pas être instanciée de manière normale par un autre objet (sauf en appelant une méthode communément appelée "getInstance"). Ainsi, on aura l'impression que la classe est utilisée directement sans l'instancier pour créer d'abord un objet utilisable.

Je suis d'accord avec vous que Singleton peut servir d'instance unique globale. J'ai appris de certaines personnes que comme alternatives au Singleton, nous pouvons utiliser des variables statiques et/ou finales, et nous pouvons également utiliser l'énumération (afin de pouvoir regrouper plusieurs variables sous un seul nom de groupe comme nous le faisons habituellement lorsque nous travaillons avec une classe/objet normale).

Cependant, ces alternatives ne peuvent qu'égaler la capacité d'une classe Singleton à stocker des états/valeurs. Si nous avons besoin de fonctions uniques pour travailler, ces variables statiques/finales et ces énumérations ne peuvent pas nous aider. À mon avis, c'est le cas lorsque nous devons utiliser une classe Singleton (lorsque nous avons besoin de fonctions uniques pour travailler avec des états/valeurs statiques/finales).

Santé... :))

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