2011-07-24 10 views
1

Je l'admets. J'utilise des singletons. Je sais ce que vous pouvez tous dire, et franchement, en voyant toutes ces réponses sur Internet, en parlant des mauvais aspects des singletons, et en les déconseillant, j'ai vraiment remis en question mes pratiques de programmation.Singletons: Avantages, inconvénients, Design Concerns

J'ai déjà lu quelques articles dans StackOverflow concernant Singletons, mais je poste cette question non seulement pour poser des questions à leur sujet, mais pour voir quelques idées sur la façon dont je les utilise dans mes programmes. Je pense que je dois vraiment clarifier certaines choses ici et demander des directions avant.

permet donc tenir compte de certains cas où j'utilise singletons beaucoup:

  1. Pour créer accesseurs à des variables globales, comme mon contrôleur de vue racine, les contrôleurs de vue spécifique et toujours en vigueur, l'état d'application, mon contexte objet global géré ... des choses comme ça
  2. Pour créer des classes d'utilitaires dont le travail consiste à gérer l'ensemble de l'application de données. Par exemple, je crée un Singleton qui va gérer ma base de données de mise en cache, qui repose sur des données de base. Comme j'ai besoin de créer des caches et d'autres choses à mettre dans la base de données dans différentes vues, il m'a semblé préférable de créer une classe qui gèrerait les entrées/sorties de la base de données (attention à la sécurité des threads).
  3. Gestion des sessions réseau. En fait, je l'utilise pour maintenir en vie une connexion et envoyer quelque chose comme un PINg à un serveur toutes les XX secondes.

Je pense que cela résume tout. Je voudrais vraiment les opinions des autres développeurs sur le sujet.

Pensez-vous qu'il existe de meilleures solutions pour ces problèmes ci-dessus?

Pensez-vous qu'il existe toujours de meilleures alternatives aux singletons et qu'elles devraient être évitées?

Est-il préférable, en termes de multithreading, d'oublier les singletons?

Toutes les recommandations et pensées seraient utiles, et les bienvenus.

+2

Pourquoi les gens disent-ils toujours que les singletons sont mauvais? Ils sont géniaux, je les utilise tout le temps. Si vous voulez éviter les singletons, vous devriez éviter complètement la POO. –

+0

Les questions à la recherche d'opinions ou de discussions d'autres développeurs peuvent être mieux placées sur [programmers.se]. Il y a en fait déjà quelques [posts sur singletons] (http://programmers.stackexchange.com/search?q=singletons) là-bas. –

+0

Singletons sont ** génial ** et la vie de programmation serait * pire * sans eux. http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html – Jacksonkr

Répondre

4

Les singlesons ne sont certainement pas toujours mauvais, mais comme vous le mentionnez, vous devez faire attention à la sécurité des threads (sur ce sujet, consultez cette blog post lors de l'initialisation singleton). Une des raisons pour lesquelles les singletons sont souvent décriés comme étant mauvais est qu'ils peuvent rendre plus difficile de "dimensionner" des parties d'un programme s'ils dépendent trop d'un singleton et de son comportement. Vous mentionnez l'accès à la base de données, un serveur ou une application de bureau peut commencer avec l'implémentation singleton pour gérer tous les besoins de base de données, puis essayer d'utiliser plusieurs connexions pour accélérer les requêtes indépendantes, etc.

Même dans une application iOS utilisant CoreData, il peut être utile de ne pas compter sur un ManagedObjectContext global sur votre délégué d'application ou sur un contrôleur de vue racine.

Si vous transmettez à chaque contrôleur de vue une référence à un objet ManagedObjectContext, vous pouvez gagner en flexibilité. La plupart du temps, vous passez simplement le même contexte d'un contrôleur de vue à l'autre, mais si vous décidez de le faire ultérieurement, vous pouvez par exemple créer un nouveau ManagedObjectContext pour une vue d'édition dans laquelle vous pouvez utiliser les fonctions d'annulation le contexte, mais seulement fusionner les changements dans le contexte "racine" si l'utilisateur décide de les sauvegarder ou les rejeter facilement autrement. Ou peut-être souhaitez-vous effectuer un traitement en arrière-plan sur un ensemble d'objets.Si tout fonctionne dans le même contexte, vous aurez des problèmes de synchronisation.

1
  • Pour créer accesseurs à des variables globales, comme mon contrôleur de vue racine, les contrôleurs spécifiques et toujours vue existante, l'état d'application, mon contexte global d'objet géré ... des trucs comme ça

Singletons are globals. Envelopper un global avec un autre global n'aide vraiment rien.

  • Pour créer des classes utilitaires dont le travail consiste à gérer l'ensemble de l'application de données. Par exemple, je crée un Singleton qui va gérer ma base de données de mise en cache, qui repose sur des données de base. Comme j'ai besoin de créer des caches et d'autres choses à mettre dans la base de données dans différentes vues, il m'a semblé préférable de créer une classe qui gèrerait les entrées/sorties de la base de données (attention à la sécurité des threads).

Bien sûr, mais cela n'a probablement pas besoin d'être un singleton. En effet, une partie de la conception de Core Data est qu'il est valable d'avoir plusieurs MOC qui parlent au même magasin.

  • Gestion des sessions réseau. En fait, je l'utilise pour maintenir en vie une connexion et envoyer quelque chose comme un PINg à un serveur toutes les XX secondes.

Cela devrait être un singleton si le serveur peut appliquer des n connexions par utilisateur/limite d'adresse IP. Sinon, il n'a probablement pas besoin d'être un singleton.

Comme je le mentionne dans mon article de blog précité, la solution que je préfère est de faire en sorte que chaque objet possède l'autre objet. Par exemple, votre objet MOC et vos objets de connexion appartiennent à un ou plusieurs objets qui doivent travailler avec eux. Cela améliore la gestion de la mémoire et des ressources (les objets singleton ne meurent jamais) et rend la conception globale de l'application beaucoup plus simple.

Questions connexes