A melhor forma de posicionar variáveis locais num método

Um dos itens mais simples e importantes quando falamos de clean code é a declaração de variáveis. Enquanto os nomes das variáveis são de extrema importância na elaboração de um código limpo, seu posicionamento dentro de um método frequentemente recebe pouca atenção, o que pode influenciar negativamente a compreensibilidade do código.

Mas existem algumas práticas super intuitivas que podemos aplicar para facilitar ainda mais a leitura do nosso código, e que são bastante fáceis de ensinar para desenvolvedores com qualquer nível de experiência.

Proximidade

Infelizmente, uma prática comum de programação é declarar as variáveis mais ao topo de um método, para então utilizá-las mais à frente:

As variáveis utilizadas ao longo do método são declaradas no topo, de modo que sua função não fica óbvia.
Figura 1. Variáveis declaradas no topo do método

No exemplo acima, essa abordagem acaba gerando ruído desnecessário. As variáveis raioBusca e utilizarBuscaEstendida são declaradas no topo, e usadas somente mais abaixo, depois de duas outras duas operações. Apesar de os nomes dessas variáveis serem bastante expressivos, estão muito distantes do seu contexto de uso, o que pode ser representado por um triângulo retângulo desenhado sobre o código.

O mesmo código de antes, com um triângulo retângulo ligando a declaração da variável com seu primeiro uso mais abaixo.
Figura 2. Distância entre declaração e primeiro uso
Quanto mais longo for o método, mais ruído essa abordagem gera.

Como podemos ver no exemplo acima, um bom tanto de código está compreendido dentro do triângulo. Podemos dizer que este trecho está no caminho de um código mais expressivo. O mesmo problema afeta a variável timestamp:

O mesmo código de antes, com um triângulo retângulo ligando outra variável declarada no topo com uma chamada ainda mais ao final do método.
Figura 3. Distância entre declaração e primeiro uso da variável timestamp

Podemos resolver isso facilmente aproximando as variáveis do seu contexto de uso, como vemos na imagem a seguir:

As variáveis utilizadas ao longo do método são próximo de onde declaradas no topo.
Figura 4. Variáveis declaradas próximas do uso

Dessa forma, cada grupo de operações fica isolado dos outros, e cada etapa de processamento de um método recebe ainda mais destaque.

A hipotenusa agora se aproxima de uma reta.
Figura 5. Pequena distância entre declaração e uso

A ordem dos fatores importa

Mesmo no segundo cenário, em que as variáveis são declaradas próximas do uso, a ordem com que são declaradas importa na hora da leitura do código. No exemplo que trabalhamos até aqui, a variável raioBusca é declarada antes da utilizarBuscaEstendida, mas utilizada depois.

Apesar de estarem próximas de onde são usadas, há uma quebra de sequência que mata um pouco da fluidez do código. Isso pode ser visualizado novamente usando os triângulos:

O triângulo da variável primeira variável envolve completamente o outro, evidenciando um problema.
Figura 6. A ordem de declaração não bate com a ordem de uso

Ao inverter a ordem de declaração das variáveis de modo que bata com a ordem em que são utilizadas, podemos ver que nenhum triângulo engloba totalmente o outro:

A hipotenusa do primeiro triângulo cruza a do segundo.
Figura 7. A ordem de declaração bate com a ordem de uso

A simples ação de reordenar a declaração das variáveis já facilita um pouquinho mais a leitura, tornando-a mais natural, com basicamente zero esforço adicional.

Distância como indicador de posicionamento

Obviamente, ninguém precisa ficar desenhando triângulos sobre o código enquanto programa. Utilizei esses desenhos para ilustrar uma forma intuitiva de decidir onde posicionar cada variável local dentro de um método.

É muito fácil imaginar uma linha reta da declaração de uma variável até onde é usada pela primeira vez. Podemos então aplicar uma heurística simples: nosso objetivo então deve ser reduzir essa distância o máximo possível para cada variável dentro do método.

Essa linha reta imaginária também coincide com a hipotenusa de um triângulo reto. Sempre que ela for maior que o necessário, a área desse triângulo vai acabar compreendendo código que não está diretamente relacionado às variáveis que estamos declarando, e elas precisam ser movidas para um local mais próximo de onde são usadas.

Ao mover as variáveis para perto do uso, o cateto lateral diminui.
Figura 8. A área do triângulo diminui

Conclusões

Há aspectos bastante sutis que influenciam na legibilidade de um código, e cujo impacto está longe de ser óbvio para muitos desenvolvedores, especialmente aqueles que estão ainda no começo da sua jornada.

Numa sala de Zoom, é muito fácil desenhar sobre a tela, e eu costumo utilizar o método descrito acima para explicar esses conceitos em sessões de pair-programming. Costuma funcionar muito bem.

Outras opções para compartilhar:
comments powered by Disqus