[Théorie] Justifier les variables globales
Bonjour
J'ai une petite question plus théorique que la plupart des posts de ce forum.
Il faut éviter au maximum l'utilisation de variables globales. Cependant, dans un projet, j'ai deux structures dont pratiquement toutes les fonctions ont besoin.
Par ailleurs, le projet utilisant GTK+, je me retrouve un peu limité quant au nombre de paramètres que je peux passer aux fonctions callback.
Alors j'ai décidé de mettre les deux structures en question (je parle de la définition de la structure mais également de l'instance de la structure) en globale.
Ca simplifie considérablement mon programme et il n'y a pas vraiment de problèmes de maintenance puisque, comme je l'ai dit, pratiquement toutes les fonctions en ont besoins.
Avec le projet, on doit rendre un rapport écrit qui contient toutes les justifications des algos utilisés ainsi que toute autre particularité. Les variables globales en ont partie.
Comment justifieriez-vous leur utilisation? Le fait de dire que toutes les fonctions en ont besoin est-elle une bonne justification?
Nas'
PS : ce message n'est peut-être pas dans le bon forum mais je ne vois pas où le mettre...
Re: [Théorie] Justifier les variables globales
Citation:
Envoyé par Nasky
J'ai une petite question plus théorique que la plupart des posts de ce forum.
Il faut éviter au maximum l'utilisation de variables globales.
Sais-tu pourquoi ?
http://emmanuel-delahaye.developpez....s.htm#globales
Citation:
Cependant, dans un projet, j'ai deux structures dont pratiquement toutes les fonctions ont besoin.
Il suffit de passer l'adresse aux fonction. Si il n'y a qu'un parametre genre void *, passer l'adresse d'une structure 'chapeau' (user context) qui contient l'adresse des deux structres (ou les deux structures elle-même, peu importe). Nul ne peux prevoir combien de fois sera appelé ton code dans le même espace utilisateur. Il faut donc rester contextuel le plus longtemps possible.
Re: [Théorie] Justifier les variables globales
Citation:
Envoyé par Nasky
Comment justifieriez-vous leur utilisation? Le fait de dire que toutes les fonctions en ont besoin est-elle une bonne justification?
Oui. Simplifer le code est une des utilisations des variables globales.
Regarde la variable errno par exemple. Elle est déclarée en globale dans errno.h. Ensuite, les fonctions qui en ont besoin mettent à jour cette variable. Pour l'utilisateur, c'est très propre : on n'a pas à promener un argument errno dans chaque fonction...
Re: [Théorie] Justifier les variables globales
Citation:
Envoyé par DaZumba
Regarde la variable errno par exemple. Elle est déclarée en globale dans errno.h. Ensuite, les fonctions qui en ont besoin mettent à jour cette variable. Pour l'utilisateur, c'est très propre : on n'a pas à promener un argument errno dans chaque fonction...
errno est probablemnt une des plus grosses erreurs du C... En effet, on ne sait jamais qui a réellement mis à jour celle-ci. De plus, c'est une Non Modifiable L-value [1], ce qui fait qu'il n'est pas possible d'écrire dedans directement, ce qui est un moindre mal pour une globale...
------------------
[1] Il se peut que cette faculté ne soit pas exigée par la norme, mais soit une conséquence la QoI (Quality of Implementation). Si quelqu'un a le courage de vérifier dans Le Livre...
Re: [Théorie] Justifier les variables globales
Citation:
Envoyé par Emmanuel Delahaye
errno est probablemnt une des plus grosses erreurs du C... En effet, on ne sait jamais qui a réellement mis à jour celle-ci. De plus, c'est une Non Modifiable L-value [1], ce qui fait qu'il n'est pas possible d'écrire dedans directement, ce qui est un moindre mal pour une globale...
Je ne sais pas si errno est du bad design ou non, j'imagine que cela depend du point de vue. Le fait d'eviter de ballader un argument err de fonction en fonction est assez pratique. Mais c'est certainement le seul avantage.
Sinon, d'apres la norme (C99, mais je doute que cela ait change), errno n'est pas forcement une globale (meme s'il est plus simple de l'implementer ainsi). C'est une macro, qui doit devenir une modifiable lvalue de type int.