Como inverter sua lógica mental pode deixar seu código mais limpo, direto e elegante.
Ao escrever código, é natural pensarmos como falamos:
"Se der certo, faça isso; senão, faça aquilo."
Essa forma de pensar nos leva automaticamente a usar estruturas if ... else, porque parece reproduzir a forma como tomamos decisões no dia a dia. Mas essa abordagem, embora intuitiva, costuma resultar em código mais verboso, mais indentado e, como o tempo, mais difícil de manter.
Vamos a um exemplo clássico:
if Valido(Cliente) then
ProcessarPedido(Cliente)
else
MostrarErro('Cliente inválido.');O problema? Mesmo que a verificação de validade falhe, o programa ainda precisa percorrer visualmente o bloco inteiro antes de entender que o pedido não será processado. O foco é mantido na opção positiva, quando na verdade deveríamos eliminar o que não interessa logo de cara.
Agora veja essa alternativa:
if not Valido(Cliente) then
begin
MostrarErro('Cliente inválido.');
Exit;
end;
ProcessaPedido(Cliente);Essa técnica é conhecida como "early return" ou "guard classe", e sua essência é simples: trate logo os casos em que você não quer continuar. Ao se livrar do que não interessa no início, você limpa o caminho para o fluxo principal do seu algoritmo.
Benefícios de evitar o else:
- Menos indentação: Código menos aninhado é mais fácil de ler.
- Mais clareza: O leitor entende rapidamente o que precisa acontecer.
- Facilidade de manutenção: Menos blocos, menos pontos de erro.
- Fluxo direto: Seu código mostra primeiro o que deve ser descartado e depois o que importa.
Antes e depois: exemplos reais
- Processamento de arquivo com if ... else:
if FileExists(NomeArquivo) then
CarregarArquivo(NomeArquivo)
else
MostrarErro('Arquivo não encontrado.');- Processamento de arquivo com early return:
if not FileExists(NomeArquivo) then
begin
MostrarErro('Arquivo não encontrado.');
Exit;
end;
CarregarArquivo(NomeAraquivo);
- Acesso autenticado com if ... else:
if UsuarioAutenticado then
ExibirDashboard
else
RedirecionarParaLogin;- Acesso autenticado com early return:
if not UsuarioAutenticado then
begin
RedirecionarParaLogin;
Exit;
end;
ExibirDashboard;
E quanto a outros controles de fluxo?
Esse pensamento também pode ser aplicado em outras estruturas, como case, for, while e até mesmo em try ... except. Vamos ver alguns exemplos:
- Dentro de for loops:
for I := 0 to Lista.Count -1 do
begin
if not ItemValido(Lista[I]) then
Continue; // Pula direto para o próximo item
ProcessarItem(Lista[I]);
end;- Com try ... except:
try
ConectarBanco;
ProcessarConsulta;
except
on E: Exception do
begin
LogarErro(E.Message);
Exit; // Não segue se houve erro
end;
end;
FinalizarProcessamento;Note como essa abordagem evita que o fluxo normal do programa fique "escondido" dentro de blocos longos e aninhados.
Conclusão
Pense no seu código como uma conversa consigo mesmo. Em vez de perguntar "e se der certo?", comece perguntando: "e se der errado?". Ao tratar logo os desvios e encerrar os fluxos desnecessários, você ganhará em clareza, elegância e produtividade.
Esse tipo de escrita não é apenas uma questão de estilo: é uma forma de comunicar suas intencionalidades como programador com muito mais eficiência.