Eu prefiro nomes de variáveis significativos, mesmo para variáveis de loop. Então, eu costumo escrever algo como
for (int vertexIndex=0; vertexIndex<polygon.VertexCount; vertexIndex++)
DoSomethingWithVertex(polygon[vertexIndex]);
Eu percebo que há pouca diferença (de qualquer forma) para um pequeno loop como este, mas:
- se o corpo do loop for maior,
vertexIndex
é geralmente mais claro que i
. É claro que i
é um índice, mas qual índice? Para qual array? Para qual elemento nessa matriz?
- se o corpo do loop chamar outras funções e passar o índice como um argumento, geralmente será mais fácil nomear o valor consistentemente no chamador e nos locais de chamada - e você não desejará chamar os parâmetros de método
i
and x
- se houver loops aninhados, usar
i
, j
, k
como índices é muito confuso e propenso a erros
para ser consistente, eu apenas uso nomes de variáveis significativos para índices de loop em todos os lugares.
@ André Paramés perguntou: "Se o corpo do loop é longo o suficiente para esconder o significado de i, não é hora de refatorar?"
Um cérebro humano típico tem uma capacidade de memória de curto prazo de cerca de 7 pedaços de dados. Então, se o corpo do loop contém 8 ou mais partes (onde "pedaços" são instruções, variáveis locais, parâmetros, comentários), então seu cérebro não pode armazenar o significado de cada um desses pedaços simultaneamente. Em vez disso, o seu cérebro irá deslocar pedaços dentro e fora da memória de trabalho enquanto você lê o código. Por exemplo, se você usar nomes de variáveis como i
e j
, seu cérebro mudará os significados de i
e j
de sua memória de trabalho; da próxima vez que você ler j
, seu cérebro normalmente irá depender do contexto para encontrar o significado, ou seja, se você ler customers[j]
no meio do corpo do laço, seu cérebro irá inferir que j
é um índice na matriz customers
. Se você tivesse escrito customers[vertexIndex]
, veria que está usando o índice errado. E isso é para corpos de loop muito curtos com apenas 8 blocos de informações, ou seja, 5-8 linhas de código.
Se o corpo ficar mais longo, você normalmente o extrairia em uma função separada com um parâmetro vertexIndex
. E esse é o segundo ponto que eu estava fazendo: se a variável é chamada vertexIndex
dentro dessa função, ela deve realmente ser chamada de vertexIndex
no chamador também.