Qual é a possível desvantagem de colocar declarações em blocos internos, em vez de no início da função?


9

No local em que trabalho, há diretrizes explícitas para a colocação de declarações de variáveis. De acordo com isso, é necessário colocá-las no nível global e / ou no início das funções, e não em blocos internos (como um loop for). Como eles foram especificados por pessoas mais experientes do que eu, tenho certeza de que deve haver uma boa razão para isso, mas não consigo descobrir o que possa ser. Seria bom saber se existem vantagens em tempo de compilação / tempo de execução para que sejam declaradas em um escopo maior.

Respostas:


8

Eu vejo duas vantagens principais:

  • Reutilizar nomes de variáveis ​​com um tipo diferente é impedido.
  • Torna-se claro em um momento anterior que uma rotina precisa ser refatorada. As variáveis ​​no topo tornam-se uma grande bagunça rapidamente, e é fácil reconhecê-la.

Qualquer compilador que se preze otimizará o escopo das variáveis ​​de qualquer maneira, portanto é uma preocupação puramente de formatação.

Para meus dois centavos, eu ainda preferiria a declaração mais interna da variável para transportar a intenção do escopo para o compilador. Se você pretendia ter uma variável acessada apenas dentro de um loop, você pode capturar qualquer referência posterior no momento da compilação ao declarar a variável no loop.


3

A única vantagem que encontrei até agora é a simplicidade do código. Você sempre sabe onde procurar declarações de variáveis ​​e todos na equipe adotam o mesmo estilo de codificação. Essas coisas facilitam a manutenção do código, mas não tenho certeza de que elas facilitem a escrita de um código melhor. Não quero dizer que você escreva código pior apenas que, às vezes, é mais difícil escrever código tão bom. No entanto, se a equipe de desenvolvimento é grande ou seus membros mudam com freqüência usando padrões de código, é útil.


3

Parece uma decisão de preservar a consistência. Também evita o uso dos mesmos nomes para diferentes variáveis ​​em escopos vizinhos e aumenta a legibilidade. Como Gus aponta, você também saberá onde procurar variáveis. Eu acho que o princípio de escopo mais estreito é melhor porque evita a confusão de variáveis ​​no topo. A declaração mais extrema é como declarar membros privados de uma primeira IMO de classe.


3

Todo idioma pode diferir na preferência de estilo e prática. A seguir, segue as regras do JSF-AV , que Stroustrup aponta como os padrões de codificação que ele prefere.

Regra AV 136
Declarations should be at the smallest feasible scope

A lógica para isso é descrita 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

Se você estiver em C ++, é preferível declarar variável quando precisar delas.


3

Não tenho certeza se você pode chamar isso de melhor prática. Ao estabelecer diretrizes para um novo projeto C, sempre declaro que é melhor declarar as variáveis ​​próximas de onde elas são usadas. Por duas razões, torna mais fácil refatorar o código posteriormente (ou seja, ao extrair um método). Também ajuda o compilador a otimizar melhor.

Eu não estou sozinho com essa opinião. Aqui está uma pergunta que aborda o mesmo problema: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -them a resposta aqui é declará-los onde você usá-los. A mesma prática é descrita no livro 'Código Limpo', de Robert C. Martin.

No entanto, se você usar um padrão C mais antigo (C-89), deverá definir variáveis ​​locais na parte superior da função. Então, talvez a diretriz seja um remanescente da época em que o C-89 foi usado? Provavelmente é melhor perguntar à pessoa que escreveu as diretrizes por que a regra ainda está lá.


2

Se a declaração estiver dentro de uma cláusula if que apenas raramente (se alguma vez) for exercida, mas precisar de muita memória, o espaço ocupado pela memória será menor (na maioria das vezes) do que se você alocasse tudo no início da função.

Se estiver dentro de um loop, você precisará realocar a memória repetidamente, isso pode ser oneroso em termos de desempenho.

Existem razões para fazer as coisas nos dois sentidos.


1

O antigo padrão C de 1989 permite apenas declarações de variáveis ​​no início de um bloco.

Somente desde que as declarações C99 sejam permitidas em qualquer lugar. Talvez seu lugar ainda não tenha mudado para o C99.


Usamos o C99 - mas, mais importante, eu estava procurando quais são as implicações de declará-lo no bloco mais interno, em vez de no início da função. Talvez, eu não estava claro o suficiente ...
TCSGrad

1

Parece que aqueles que tomaram essa decisão estão acostumados a um momento em que colocar as declarações no topo era a norma e optaram por não mudar para uma preferência de declarar mais perto de onde está sendo usada.

Não sei ao certo como é esse nível de consistência. Alguns IDE provavelmente tornam mais fácil encontrar coisas do que outros. Para variáveis ​​globais, isso faz sentido, mas se sua função é tão longa que dificulta encontrar declarações de variáveis, você tem problemas maiores.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.