Quel est l'inconvénient possible de mettre des déclarations dans des blocs internes, au lieu de commencer une fonction?

9

À l'endroit où je travaille, il existe des directives explicites pour le placement des déclarations de variables. Selon cela, il est nécessaire de les mettre au niveau global et / ou au début des fonctions, et non dans des blocs internes (comme une boucle for). Puisqu'ils ont été spécifiés par des personnes plus expérimentées que moi, je suis sûr qu'il doit y avoir une bonne raison à cela, mais je ne peux pas comprendre ce que cela pourrait être. Ce serait bien de savoir s'il y a des avantages de temps de compilation / d'exécution à les déclarer à une portée plus grande.

TCSGrad
la source

Réponses:

8

Je vois deux avantages principaux:

  • La réutilisation de noms de variable avec un type différent est empêchée.
  • Il devient clair plus tôt qu'une routine doit être refactorisée. Les variables en haut deviennent assez rapidement un désordre majeur, et ce désordre est facile à reconnaître.

Tout compilateur digne de ce nom optimisera de toute façon la portée des variables, il s'agit donc uniquement d'un problème de formatage.

Pour mes deux cents, je préférerais toujours la déclaration la plus profonde de la variable pour transporter l'intention de la portée au compilateur. Si vous aviez l'intention d'avoir une variable accessible uniquement dans une boucle, vous pouvez intercepter toute référence ultérieure au moment de la compilation lorsque vous déclarez la variable dans la boucle.

thiton
la source
3

Le seul avantage que j'ai trouvé jusqu'à présent est la simplicité du code. Vous savez toujours où chercher les déclarations de variables et tout le monde dans l'équipe adopte le même style de codage. Ces choses facilitent la maintenance du code mais je ne suis pas sûr qu'elles facilitent l'écriture d'un meilleur code. Je ne veux pas dire que vous écrivez du code pire que parfois, il est plus difficile d'écrire du code aussi bon. Néanmoins, si l'équipe de développement est grande ou si ses membres changent fréquemment en utilisant les normes de code, c'est utile.

Gus
la source
3

Cela ressemble à une décision de préserver la cohérence. Il empêche également l'utilisation de mêmes noms pour différentes variables dans les étendues voisines et augmente la lisibilité. Comme le souligne Gus, vous saurez également où chercher les variables. Je pense que le principe de la portée la plus étroite est mieux car il empêche l'encombrement variable au sommet. La déclaration la plus à l'extérieur ressemble beaucoup à la déclaration des membres privés d'une classe IMO en premier.

perreal
la source
3

Chaque langue peut différer dans la préférence de style et de pratique. Voici les règles JSF-AV , que Stroustrup désigne comme les normes de codage qu'il préfère.

AV Rule 136
Declarations should be at the smallest feasible scope

La justification de ceci est décrite comme

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Si vous êtes en C ++, il est préférable de déclarer une variable lorsque vous en avez besoin.

Clark Gable
la source
3

Je ne sais pas si vous pouvez appeler cela une meilleure pratique. Lorsque je mets en place des lignes directrices pour un nouveau projet C, je déclare toujours qu'il vaut mieux déclarer les variables près de l'endroit où elles sont utilisées. Pour deux raisons, cela facilite la refactorisation du code plus tard (c'est-à-dire lors de l'extraction d'une méthode). Cela aide également le compilateur à faire une meilleure optimisation.

Je ne suis pas seul avec cette opinion. Voici une question qui résout le même problème: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -les La réponse ici est de les déclarer là où vous les utilisez. La même pratique est décrite dans le livre «Clean Code» de Robert C. Martin.

Cependant, si vous utilisez une ancienne norme C (C-89), vous devez définir des variables locales en haut de la fonction. Alors peut-être que la directive est un vestige de l'époque où le C-89 a été utilisé? Il vaut probablement mieux demander à la personne qui a rédigé les lignes directrices pourquoi la règle est toujours là.

Johan
la source
2

Si la déclaration se trouve dans une clause if qui ne s'exerce que rarement (voire jamais), mais nécessite beaucoup de mémoire, votre empreinte mémoire est plus petite (la plupart du temps) que si vous allouez tout au début de la fonction.

S'il se trouve dans une boucle, vous devez réallouer la mémoire à plusieurs reprises, cela peut être coûteux en termes de performances.

Il y a des raisons de faire les choses dans les deux sens.

NWS
la source
1

L'ancienne norme C de 1989 autorise uniquement les déclarations de variables au début d'un bloc.

Seulement depuis que les déclarations C99 sont autorisées n'importe où. Peut-être que votre place n'a pas encore basculé en C99.

Patrick
la source
Nous utilisons C99 - mais plus important encore, je cherchais quelles sont les implications de le déclarer dans le bloc le plus intérieur, plutôt qu'au début de la fonction. Peut-être que je n'étais pas assez clair ...
TCSGrad
1

On dirait que ceux qui ont pris cette décision sont habitués à une époque où placer les déclarations au sommet était la norme et ont choisi de ne pas passer à une préférence pour déclarer plus près de l'endroit où elles sont utilisées.

Je ne sais pas à quel point ce niveau de cohérence est utile. Certains IDE permettent probablement de trouver les choses plus facilement que d'autres. Pour les variables globales, cela a du sens, mais si votre fonction est si longue qu'elle rend difficile la recherche de déclarations de variables, vous avez de plus gros problèmes.

JeffO
la source