O uso inadequado de variáveis pode complicar a compreensão do código. Este artigo aborda práticas para otimizar a clareza através da gestão de variáveis.
- Reduzindo a Quantidade de Variáveis
Variáveis desnecessárias adicionam complexidade sem benefício. Considere as seguintes abordagans:
a) Eliminando Variáveis Temporárias Redundantes
Variáveis que não simplificam expressões ou são usadas apenas uma vez podem ser removidas.
momento_atual = datetime.datetime.now()
mensagem_principal.ultimo_acesso = momento_atual
# A variável 'momento_atual' é redundante, pois não simplifica a lógica e é utilizada somente uma vez.
mensagem_principal.ultimo_acesso = datetime.datetime.now()
b) Simplificando Resultados Intermediários
Evite armazenar resultados que podem ser processados diretamente.
function removerItem(lista, itemRemover) {
let posicaoRemover = null;
for (let contador = 0; contador < lista.length; contador++) {
if (lista[contador] === itemRemover) {
posicaoRemover = contador;
break;
}
}
if (posicaoRemover !== null) {
lista.splice(posicaoRemover, 1);
}
}
// Versão otimizada, removendo a variável intermediária
function removerItem(lista, itemRemover) {
for (let contador = 0; contador < lista.length; contador++) {
if (lista[contador] === itemRemover) {
lista.splice(contador, 1);
return;
}
}
}
c) Minimizando Variáveis de Controle de Fluxo
Variáveis usadas apenas para controlar estruturas de repetição podem ser substituídas por instruções de quebra.
let concluido = false;
while (/* condição 1 */ && !concluido) {
if (/* condição 2 */) {
concluido = true;
continue;
}
}
// Eliminando a variável de controle com 'break'
while (/* condição */) {
if (/* condição 2 */) {
break;
}
}
- Restringindo o Escopo das Variáveis
Variáveis devem ser visíveis apenas para as linhas de código que as utilizam, reduzindo a carga cognitiva.
- Torne métodos estáticos quando possível, limitando o escopo da função.
- Divida classes grandes em menores e independentes, evitando dependências internas.
- Separe arquivos ou funções extensas para isolar dados.
class ClasseAmpla {
string texto_;
void ProcessarDados() {
texto_ = ...;
UsarTexto();
}
void UsarTexto() {
// Utiliza texto_
}
// Outros métodos sem acesso a texto_...
};
// Convertendo texto_ em variável local para melhor rastreabilidade
class ClasseAmpla {
void ProcessarDados() {
string texto = ...;
UsarTexto(texto);
}
void UsarTexto(string texto) {
// Utiliza texto
}
// Agora, outros métodos não têm acesso a texto.
};
- Escopo em Declarações Condicionais em C++
Em C++, variáveis podem ser definidas dentro de blocos condicionais para limitar sua visibilidade.
DadosPagamento* dados = bancoDados.ObterDadosPagamento();
if (dados) {
cout << "Valor pago: " << dados->valor() << endl;
}
// Código adicional abaixo...
// Definindo a variável dentro do bloco 'if' para reduzir o escopo
if (DadosPagamento* dados = bancoDados.ObterDadosPagamento()) {
cout << "Valor pago: " << dados->valor() << endl;
}
- Adiando Definições de Variáveis
Linguagens como C++ e C99 permitem definir variáveis próximo ao ponto de uso, evitando que o leitor as memorize desnecessariamente.
- Preferindo Variáveis de Escrita Única
Variáveis que não são alteradas após a inicialização, como constantes, são mais fáceis de raciocinar e reduzem riscos de erros.