Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utiliser des variables globales ?

Sujet résolu
    23 mars 2022 à 17:43:59

    Bonjour,

    Lors des divers messages postés ici, on voit souvent le conseil d'éviter les variables globales, pour des raisons diverses et variées, et préférer

    la programmation objet qui évite ce genre de choses

    Que penser alors de cette solution intermédiaire ? :

    class G():
    	''' A class for global variables '''
    	
        x_origin, y_origin = 0.0,0.0
        control_points = []
        #etc ...
    
    def XY_origin():
        ''' Gets the x,y origin '''
    
        G.x_origin, G.y_origin = 10.0, 0.0
    
        G.control_points.append(1)
        #etc ...


    Merci d'avance pour vos réponses

    -
    Edité par Phil_1857 23 mars 2022 à 17:45:12

    • Partager sur Facebook
    • Partager sur Twitter
      23 mars 2022 à 18:22:00

      pour moi c'est de la programmation objet, tu peux instancier G et utiliser les variables des instances ou celles de la classe (qui seront différentes)
      • Partager sur Facebook
      • Partager sur Twitter
        23 mars 2022 à 19:58:48

        Je pense que control_points à mon sens est une faute de conception

        Je n'arrive pas à comprendre l'intérêt de mettre x_origin et y_origin en tant que variable de classe

        Et je ne vois pas le rapport entre ce code horrible et les variables gobales...

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

          23 mars 2022 à 20:17:24

          Bonjour. Une classe globale qui contient des attributs c'est exactement la même chose que des variables globales. Il faut à tout prix éviter l'un comme l'autre.
          • Partager sur Facebook
          • Partager sur Twitter

          typage structurel ftw

            23 mars 2022 à 20:30:25

            Ah, je vois que les avis sont partagés :-)

            @fred1599:

            Et je ne vois pas le rapport entre ce code horrible et les variables gobales...

            Horrible, horrible, comme tu y vas:  -)

            Ben, le rapport, c'est que j'évite le mot global dans chacune des fonctions

            class G()
                toto = 0
            
            def une_fonction():
            
                G.toto = 10
            



            • Partager sur Facebook
            • Partager sur Twitter
              24 mars 2022 à 1:12:17

              Ça peut toujours être utile pour compter le nombre d'instanciations.
              Il y a peut-être des cas où les variables globales sont moins horribles que certains codes pour les éviter.

              Par exemple si je dois trainer plusieurs variables dans une fonction récursive.

              -
              Edité par PierrotLeFou 24 mars 2022 à 1:14:47

              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                24 mars 2022 à 7:26:52

                Phil_1857 a écrit:

                @fred1599:

                Et je ne vois pas le rapport entre ce code horrible et les variables gobales...

                Horrible, horrible, comme tu y vas:  -)

                Et moi qui pensait peser mes mots :D

                Déjà tu ne remplaces pas une variable globale. Variable globale a un module et variable de classe (globale à la classe) c'est tout à fait différent pour moi.

                Ensuite dans ton code il serait plus propre de faire dans ta fonction,

                class G:
                    def __init__(self):
                        self.toto: int = 0
                
                def une_fonction(g: G):
                    g.toto = 10
                
                my_g = G()
                une_fonction(my_g)
                print(my_g.toto)
                
                • Partager sur Facebook
                • Partager sur Twitter

                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                  24 mars 2022 à 7:38:12

                  Salut,

                  Pour moi l'utilisation de global est plus un problème de conception qu'autre chose, les fonctions peuvent prendre en argument des valeurs et en retourner, il faut les utiliser abondamment, on retrouve souvent l'utilisation de global chez les débutants, car le code n'est pas pensé et ils se mettent à créer de la variable à la volée.

                  -
                  Edité par Diablo76 24 mars 2022 à 7:55:53

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mars 2022 à 10:25:14

                    Bonjour,

                    Merci à tous pour vos réponses

                    J'ai bien noté le code de fred1599

                    Effectivement l'utilisation de global n'est pas fameuse, c'est bien reconnu par tout le monde

                    on retrouve souvent l'utilisation de global chez les débutants"

                    Cependant, je connais au moins un cas ou l'on ne peut les éviter, et le code est écrit par des professionnels, ca se passe dans un logiciel de CFAO édité par une compagnie allemande bien connue, les post processeurs (programme qui récupère les données d'usinage directement du logiciel et écrit le programme qui pilotera la machine à commande numérique dans l'atelier) sont écrits en langage TCL, et le seul moyen de récupérer les variables générées à la volée par la CFAO dans les procédures TCL est de les globaliser, mais c'est vraiment un cas particulier

                    Ca ressemble un peu à ça (j'ai volontairement modifié et francisé les noms):

                    proc debut_de_programme {} {
                    
                        global nom_du_fichier nom_de_login mode_de_sortie_des_arcs
                        etc, etc .... 
                    }



                    -
                    Edité par Phil_1857 24 mars 2022 à 10:26:03

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mars 2022 à 15:18:36

                      Phil_1857 a écrit:

                      J'ai bien noté le code de fred1599

                      C'est pas comme ça que j'aurai fais, j'ai adapté à ton exemple...

                      Phil_1857 a écrit:

                      Cependant, je connais au moins un cas ou l'on ne peut les éviter, et le code est écrit par des professionnels, ca se passe dans un logiciel de CFAO édité par une compagnie allemande bien connue, les post processeurs (programme qui récupère les données d'usinage directement du logiciel et écrit le programme qui pilotera la machine à commande numérique dans l'atelier) sont écrits en langage TCL, et le seul moyen de récupérer les variables générées à la volée par la CFAO dans les procédures TCL est de les globaliser, mais c'est vraiment un cas particulier

                      Je ne connais pas TCL, difficile de m'exprimer sur le sujet.

                      Pour des variables globales, souvent je préfère créer un module (constants.py) et l'importer pour y récupérer sa valeur.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                        24 mars 2022 à 16:43:01

                        Hello Fred,

                        Oui, oui, tu a raison

                        En TCL, on peut passer des arguments aux procédures (aux fonctions)  et retourner des valeurs, comme en Python

                        Mais je voulais simplement citer un cas, qui n'est pas un truc d'amateur, où l'on est obligé de recourir aux variables globales

                        (le logiciel de CFAO génère des évènements et crée des variables au fur et à mesure qu'il analyse les opérations d'usinage,

                        et donc il faut bien récupérer ces variables dans les procédures TCL, autrement dit transférer ces données créées dans l'exécutable du logiciel vers

                        le fichier TCL du post processeur)

                        -
                        Edité par Phil_1857 24 mars 2022 à 16:43:58

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 mars 2022 à 16:54:37

                          > Pour des variables globales, souvent je préfère créer un module (constants.py) et l'importer pour y récupérer sa valeur.
                          Et tu n'appelles pas ça des variables globales?
                          Le fait qu'elles soient un peu cachées ne les rend pas moins globales.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                            25 mars 2022 à 14:26:33

                            Le but est de ne pas être caché, au contraire... le but est de les rassembler !

                            Qu'appelles-tu variables globales ? 

                            La manière que je présente est surtout prévu pour accéder à des constantes qui sont effectivement globales à un module.

                            La variable globale en ce qui me concerne est une variable qu'on définie en début de module et qu'on souhaite modifier dans des fonctions ou des classes d'un module.

                            C'est pas tout à fait ce que je propose... avec mon constants.py

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                              25 mars 2022 à 14:36:48

                              Pas quelque chose du genre?
                              >>> from math import *                                                                                                  
                              >>> pi                                                                                                                  
                              3.141592653589793                                                                                                       
                              >>> pi=4                                                                                                                
                              >>> pi                                                                                                                  
                              4
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                25 mars 2022 à 16:52:44

                                En terme sémantique du coup pour répondre sur un cas applicatif quelles sont les conceptions que vous avez d'un "container" pour être générique dans l'appellation stockant des données d'un fichier de configuration qui pourraient être modifié par exemple à la volée. L'idée du "global" c'est bien dans tous les cas d'avoir quelque chose d'accessible dans toute l'application... Et la raison de ne pas vouloir de variables globales c'est pour éviter des problèmes divers, ça ne repose pas non plus sur une idée en l'air.

                                Après je suis d'accord pour dire qu'on peut limiter la portée, mais simplement en se reportant sur un tel exemple qui va revenir très souvent peut être même que c'est l'exemple type qui va revenir, ça permettra d'être moins abstrait.

                                Si on se base sur les principes la constante ne se modifie pas, la variable si, seulement un programme ne va pas forcément utiliser que des constantes à moins qu'il soit très limité. Dès lors qu'on entre dans une logique de sauvegarde des paramètres et modifications sans réinitialisation, le développeur va être amené à s'interroger et c'est là où c'est intéressant de définir les bonnes pratiques.

                                -
                                Edité par Daerlnaxe 25 mars 2022 à 16:56:41

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 mars 2022 à 18:35:34

                                  PierrotLeFou a écrit:

                                  Pas quelque chose du genre?
                                  >>> from math import *                                                                                                  
                                  >>> pi                                                                                                                  
                                  3.141592653589793                                                                                                       
                                  >>> pi=4                                                                                                                
                                  >>> pi                                                                                                                  
                                  4


                                  Oui et non, le but de mettre cela dans un module constants, c'est de charger au démarrage d'un projet et ne pas en modifier son contenu, mais ça reste un choix du développeur. Un peu comme le module settings.py connu du framework Django par exemple.

                                  La variable globale c'est essayer de,

                                  PI = 3.14
                                  
                                  def change_pi():
                                      # modifier la valeur de PI
                                  
                                  

                                  faire cela par exemple.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                  Utiliser des variables globales ?

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  • Editeur
                                  • Markdown