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

C++ Discussion :

Quelle(s) méthode(s) pour supprimer les variables globales?


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut Quelle(s) méthode(s) pour supprimer les variables globales?
    Bonjour tout le monde,
    Comme je le préciser dans un précédent post, mon code est actuellement composé de variables globales (statiques ou non) d'une quantité telle qu'un "int" ne suffirait pas pour la décrire!

    Le but de ces variables globales étaient un accès rapide au données...

    Je voudrais savoir si une méthode prédomine par rapport à une autre pour supprimer ces variables globales?

    Pour celles qui sont statiques, je pensais faire une sorte de classe créée qu'une seule fois (un singleton donc) contenant des variables ainsi que des getters/setters.

    Qu'est-ce que vous en pensez?

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonjour,

    A lire ton thread précédent, j'ai l'impression qu'il t'arrive des codes un peu crasse où il y a un peu partout des globales.

    Je ne pense pas qu'un singleton cache misère résoudra tes problèmes.

    A mon avis, le meilleur cache misère dans ces cas là, c'est la classe.

    Si tu as une fonction libre qui fait appel à des statiques :
    - tu la mets sous forme de méthode de classe
    - tu rapatries les statiques sous forme de variables membres de ta classe
    - tu initialises les variables membres (souvent paramètre d'un algo) avec les valeurs par défaut dans le constructeur
    - tu fais appel à ta classe dans l'ancienne fonction libre pour ne pas péter les codes existant

    Conseil :
    - Mettre un ou deux tests unitaires avant...
    - Ils vont te sortir que c'est plus lent maintenant. Répond que c'est devenu multi-threadable.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour ta réponse.

    Citation Envoyé par bretus Voir le message
    A lire ton thread précédent, j'ai l'impression qu'il t'arrive des codes un peu crasse où il y a un peu partout des globales.
    Exactement....

    Citation Envoyé par bretus Voir le message
    Si tu as une fonction libre qui fait appel à des statiques :
    Justement, il n'y a pas de fonction libre. Il y a des méthodes de certaines classes qui appelle des variables globales voire parfois des variables privées statiques de classes.

    Le plus gros problème est la portée de ces variables: elles peuvent être initialisée un peu partout dans le code actuel... Alors qu'en pratique, il n'y a qu'une seule initialisation (lors de la lecture d'un fichier de paramètre avec boost::program_option quand même ^^) d'où mon idée de singleton.

    Voici en gros à quoi ca ressemble actuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class A
    {
      static double var1;
    public:
      A();
      virtual ~A();
    };
    Dans un autre fichier (un qui regroupe un peu tout):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "A.h"
     
    double A::var1 = 0.01;  //Déjà je ne comprends pas comment ca peut compiler vu que var1 est privée...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 16
    Points
    16
    Par défaut
    Bonsoir,

    Tu peux très bien initialiser ta variable var1 statique private dans A.cpp, c'est tout à fait normal (ce serait plus intrigant si tu le faisais dans un main ).

    Le singleton me paraît être une assez bonne idée vu que tu initialises une seule fois mais je ne suis pas un expert. J'avais déjà eu ce genre de souci mais comme c'était à petite échelle je m'étais contenté des variables statiques crades.

    Bonne chance

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Un singleton ou un monostate pose fondamentalement les mêmes problèmes qu'une variable globale (cf ici par exemple).

    Par contre, je pense que ma réponse risque de ne pas te faire avancer. Je pense que ce genre de code a du mal à se corriger 'localement', c'est à dire par petite touche. Il mérite probablement de reprendre toute l'architecture et de la reposer correctement. Ensuite seulement il faut faire un plan d'action découpée en étapes plus modestes. Les petites corrections risquent de changer de 'style' mais pas de s'attaquer réellement à un fondamentale problème d'architecture.

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonsoir,

    Une façon de limiter la portée des variables "globales" sans affecter les performances, et limitant le temps à passer à faire des modifs,
    c'est d'utiliser les espaces de noms.

    namespace GrosBordel
    {
    // les variables globales
    }


    Dans le code client

    GrosBordel::<nom de variable globale>
    ou bien
    using namespace GrosBordel en en-tête de fichier source (.cpp)

    P.S : Désolé pour le nom de l'espace de nom. Mais c'est un peu vrai quand même si j'ai bien compris

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Bonjour à tous!
    Merci pour vos réponses.

    @Bioche: Je vais je pense tenter de faire un singleton pour voir si c'est un peu plus propre... dans un premier temps.

    @3DArchi: Je suis d'accord qu'il faudrait revoir toute l'architecture malheureusement, ca ne semble pas être les priorités....

    @BlueMonkey: le nom du namespace est presque parfait: il faut juste le mettre en anglais et c'est bon ^^.

Discussions similaires

  1. pour supprimer les doublons d'une table qcq
    Par lamjed dans le forum Oracle
    Réponses: 7
    Dernier message: 19/12/2008, 16h42
  2. Quelle méthode utiliser pour traiter les images
    Par babozfr dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 02/03/2007, 15h40
  3. Script shell pour persister les variables exportées
    Par Giovanny Temgoua dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 03/10/2006, 09h07
  4. Supprimer la mémoire utilisée par les variables globales
    Par dnaprotector dans le forum OpenGL
    Réponses: 4
    Dernier message: 21/07/2005, 13h18
  5. Méthode simple pour gérer les collisions
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/02/2005, 13h43

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