¿Es una mala práctica crear bloques de código?

12

En C ++, ¿es una mala práctica crear bloques de código dentro de alguna función, como la siguiente:

    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;

    }

El punto de hacer esto sería usar el mismo nombre de variable de "prueba" varias veces, para el mismo tipo de procedimiento. En mi proyecto real, tengo múltiples variables y estoy realizando múltiples pruebas. Realmente no quiero seguir creando nuevas variables con diferentes nombres para cada una de las pruebas, considerando cómo las pruebas son tan similares.

¿Es una mala práctica insertar bloques de código para que las variables se salgan del alcance después de cada prueba y luego pueda usar sus nombres nuevamente? ¿O debería buscar otra solución? Cabe señalar que consideré usar el mismo conjunto de variables para todas mis pruebas (y solo establecerlas en 0 después de que finalizara cada prueba), pero tenía la impresión de que esto podría ser una mala práctica.

Ignorancia inercial
fuente
19
Si revelara este código, le diría que separe cada una de estas pruebas en métodos individuales ... Como consecuencia, no necesitaría usar bloques de código para abarcarlos por separado.
Maybe_Factor
1
@Maybe_Factor - Estoy de acuerdo. El beneficio de los métodos separados es que puede nombrar cada bloque, proporcionando un código más legible.
Mouviciel
@mouviciel ¡No solo un código más legible, sino informes de prueba más legibles!
Maybe_Factor
@Maybe_Factor No estoy de acuerdo. Mover cosas a funciones separadas tiene el efecto negativo de hacer que parezcan pequeños bits de funcionalidad reutilizables. Mantener toda la lógica de una función en un solo lugar es bueno.
Miles Rout
1
@MilesRout Esta no es una función lógica, se trata de múltiples pruebas unitarias para una función, todas agrupadas en una sola función de prueba. Bloques de código vs funciones en código normal es otra discusión completamente.
Maybe_Factor

Respuestas:

22

Los bloques son perfectamente razonables si los está utilizando para abarcar algún recurso. Archivos, conexiones de red, asignaciones de memoria, transacciones de bases de datos, lo que sea. En esos casos, el bloque es en realidad parte de la estructura lógica del código: genera un recurso, existe durante un período de tiempo y luego desaparece en un momento designado.

Pero si todo lo que está haciendo es determinar un nombre , entonces diría que son una mala práctica. Hablando en general, por supuesto; Se pueden aplicar circunstancias especiales.

Por ejemplo, si esta función fue generada por algún sistema de generación de código, marco de prueba o similar, entonces los bloques por el alcance del nombre son algo razonable. Pero estaría hablando de código escrito con el propósito de una máquina, no un humano.

Si un humano está escribiendo código donde necesita reutilizar nombres dentro de la misma función, diría que esos bloques probablemente necesitan ser funciones separadas. Especialmente si esos nombres se utilizan con diferentes tipos y / o significados dentro de esos bloques.

Nicol Bolas
fuente
10

No es una mala práctica crear bloques como este. Así es como funcionan los ámbitos.

Por lo general, esto se hace cuando se usa RAII (Adquisición de recursos es inicialización) y desea controlar cuándo se llama a los destructores.

Si se alarga, consideraría mover ese código a su propia función.

En mi opinión, solo usarlo para reciclar nombres de variables no es una buena idea. Pero puedo ver que ha sido útil en casos con poca memoria

Robert Andrzejuk
fuente
La reutilización de nombres de variables locales no tiene efecto en el uso de la memoria.
Kevin Cline
1
¿No crees que un optimizador inteligente podría usar 1 ubicación de memoria para las 2 variables?
Robert Andrzejuk
3
Si. Pero también puede hacer eso si están en el mismo alcance, si no tienen destructores.
Sebastian Redl