IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Plusieurs singletons ou un général ?


Sujet :

Dotnet

  1. #1
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut Plusieurs singletons ou un général ?
    Bonjour à tous,

    Je suis confronté aujourd'hui à une situation que je rencontre finalement beaucoup, et je me pose une question en terme de design applicatif.
    Ce n'est pas un vrai problème, juste une curiosité en matière de design, et j'aimerai avoir quelques avis concernant ce sujet.

    Admettons que nous ayons plusieurs objets qui sont typiquement des singletons (appelons-les A, B et C).

    Quel est le meilleur design pour gérer ces singletons :
    • on accède à ces singletons de façon indépendante (via du A.Instance, B.Instance et C.Instance) ?
    • on créé un singleton général (appelons-le D), qui regroupe tous les singletons de l'application (on obtient donc D.Instance.A, D.Instance.B, D.Instance.C) ?
      En partant de ce principe, A, B et C ne sont plus des singletons, mais D est responsable des instances uniques.


    Votre avis m'intéresse

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Lutarez Voir le message
    Bonjour à tous,

    Je suis confronté aujourd'hui à une situation que je rencontre finalement beaucoup, et je me pose une question en terme de design applicatif.
    Ce n'est pas un vrai problème, juste une curiosité en matière de design, et j'aimerai avoir quelques avis concernant ce sujet.

    Admettons que nous ayons plusieurs objets qui sont typiquement des singletons (appelons-les A, B et C).



    Quel est le meilleur design pour gérer ces singletons :
    • on accède à ces singletons de façon indépendante (via du A.Instance, B.Instance et C.Instance) ?
    • on créé un singleton général (appelons-le D), qui regroupe tous les singletons de l'application (on obtient donc D.Instance.A, D.Instance.B, D.Instance.C) ?
      En partant de ce principe, A, B et C ne sont plus des singletons, mais D est responsable des instances uniques.
    Votre avis m'intéresse
    Je préfère que chaque classe soit responsable de son instanciation. Surtout que si tu laisses D instancier A, B ou C, tu casses le pattern en rendant les constructeurs de celles-ci non privés

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Une première réponse à apporter, avant même de se poser la question spécifiquement pour les singletons, et c'est dans le principe même de la programmation objet :

    - Si tes objets ont un lien entre-eux tel que l'on peut les considérer comme étant des éléments d'un objet plus global, alors oui, on peut réfléchir à créer cet objet global pour y intégrer ces objets là qui y deviendront alors des éléments
    - Si tes objets n'ont aucun lien entre-eux, qui ne correspondent pas à des entités similaires, alors non, on n'envisage même pas de les regrouper dans une entité de niveau supérieur.
    Comme on dit, on ne mélange pas les chèvres et les choux.

    Pour en revenir au singleton, j'ai rarement eu l'occasion d'en avoir à utiliser plusieurs dans un même projet, et j'ai même rarement eu l'occasion d'en avoir à utiliser régulièrement dans plusieurs projets. En fait les rares fois ou je ressent le besoin d'utiliser un singleton (une classe dans ces cas-là) sont à plus de 80% (estimatif) pour gérer la configuration du logiciel et la rendre disponible entre plusieurs modules, écrans, ...
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  4. #4
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut
    Merci pour vos retours

    Citation Envoyé par Nathanael Marchand Voir le message
    Je préfère que chaque classe soit responsable de son instanciation. Surtout que si tu laisses D instancier A, B ou C, tu casses le pattern en rendant les constructeurs de celles-ci non privés
    En .Net, on peut contourner le problème comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A a = (A)Activator.CreateInstance( typeof(A), true );
    Tu peux ainsi déclarer le constructeur de A en privé. Mais je suis absolument d'accord que cela casse en quelque sorte le pattern.

    Citation Envoyé par sevyc64 Voir le message
    Une première réponse à apporter, avant même de se poser la question spécifiquement pour les singletons, et c'est dans le principe même de la programmation objet :

    - Si tes objets ont un lien entre-eux tel que l'on peut les considérer comme étant des éléments d'un objet plus global, alors oui, on peut réfléchir à créer cet objet global pour y intégrer ces objets là qui y deviendront alors des éléments
    - Si tes objets n'ont aucun lien entre-eux, qui ne correspondent pas à des entités similaires, alors non, on n'envisage même pas de les regrouper dans une entité de niveau supérieur.
    Comme on dit, on ne mélange pas les chèvres et les choux.
    C'est une remarque très juste. J'avoue ne pas y avoir penser...

    Citation Envoyé par sevyc64 Voir le message
    Pour en revenir au singleton, j'ai rarement eu l'occasion d'en avoir à utiliser plusieurs dans un même projet, et j'ai même rarement eu l'occasion d'en avoir à utiliser régulièrement dans plusieurs projets. En fait les rares fois ou je ressent le besoin d'utiliser un singleton (une classe dans ces cas-là) sont à plus de 80% (estimatif) pour gérer la configuration du logiciel et la rendre disponible entre plusieurs modules, écrans, ...
    Travaillant énormément sur des applications graphiques (WPF en ce moment), le besoin de communication entre plusieurs écrans est flagrant. C'est d'autant plus vrai, je trouve, en WPF avec les bindings.
    En ce qui concerne le fait d'avoir plusieurs singletons, je dirai que cela dépend des besoins.

    Par exemple, je travaille ces derniers temps sur un éditeur de code. J'utilise au sein de l'application trois singletons :
    • un pour la configuration générale (langues, thèmes, gestion d'exception globales, etc);
    • un autre singleton responsable de la gestion des fichiers (lecture, écriture, suppression, création);
    • un dernier pour la compilation.

    Les deux derniers pourraient très bien être instanciés de façon ponctuelle, lorsque le besoin se fait sentir. Sauf que j'ai besoin d'y avoir accès quelque soit l'écran, et ce avec d'éventuels passages d'arguments (par exemple, demander une compilation depuis le gestionnaire de fichier).

    En pratique, cela fonctionne très bien, mais au fond, j'ai l'impression de commettre une énormité en terme de design.

  5. #5
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Bonjour,
    Juste une petite remarque, je pense qu'en .Net le problème c'est qu'il n'y a pas trop la culture de l'utilisation d'un framework IoC pour instancier et combiner les objet (Castle Windsor, Unity, Ninject).
    C'est a ce genre de framework que l'on délègue l'instanciation des objets avec une stratégie pour chacun : singleton, pool, prototype...
    Cela résoudrait tous ces questions.
    Et pour info la classe D serait une factory basée sur des singletons, un design pattern assez reconnu, ça se fait bien... après faut-il mutiliplier les factory par classe et bien là ça dépend effectivement du contexte.
    Sinon j'ai souvent remarqué qu'on code très rarement un singleton, c'est simple mais pas trivial... du coup il est souvent mal codé.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par NicoL__ Voir le message
    Sinon j'ai souvent remarqué qu'on code très rarement un singleton, c'est simple mais pas trivial... du coup il est souvent mal codé.
    En même temps, le meilleur moyen de faire un singleton propre et thread safe maintenant, c'est d'utiliser Lazy<T>

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/06/2007, 15h39
  2. Réponses: 7
    Dernier message: 03/04/2007, 16h30
  3. Réponses: 2
    Dernier message: 27/06/2006, 08h34
  4. Singleton sur plusieurs DLL
    Par 10_GOTO_10 dans le forum C++
    Réponses: 29
    Dernier message: 28/04/2006, 11h14
  5. Plusieurs instances d'un singleton pour plusieurs modules
    Par zoubidaman dans le forum C++Builder
    Réponses: 10
    Dernier message: 18/11/2005, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo