69 votes

Les singletons : une bonne conception ou une béquille ?

Les singletons sont un modèle de conception très discuté, c'est pourquoi j'ai voulu savoir ce qu'en pensait la communauté Stack Overflow.

Veuillez justifier vos opinions, et ne pas vous contenter de dire que les singletons sont réservés aux programmeurs paresseux.

Voici un assez bon article sur la question, bien qu'il s'oppose à l'utilisation des singletons : scientificninja.com : performant-singletons .

Quelqu'un a-t-il d'autres bons articles à ce sujet ? Peut-être à l'appui des Singletons ?

56voto

Tyler Points 16516

Pour la défense des singletons :

  • Elles ne sont pas aussi mauvaises que les globales parce que les globaux n'ont pas d'ordre d'initialisation standard, et vous pourriez facilement voir des bogues non déterministes dus à des ordres de dépendance naïfs ou inattendus. Les singletons (en supposant qu'ils soient alloués sur le tas) sont créés après tous les globaux, et à un endroit très prévisible du code.
  • Ils sont très utiles pour les systèmes à faible consommation de ressources et les systèmes de mise en cache. comme une interface avec un périphérique d'E/S lent. Si vous construisez intelligemment une interface singleton pour un périphérique lent et que personne ne l'appelle jamais, vous ne perdrez pas de temps. Si un autre morceau de code l'appelle depuis plusieurs endroits, votre singleton peut optimiser la mise en cache pour les deux simultanément, et éviter les doubles recherches. Vous pouvez aussi facilement éviter toute condition de blocage sur la ressource contrôlée par le singleton.

Contre les singletons :

  • En C++, il n'existe pas de moyen efficace de nettoyer automatiquement les singletons. Il y a des solutions de contournement et des moyens un peu plus compliqués, mais il n'y a pas de moyen simple et universel de s'assurer que le destructeur d'un singleton est toujours appelé. Ce n'est pas si terrible du point de vue de la mémoire - il suffit de penser à plus de variables globales, dans ce but. Mais cela peut être mauvais si votre singleton alloue d'autres ressources (par exemple, verrouille certains fichiers) et ne les libère pas.

Mon opinion personnelle :

J'utilise des singletons, mais je les évite s'il existe une alternative raisonnable. Cela a bien fonctionné pour moi jusqu'à présent, et j'ai trouvé qu'ils étaient testables, bien que cela représente un peu plus de travail à tester.

5 votes

L'hypothèse du premier point est un peu exagérée, car l'allocation du tas n'est pas la façon dont les singletons sont créés (en C++ au moins).

3 votes

Je n'en suis pas sûr, MadKeithV. Il existe un modèle standard où une fonction membre, disons MyClass* MyClass::get_instance(), vérifie un pointeur de membre statique et, s'il est NULL, appelle new pour allouer (sur le tas) l'instance partagée. Comment un singleton pourrait-il vivre ailleurs ?

0 votes

Pour ce qui est de l'inconvénient en C++, jetez un coup d'œil au singleton de Meyers.

38voto

Brian Points 7072

Google dispose d'une Détecteur de singleton pour Java qui, je crois, a commencé comme un outil qui doit être exécuté sur tout le code produit chez Google. En résumé, la raison pour laquelle il faut supprimer les singletons :

parce qu'ils peuvent ma difficiles et masquer des problèmes de conception. conception

Pour une explication plus explicite, voir ' Pourquoi les singletons sont controversés de Google.

0 votes

Je soupçonne qu'il est exagéré de dire que cela "doit être exécuté sur tout le code produit par Google" (d'une part, ils utilisent probablement d'autres langages).

0 votes

Je crois que Java, Python et C++ sont les langages approuvés par Google.

1 votes

Ils peuvent également utiliser le javascript : steve-yegge.blogspot.com/2007/06/rhino-on-rails.html

31voto

Orion Edwards Points 54939

Un singleton n'est rien d'autre qu'un ensemble de variables globales habillées de façon fantaisiste.

Les variables globales ont leur utilité, tout comme les singletons, mais si vous pensez que vous faites quelque chose de cool et d'utile avec un singleton au lieu d'utiliser une horrible variable globale (tout le monde sait que les variables globales sont mauvaises), vous vous trompez malheureusement.

1 votes

Les variables globales... et les méthodes. un objet global même...

1 votes

Un singleton ne doit pas nécessairement être un véritable objet global.

27voto

denis phillips Points 7349

L'objectif d'un singleton est de s'assurer qu'une classe n'a qu'une seule instance et de fournir un point d'accès global à celle-ci. La plupart du temps, l'accent est mis sur l'instance unique. Imaginez que l'on parle de Globalton. Ce nom serait moins attrayant, car il mettrait l'accent sur les connotations (généralement) négatives d'une variable globale.

La plupart des bons arguments contre les singletons sont liés à la difficulté qu'ils présentent dans les tests, car il n'est pas facile de créer des doubles de test pour eux.

11 votes

Alors pourquoi une classe devrait-elle s'assurer elle-même qu'elle n'a qu'une seule instance ? Cela va à l'encontre des objectifs de la programmation orientée objet.

3 votes

Normalement, vous ne voulez qu'un seul dispositif d'enregistrement ? Ou bien vous encapsulez une dll vaudou, et vous ne voulez pas qu'il soit possible de charger la dll deux fois ?

2 votes

@Calyth mais pourquoi faire en sorte que cela relève de la responsabilité de la classe elle-même alors qu'il s'agit clairement d'une responsabilité du système. (n'importe quelle instance de l'objet fonctionnera parfaitement, mais le système pourrait échouer si la contrainte de n'avoir qu'une seule instance vivante à la fois n'est pas respectée).

23voto

Bleadof Points 731

Il y a trois très bons articles de blog sur les singletons par Miško Hevery sur le blog de Google Testing.

  1. Les singletons sont des menteurs pathologiques
  2. Où sont passés tous les singletons ?
  3. Cause première des singletons

1 votes

Woow, c'est vraiment intéressant, mais je veux des solutions ! :-) txn

4 votes

Je pense que l'une des "solutions" est l'injection de dépendances qui gère en fait l'injection d'instance pour vous et qui fait que le singleton n'est plus un anti-modèle :) Consultez Guice ! code.google.com/p/google-guice

0 votes

1. Problème avec le premier article. Vous pourriez simplement faire du singleton un argument du constructeur et résoudre totalement le problème de l'article. 2. Les singleton n'ont pas besoin d'être globaux. Remplacez donc "shared objects" dans l'article par Singleton et tout fonctionnera encore. 3. Ce n'est que lorsqu'on arrive au troisième article qu'il couvre toutes les conneries des deux premiers en disant "oh, la mauvaise chose à laquelle je faisais référence est le modèle de conception où l'accès au "singleton" est vraiment global". Eh bien, c'est clair. Vous avez donc écrit trois articles pour dire simplement que les globaux sont mauvais, surtout lorsqu'ils sont utilisés de manière complexe.

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