Est-ce une mauvaise pratique de créer des blocs de code?

12

En C ++, est-ce une mauvaise pratique de créer des blocs de code à l'intérieur de certaines fonctions, telles que les suivantes:

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

Le but de cela serait d'utiliser plusieurs fois le même nom de variable de "test", pour le même type de procédure. Dans mon projet, j'ai plusieurs variables et j'effectue plusieurs tests. Je ne veux pas vraiment continuer à créer de nouvelles variables avec des noms différents pour chacun des tests, étant donné la similitude des tests.

Est-ce une mauvaise pratique d'insérer des blocs de code afin que les variables sortent du champ d'application après chaque test, puis-je utiliser à nouveau leurs noms? Ou devrais-je chercher une autre solution? Il convient de noter que j'ai envisagé d'utiliser le même ensemble de variables pour tous mes tests (et de les mettre tous à 0 après la fin de chaque test), mais j'avais l'impression que cela pouvait être une mauvaise pratique.

Ignorance inertielle
la source
19
Si je révélais ce code, je vous dirais de séparer chacun de ces tests en méthodes individuelles ... En conséquence, vous n'auriez pas besoin d'utiliser des blocs de code pour les définir séparément.
Maybe_Factor
1
@Maybe_Factor - Je suis d'accord. L'avantage des méthodes distinctes est que vous pouvez nommer chaque bloc, fournissant un code plus lisible.
mouviciel
@mouviciel Non seulement du code plus lisible, mais des rapports de test plus lisibles!
Maybe_Factor
@ Maybe_Factor Je ne suis pas d'accord. Le fait de déplacer des objets dans des fonctions distinctes a pour effet négatif de les faire apparaître comme de petites fonctionnalités réutilisables. Garder toute la logique d'une fonction au même endroit est bon.
Miles Rout
1
@MilesRout Ce n'est pas une fonction logique, ce sont plusieurs tests unitaires pour une fonction tous entassés dans une seule fonction de test. Blocs de code vs fonctions dans du code normal est une autre discussion entièrement.
Maybe_Factor

Réponses:

22

Les blocs sont parfaitement raisonnables si vous les utilisez pour étendre certaines ressources. Fichiers, connexions réseau, allocations de mémoire, transactions de base de données, etc. Dans ces cas, le bloc fait en fait partie de la structure logique du code: vous générez une ressource, elle existe pour une certaine période de temps, puis elle disparaît à une heure désignée.

Mais si tout ce que vous faites est de délimiter un nom , je dirais que c'est une mauvaise pratique. De manière générale, bien sûr; des circonstances spéciales peuvent s'appliquer.

Par exemple, si cette fonction a été générée par un système de génération de code, un framework de test ou similaire, alors les blocs pour la portée du nom sont une chose raisonnable. Mais vous parleriez de code écrit dans le but d'une machine, pas d'un humain.

Si un humain écrit du code où il doit réutiliser des noms dans la même fonction, je dirais que ces blocs doivent probablement être des fonctions distinctes. Surtout si ces noms sont utilisés avec différents types et / ou sens dans ces blocs.

Nicol Bolas
la source
10

Ce n'est pas une mauvaise pratique de créer des blocs comme celui-ci. C'est ainsi que fonctionnent les étendues.

Habituellement, cela se fait lorsque vous utilisez RAII (l'acquisition de ressources est l'initialisation) et vous souhaitez contrôler le moment où les destructeurs sont appelés.

Si cela devient long, j'envisagerais de déplacer ce code vers sa propre fonction.

À mon avis, l'utiliser uniquement pour recycler les noms de variables n'est pas une bonne idée. Mais je peux voir que cela a été utile dans les cas où la mémoire est faible

Robert Andrzejuk
la source
La réutilisation des noms de variables locales n'a aucun effet sur l'utilisation de la mémoire.
Kevin Cline
1
Ne pensez-vous pas qu'un optimiseur intelligent pourrait utiliser 1 emplacement mémoire pour les 2 variables?
Robert Andrzejuk
3
Oui. Mais il peut aussi le faire s'ils sont dans la même portée, s'ils n'ont pas de destructeurs.
Sebastian Redl