¿Cuál es la posible desventaja de poner declaraciones en bloques internos, en lugar de al principio de la función?

9

En el lugar donde trabajo, hay pautas explícitas para la colocación de declaraciones de variables. De acuerdo con eso, se requiere ponerlos a nivel global y / o al comienzo de las funciones, y no en bloques internos (como un bucle for). Como han sido especificados por personas con más experiencia que yo, estoy seguro de que debe haber una buena razón para ello, pero no puedo entender cuál podría ser. Sería bueno saber si existen ventajas de tiempo de compilación / tiempo de ejecución al declararlas en un alcance mayor.

TCSGrad
fuente

Respuestas:

8

Veo dos ventajas principales:

  • Se evita la reutilización de nombres de variables con un tipo diferente.
  • En un momento anterior queda claro que una rutina debe ser refactorizada. Las variables en la parte superior se convierten en un desastre importante con bastante rapidez, y este desastre es fácil de reconocer.

Cualquier compilador que valga la pena optimizará el alcance de las variables de todos modos, por lo que es puramente una cuestión de formato.

Para mis dos centavos, todavía preferiría la declaración más interna de la variable para transportar la intención de alcance al compilador. Si pretendía tener acceso a una variable solo dentro de un ciclo, puede capturar cualquier referencia posterior en tiempo de compilación cuando declara la variable en el ciclo.

thiton
fuente
3

La única ventaja que he encontrado hasta ahora es la simplicidad del código. Siempre sabe dónde buscar declaraciones variables y todos en el equipo adoptan el mismo estilo de codificación. Estas cosas facilitan el mantenimiento del código, pero no estoy seguro de que faciliten la escritura de un código mejor. No quiero decir que escribes peor código solo que a veces es más difícil escribir código tan bueno. Sin embargo, si el equipo de desarrollo es grande o si sus miembros cambian con frecuencia utilizando estándares de código, es útil.

Gus
fuente
3

Esto suena como una decisión para preservar la consistencia. También evita el uso de los mismos nombres para diferentes variables en ámbitos vecinos y aumenta la legibilidad. Como señala Gus, también sabrá dónde buscar variables. Creo que el principio de alcance más estrecho es mejor porque evita el desorden variable en la parte superior. La declaración más externa es muy similar a declarar miembros privados de una primera OMI de clase.

perreal
fuente
3

Cada idioma puede diferir en la preferencia de estilo y práctica. Lo siguiente es de las reglas JSF-AV , que Stroustrup señala como los estándares de codificación que prefiere.

AV Regla 136
Declarations should be at the smallest feasible scope

La razón de esto se describe como

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 está en C ++, se prefiere declarar variables cuando las necesita.

Clark Gable
fuente
3

No estoy seguro si puede llamar a esto una mejor práctica. Cuando configuro pautas para un nuevo proyecto en C, siempre declaro que es mejor declarar las variables cerca de donde se usan. Por dos razones, facilita la refactorización del código más adelante (es decir, al extraer un método). También ayuda al compilador a hacer una mejor optimización.

No estoy solo con esta opinión. Aquí hay una pregunta que aborda el mismo problema: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -los La respuesta aquí es declararlos donde los usas. La misma práctica se describe en el libro 'Clean Code' de Robert C. Martin.

Sin embargo, si utiliza un estándar C anterior (C-89), debe definir variables locales en la parte superior de la función. Entonces, ¿tal vez la guía es un remanente de la época en que se usó C-89? Probablemente sea mejor preguntarle a la persona que escribió las pautas por qué la regla todavía está allí.

Johan
fuente
2

Si la declaración está dentro de una cláusula if que solo rara vez (si alguna vez) se ejerce, pero necesita mucha memoria, su huella de memoria es menor (la mayor parte del tiempo) que si asigna todo al comienzo de la función.

Si está dentro de un bucle, entonces debe reasignar la memoria repetidamente, esto puede ser costoso en términos de rendimiento.

Hay razones para hacer las cosas en ambos sentidos.

NWS
fuente
1

El antiguo estándar C de 1989 solo permite declaraciones variables al comienzo de un bloque.

Solo desde C99 se permiten declaraciones en cualquier lugar. Quizás tu lugar aún no haya cambiado a C99.

Patricio
fuente
Usamos C99, pero lo más importante es que estaba buscando cuáles son las implicaciones de declararlo en el bloque más interno, en lugar de al comienzo de la función. Quizás, no estaba lo suficientemente claro ...
TCSGrad
1

Parece que quienes tomaron esta decisión están acostumbrados a poner las declaraciones en la parte superior como norma y han optado por no cambiar a una preferencia para declarar más cerca de donde se está utilizando.

No estoy seguro de cuán útil es este nivel de consistencia. Algunos IDE probablemente hacen que encontrar las cosas sea más fácil que otros. Para las variables globales esto tiene sentido, pero si su función es tan larga que dificulta encontrar declaraciones de variables, tiene problemas más grandes.

JeffO
fuente