Les variables globales sont généralement considérées comme une mauvaise pratique de programmation p>
en C, sont des variables statiques (c'est-à-dire avec le champ d'application du module (fichier)) considérée comme ok? p>
Ma pensée était que les variables des membres dans une langue orientée objet ne peuvent être beaucoup moins dangereuses que les variables statiques en C et les variables des membres semblent être considérées comme une bonne chose. P>
Je suis fatiguant de passer des paramètres de passage via plusieurs fonctions et peut voir l'attrait des variables statiques pour cela, surtout si elles sont Mais je suis désireux de savoir si cela est fronçonné - et aussi s'il y a vraiment une différence de nantissement de la nommation de programmation entre un gros objet avec une variable de membre utilisée dans plusieurs de ses méthodes et un fichier C contenant quelques-uns fonctions qui utilisent une variable statique? p> const code>. P>
6 Réponses :
Les variables statiques sont peut-être marginalement mieux que les globaux, mais pas beaucoup. Être aussi mauvais que les variables mondiales n'est pas une grande partie d'une recommandation! P>
Lorsque vous avez plusieurs threads ou des fonctions réentrantes, ils ne suffisent pas. De plus en plus d'utiliser comme mécanisme de passage du paramètre conduira à un code très difficile à lire et à entretenir. Il y a des utilisations pour les variables statiques mais je ne les utiliserais jamais pour le passage des paramètres. Dans certains cas, il peut mieux collecter des paramètres dans une structure à transmettre. P>
Il est vrai que les fils ou les fonctions réentrantes ne doivent pas accéder à la statique sans objets de synchronisation, mais ce n'est pas le faute de la variable statique elle-même. En outre, il y a beaucoup de choses comme des fonctions de rappel, des interruptions, etc. qui n'ont pas de paramètres. Ensuite, vous n'avez pas d'autre choix mais statique, peu importe si vous écrivez C ou C ++.
La question @LUNDIN concerne spécifiquement l'utilisation de la statique du module comme alternative au paramètre passant.
Oui, alors pourquoi apporter multi-threading? L'OP n'a pas mentionné une plate-forme ni un but pour le code.
Vous pouvez utiliser des variables globales ou statiques, mais utilisez-les avec soin. Je ne suis pas sûr que les variables statiques à l'échelle du module sont bien meilleures que celles globales. P>
En particulier, avoir plus d'une douzaine de variables globales dans un grand programme est probablement faible (mais cela se produit). P>
Et vous préférez peut-être regrouper vos données statiques ou globales dans plus grandes struct code> -s. p>
Pourquoi serait-il mauvais goût? Ils sont encapsulés en privé et ne polluent pas l'espace de noms global.
À propos de mauvais goût, je pensais à des variables globales (non statiques). Vous pouvez transmettre des variables statiques à travers des pointeurs et vous pouvez parfois avoir des bugs étranges liés à cela. Bien sûr, cela dépend ...
Les variables statiques (périmètre de fichiers) en C sont similaires aux variables de membres statiques en C ++. P>
Toute utilisation de variables statiques non-consons pour la communication entre les fonctions rend ces fonctions non-centrantes et non-dangereuses. Ainsi, en général, il serait préférable de transmettre les informations via des paramètres. P>
Un meilleur analogue pour les variables de membre non statiques est un membre de la structure. Collectez simplement vos "variables de membre" dans une structure et passez cette structure sous forme de "ce" paramètre " p>
La grande différence est la suivante: avec des variables de membre, vous pouvez avoir plusieurs objets et chacun a sa propre variable de membre. Avec les variables statiques de la portée du module, vous avez exactement une instance de la variable. P>
Si vous souhaitez comparer les variables statiques du niveau de module et les variables des membres de la classe statique, il n'y a pas de grande différence réelle. Les deux sont instanciés exactement une fois, seules les règles de portée et d'accès sont différentes. P>
Dans le contexte, vous essayez de les utiliser, les variables de module sont probablement une mauvaise idée. La bonne chose à propos de la réussite des paramètres est de sorte qu'il est difficile de se synchroniser avec vos appels de méthode. Chaque méthode fait quelque chose et passe un élément de celui-ci à une autre méthode, il est donc facile de suivre - les variables ne sont que vivent pendant l'appel de méthode. Il devient plus difficile de déboguer si les variables existent ailleurs - des choses comme utiliser une variable obsolète disparaissent de manière impossible à probablement. P>
Les variables statiques sont généralement utilisées comme les drapeaux em> - un commun étant un booléen que vous définissez pour modifier le mode de l'ensemble du module de manière subtile (une quasi-intégrée étant débogé). p>
L'un des gros inconvénients de la variable statique est "Effets secondaires", c'est-à-dire lorsque le résultat d'une fonction dépend uniquement des paramètres d'entrée qui effectue des tests et du débogage plus fort. Une fonction sans effet secondaire est beaucoup plus facile à tester car vous pouvez supposer que chaque fois que vous appelez une fonction avec le même ensemble de paramètres, vous pouvez vous attendre au même résultat. P>
Si vous avez un bogue, vous pouvez vérifier alors si le résultat est correct en conséquence aux paramètres d'entrée. Si vous réalisez que vous réalisez que les paramètres d'entrée sont faux, vous pouvez suivre votre code dans votre code où / qui comme paramètres à tort. Si votre fonction dépend d'une variable statique et que les variables statiques ne disposent pas de la valeur attendue, comment suivez-vous / trouvez-vous pourquoi et comment cela change? P>
Donc, si vous souhaitez utiliser constante, utilisez une constante appropriée (#define) ou regroupez vos paramètres dans une structure et essayez d'éviter le plus possible la variable statique possible. (Au moins #derfine, la valeur ne sera pas corrompue en mémoire) p>
Pourquoi le fermer? C'est une bonne question spécifique que beaucoup de programmeurs devraient être curieux.
Merci beaucoup pour les réponses qui ont été clôturées avant la clôture de la question - elles ont contribué à clarifier le problème pour moi.
il est incroyable comment ils ferment une question comme celle-ci pour être "non constructive", mais sur toutes les personnes "de manière constructive", les gens inséreront "mais vous ne devrait pas i> faire ce que vous i> devriez i> faire cela parce que oui c'est comme ça que nous le faisons dans le monde réel "
La portée des «bonnes» des questions est en fait raisonnablement étroite et les frontières sont fortement appliquées. Je pense que cela peut aussi avoir été ma 1ère question et les modérateurs sont définitivement plus difficiles sur ceux qui ont un rep!