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

Windows Forms Discussion :

[C#] variables globales et bonne implémentation singleton


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 163
    Par défaut [C#] variables globales et bonne implémentation singleton
    Bonjour à tous,

    j'ai un petit soucis d'architecture logicielle. Voilà je développe une appli winform en C# qui a une petite fenêtre dans laquelle l'utilisateur peut régler l'appli en manipulant des données globales ( évidemment).

    Ces paramètres sont enregistrés dans la base de données sql server qui alimente l'application. Pour çà j'ai une petite table param.

    J'ai dois donc pouvoir lire et enregistrer depuis et dans cette table, les modifications de parametres de l'appli. Pour faire çà j'ai effectué des recherches ("variables globales") sur le forum et je suis tombé sur des discussions interessante traitant des classes static et des singleton.

    Je pense avoir saisis le fonctionnement de l'une et l'autre méthode. Avec le singleton j'ai l'assurance qu'il n'existera qu'une seule instance de mon objet. Ce dernier étant visible de l'application entière.

    Pour en venir au but, j'ai deux soucis.
    Le premier est que je ne suis pas certain de l'avoir implémenter comme il faut. Ci dessous mon code commenté avec ce que j'ai compris. Si quelqu'un veut me reprendre en cas d'erreur ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     // sealed permet d'interdire l'heritage si je me trompe pas
    public sealed class SingletonMesParam
    {
            private string p_param1;
            private string p_param2;
            private string p_param3;
    
            public string param1
            {
                get{return p_param1;}
                set{p_param1 = value;}
            }
            public string param2{//etc ...}
            public string param3{//etc ...}
            
          //constructeur privé - du coup pas possible d'avoir d'autre instance
          private SingletonMesParam()
          {
                // 
                // TODO : ajoutez ici la logique du constructeur
                //
                this.LireDepuisBDD(); 
          }
    
            // cette ligne je comprend pas a quoi elle sert, je l'ai repiqué sur un exemple
            private static SingletonParamLiv _SingletonParamLiv;
            
             // Ce bloc me permet d'obtenir une instance ( est elle unique ?)
            // si l'objet n'est pas instancié, on appelle le constructeur qui appelle 
             public static SingletonParamLiv GetInstance()
            {
                if (_SingletonParamLiv == null) 
                { 
                     //je comprend toujours pas. C'est quoi ce _SingletonParamLiv.
                    _SingletonParamLiv = new SingletonParamLiv(); 
                }
                return _SingletonParamLiv; 
            }
    
            public void LireDepuisBDD(string sChaineCon)
            {
                  // ici code d'accès au données et on valorise
                 // les propriétés de l'objet
            }
    
    }
    Le deuxieme est que j'ai essayé de comparer l'utilisation des classes static avec l'implémentation ci dessus et je ne comprend pas la différence. Est ce que quelqu'un pourrait m'aider à y voir plus clair.


    Merci d'avance.


    mots clés : singleton design pattern variables globales parametre

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    Citation Envoyé par grome
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            
            private static SingletonParamLiv _SingletonParamLiv;
            
             // Ce bloc me permet d'obtenir une instance ( est elle unique ?)
            // si l'objet n'est pas instancié, on appelle le constructeur qui appelle 
             public static SingletonParamLiv GetInstance()
            {
                if (_SingletonParamLiv == null) 
                { 
                     //je comprend toujours pas. C'est quoi ce _SingletonParamLiv.
                    _SingletonParamLiv = new SingletonParamLiv(); 
                }
                return _SingletonParamLiv; 
            }
    Pour moi ce passage ne sert a rien puisque on ne connias pas d'objet SingletonParamLiv. Ca viens peut être d'un Ctrl-C Ctrl-V trop Violent
    Faut voir si ca marche correctement sans ces lignes, à mon avis oui.

    Les classes static sontutilisées pour ne pas avoir a Instnacier d'objet de ce type pour en utiliser des fonctions. C'est super pratique pour des méthodes "Outils" réutilisables, tu peux les utiliser et les jeté tranquil. Après la différence avec Singleton, je sais pas du tout je connais pas cette technique.
    c'est tout désolé

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Par défaut
    Je pense que tu parle du disign pattern "Singleton"
    Si c'est bien ca je te donne un p'tit exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Singleton {
            private static Singleton uniqueInstance; // own instance
     
            private Singleton() {
            }
     
            public static Singleton GetInstance() {
     
                // 'lazy' evaluate instance
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
     
                return uniqueInstance;
            }
     
            public void WriteSomething() {
                Console.WriteLine("Singleton.WriteSomething() running" );
            }
        }
    En espérant que tu trouve ton bonheur

  4. #4
    Membre actif Avatar de netomin
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Par défaut
    Comme tu verra dans ce lien, il n'y a pas qu'une seule "bonne" façon d'implementer une classe singleton:

    http://www.yoda.arachsys.com/csharp/singleton.html

    bon codage à +

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 163
    Par défaut
    Merci pour votre aide. On voit bien qu'il y a quand même quelques subtilités dans la manière d'implémenter une classe singleton.

    Netomin, merci pour le lien.

    Netalp merci pour l'exemple. Ca correspond à ce que j'ai fait mais je ne comprend pas a quoi sert la ligne suivante dans ton exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static Singleton uniqueInstance; // own instance
    dans le mien ca correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static SingletonParamLiv _SingletonParamLiv
    En ce qui concerne les méthodes static. J'ai effectivement une classe dans la laquelle j'ai mis un ensemble de méthode en static. C'est ma boite à outils en quelque sorte. Ceci dit, dans cette boite à outil j'ai essayé de mettre des propriétés en static. Et bien si je les modifie à un endroit précis de mon application elle sont modifiée pour toute l'appli. C'est pour çà que je ne comprend pas la différence avec mon singleton.

    Suis je clair dans l'explication de mon problème ?

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 163
    Par défaut
    Autre chose :

    Sur l'utilisation du Singleton (c'est pour être sur que je fais bien tous k'est ce k'y faut, vu que je vois un peu de tout).

    Le but du singleton c'est qu'il soit instancié une fois et puis ensuite on l'utilise n'importe ou dans l'appli, on est certain que c'est la même instance. Où dois je faire cette instanciation. Dans le forum je suis tombé sur un post ou quelqu'un (neguib) expliquait qu'il fait çà dans le main avant le Application run.
    http://www.developpez.net/forums/sho...ables+globales
    vous en pensez quoi ?

  7. #7
    Membre actif Avatar de netomin
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 81
    Par défaut
    Il y a dejà quelqu'un qui a posé ta question dans un forum en anglais.
    En resumé une classe statique et une classe singleton t'offrent la possibilité d'avoir une seule et unique instance de ta classe. Donc tu peux choisir l'une ou l'autre si c'est la seule chose que tu as besoin de faire.

    Sinon un de commentaires de ce lien t'explique les differences entre les deux façons d'implementer ta classe, je cite:

    The Singleton pattern has several advantages over the "static class" pattern. First, a singleton can extend classes and implement interfaces, while a static class cannot (well, it can extend classes, but it does not inherit their instance members). A singleton can be initialized lazily or asynchronously while a static class is generally initialized when it is first loaded. A sinlgeton class can be extended and it's methods overidden.
    Perhaps the most important advantage, though, is that singletons can be handled polymorphically without forcing their users to assume that there is only one instance.
    Je pense que ça repond ta question, non?

    J'ajoute le lien:
    http://www.theserverside.com/discuss...hread_id=25937

    En plus je te rappel aussi que dans le liens que je t'envoyé avant il y a une autre avantage d'une classe singleton et c'est que tu peux la faire thread-safe, c'est à dire que si tu as plus d'un thread s'executant dans ton application il y aura encore une seule instance.
    à +

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/03/2014, 09h57
  2. De la bonne pratique des variables globales...
    Par say dans le forum C++Builder
    Réponses: 9
    Dernier message: 25/11/2005, 09h47
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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