2161 votes

Ce qui est si mal à propos de singletons?

Le pattern singleton est un entièrement libérées membre du GoF's modèles de livre, mais dernièrement, il semble plutôt orphelins par le développeur monde. Je l'utilise encore beaucoup de singletons, en particulier pour les classes de fabrique, et tandis que vous devez être un peu prudent à propos de multithreading questions (comme toute la classe en fait), je ne vois pas pourquoi ils sont si terribles.

Un Débordement de pile en particulier semble supposer que tout le monde accepte que les Singletons sont le mal. Pourquoi?

1418voto

Jim Burger Points 3166

Reformulation de Brian Bouton:

  1. Ils sont généralement utilisés comme une instance globale, pourquoi est-ce si mauvais? Parce que vous cachent les dépendances de votre application dans votre code, au lieu de les exposer à travers les interfaces. Faire quelque chose de global pour éviter de le transmettre autour de est une odeur de code.

  2. Ils violent le principe de responsabilité unique: en vertu du fait qu'ils ont leur propre création et de cycle de vie.

  3. Ils intrinsèquement cause du code étroitement couplés. Cela fait semblant sortir sous test assez difficile dans de nombreux cas.

  4. Ils portent de l'etat autour de la durée de vie de l'application. Un autre coup d'essai puisque vous pouvez vous retrouver avec une situation où les tests doivent être commandés qui est un grand pas pas pour les tests unitaires. Pourquoi? Parce que chaque unité de test doivent être indépendants l'un de l'autre.

494voto

S.Lott Points 207588

Les Singletons résoudre un (et un seul) problème.

Les Conflits De Ressources.

Si vous avez quelques ressources qui (1) ne peut avoir qu'une seule instance, et (2) vous avez besoin de gérer d'une instance unique, vous avez besoin d'un singleton.

Il n'y a pas beaucoup d'exemples. Un fichier journal est le grand. Vous ne voulez pas de simplement abandonner un seul fichier journal. Vous souhaitez chasse, de synchroniser et de le fermer correctement. Ceci est un exemple d'une seule ressource partagée qui doit être géré.

Il est rare que vous avez besoin d'un singleton. La raison qu'ils sont mauvais, c'est qu'ils se sentent comme un mondiale et elles sont entièrement libérées membre du GoF Modèles de Conception de livre.

Quand vous pensez que vous avez besoin d'un mondial, vous êtes probablement faire une terrible erreur de conception.

385voto

Phil Wright Points 11696

Certains de codage snobs regarder vers le bas sur eux que juste un glorifié mondiale. De la même manière que beaucoup de gens détestent le goto déclaration il ya d'autres qui détestent l'idée d'utiliser un mondial. J'ai vu plusieurs développeurs se donnent un mal fou pour éviter un mondial parce qu'ils ont étudiés à l'aide d'un comme un aveu d'échec. Étrange, mais vrai.

Dans la pratique, le Singleton pattern est juste une technique de programmation qui est une partie utile de votre trousse de concepts. De temps en temps, vous pourriez trouver qu'il est la solution idéale et donc de l'utiliser. Mais de l'utiliser de sorte que vous peut se vanter d'avoir l'aide d'un modèle de conception est tout aussi stupide que de lui interdire à jamais l'utiliser, car il est juste un mondial.

239voto

jason Points 526

Misko Hevery, à partir de Google, a quelques articles intéressants sur exactement de ce sujet...

Les Singletons sont des Menteurs Pathologiques

Où sont tous les Singletons Disparu

145voto

Cem Catikkas Points 4986

Je pense que la confusion est causée par le fait que les gens ne connaissent pas la réelle application du pattern Singleton. Je ne peux pas insister assez sur ce point. Singleton est pas un motif pour envelopper globals. Le pattern Singleton ne doit être utilisé pour garantir que l'une et une seule instance d'une classe donnée existe au moment de l'exécution.

Les gens pensent Singleton est le mal parce qu'ils utilisent pour le reste. C'est à cause de cette confusion qui Singleton est méprisé. S'il vous plaît, ne confondez pas les Singletons et globales. Si utilisé pour le but qui lui est destiné, vous gagnerez de l'extrême bénéficie d'un Singleton.

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