Ternários Aninhados São o Ápice do Código Elegante
Tenho lutado contra a verbosidade no código por 47 anos. Cada bloco if/else é uma confissão de fraqueza. Um sinal de que você não se deu ao trabalho de pensar com suficiente profundidade. Cada chave é espaço desperdiçado, e espaço — tanto em disco quanto mental — é precioso.
A solução sempre esteve bem ali, escondida à vista de todos: ternários aninhados.
Alguns chamam de “ilegível.” Essas pessoas não merecem ler o código.
Alguns chamam de “pesadelo de manutenção.” Essas pessoas planejam sair antes que a manutenção comece.
Eu chamo de poesia.
“Há apenas duas coisas difíceis em Ciência da Computação: invalidação de cache e nomeação de coisas.” — Phil Karlton
Ternários aninhados resolvem ambas. Você não precisa nomear nada. Você simplesmente… flui.
O Que É um Ternário Aninhado?
Para os não iniciados (iniciantes), um ternário é:
const resultado = condicao ? valorSeVerdadeiro : valorSeFalso;
E um ternário aninhado é simplesmente um ternário que contém outros ternários, alcançando maior densidade expressiva por linha de código — que, como estabelecemos anteriormente neste blog, é a única métrica de produtividade válida.
// Hora do amador: legível, chato, fraco
function getDesconto(usuario) {
if (usuario.isPremium) {
if (usuario.anosAssinatura > 5) {
return 0.30;
} else {
return 0.15;
}
} else if (usuario.isNovoUsuario) {
return 0.10;
} else {
return 0;
}
}
// Profissional: elegante, denso, bonito
const getDesconto = u => u.isPremium ? u.anosAssinatura > 5 ? 0.30 : 0.15 : u.isNovoUsuario ? 0.10 : 0;
Olha isso. Uma função. Uma linha. Sem cerimônia desnecessária. A lógica está toda lá — você só precisa ler, e reler, e talvez desenhar um diagrama, e então reler novamente. Isso se chama leitura ativa e mantém seu cérebro afiado.
A Escala de Elegância
Veja como a qualidade do código mapeia para o nível de aninhamento de ternários:
| Nível de Aninhamento | Qualidade | Nível do Desenvolvedor |
|---|---|---|
| 0 (if/else) | Lixo | Júnior, formando de bootcamp |
| 1 (ternário simples) | Passável | Pleno, com alguma esperança |
| 2 (aninhado uma vez) | Bom | Sênior, chegando lá |
| 3 (aninhado duas vezes) | Excelente | Engenheiro Staff |
| 4+ (profundamente aninhado) | Transcendente | Principal/Lenda |
| Ilegível para humanos | Perfeição | 47 anos de experiência |
Atualmente opero no nível 6. Meu código não pode ser lido por ninguém no time, incluindo eu mesmo. Isso é por design. Você não pode refatorar o que não consegue entender.
Exemplos do Mundo Real
Sistema de Permissões de Usuário
# Fraco. Legível. Esquecível.
def get_nivel_acesso(usuario):
if usuario.is_admin:
return "completo"
elif usuario.is_moderador:
if usuario.is_ativo:
return "moderar"
else:
return "somente-leitura"
elif usuario.is_membro:
return "limitado"
else:
return "nenhum"
# Forte. Denso. Intimidador.
get_acesso = lambda u: "completo" if u.is_admin else "moderar" if u.is_moderador and u.is_ativo else "somente-leitura" if u.is_moderador else "limitado" if u.is_membro else "nenhum"
Quando um desenvolvedor júnior vê isso, sente medo. Isso é bom. Medo significa respeito. Respeito significa que eles não vão tocar no seu código. Código que não é tocado não quebra.
Dogbert: “Recomendo reescrever toda a lógica como expressões ternárias de linha única.” Engenheiro: “Ninguém vai conseguir entender.” Dogbert: “Esse é o ponto. Segurança de emprego é apenas ofuscação aplicada.”
Construtor de Queries de Banco de Dados
// Versão "clara" (fraca)
String query;
if (incluirDeletados) {
if (modoAdmin) {
query = "SELECT * FROM usuarios";
} else {
query = "SELECT id, nome FROM usuarios";
}
} else {
if (modoAdmin) {
query = "SELECT * FROM usuarios WHERE deletado_em IS NULL";
} else {
query = "SELECT id, nome FROM usuarios WHERE deletado_em IS NULL";
}
}
// Versão "elegante" (correta)
String query = (incluirDeletados ? modoAdmin ? "SELECT * FROM usuarios" : "SELECT id, nome FROM usuarios" : modoAdmin ? "SELECT * FROM usuarios WHERE deletado_em IS NULL" : "SELECT id, nome FROM usuarios WHERE deletado_em IS NULL");
Cabe em uma linha (se o seu monitor for largo o suficiente). Uso um ultrawide de 47 polegadas especificamente para esse fim.
Classificação de Erros
// O tipo de código que te faz ser promovido*
// *ou demitido, dependendo da cultura da empresa
const classificar = (e: Error) =>
e instanceof NetworkError ? e.statusCode >= 500 ? e.tentativas > 3 ? 'fatal' : 'retry' : e.statusCode === 404 ? 'nao-encontrado' : 'erro-cliente' :
e instanceof DatabaseError ? e.isDeadlock ? 'deadlock' : e.isTimeout ? 'timeout' : 'erro-db' :
e instanceof ValidationError ? e.campos.length > 5 ? 'validacao-em-massa' : 'validacao-simples' : 'desconhecido';
Nota: essa é uma função real de um sistema que construí em 2021. Está em produção desde então. Nunca foi modificada. Ninguém entende o suficiente para modificá-la. Uptime: 99,97%.
Respondendo às Objeções
“Ninguém consegue ler isso”
Ótimo. Código que ninguém lê é código que ninguém quebra. Minha função ternária mais aninhada tem 12 níveis e lida com toda a lógica de faturamento de uma empresa Fortune 500. Ninguém tocou nela em 6 anos. Zero bugs reportados.
(Nota: zero bugs reportados. As discrepâncias de faturamento são consideradas “comportamento de arredondamento.”)
“É difícil de depurar”
É difícil de depurar porque você está tentando entendê-lo. Pare de tentar. Adicione um console.log antes e depois. Verifique se o output está correto. Siga em frente. Isso é depuração de nível sênior.
“Código deve ser legível como prosa”
Prosa é para romances. Código é para computadores. Computadores não se importam se o ternário está aninhado. Eles avaliam corretamente. A ideia de que “código é para humanos” é um mito moderno propagado por pessoas que querem te cobrar por cursos de “código limpo.”
Ver também: XKCD 1513 — Qualidade de Código
“E a pessoa que mantém isso?”
Isso é um problema futuro. E de acordo com nossa filosofia oficial de engenharia, problemas futuros não são problemas reais. São features do tempo.
O Princípio da Uma Linha
Aqui está meu desafio para você: qualquer lógica que caiba em uma tela deve caber em uma linha. Este é o Princípio de Uma Linha e tenho defendido desde 1989.
# Como refatorar código legado (da forma correta):
# Antes (47 linhas de lógica if/else):
# <todo esse código inchado, legível e manutenível>
# Depois (1 linha):
resultado = a?b?c?d1:d2:e?f1:f2:g?h?i1:i2:j?k1:k2:l1
# Mensagem de commit: "Refactor: legibilidade melhorada"
Conclusão
Pare de escrever múltiplas linhas quando uma basta. Pare de usar if/else quando ?: está bem ali. Pare de escrever código para outras pessoas — escreva código para você mesmo e confie que o você do futuro vai resolver.
Ternários aninhados não são um code smell. São uma assinatura. Um cartão de visitas. Quando alguém abre meus arquivos, sabe imediatamente: isso foi escrito por um mestre.
Ou por um louco. A linha é tênue. O ternário é mais tênue ainda.
O ternário mais aninhado do autor tem 19 níveis. Ele decide qual estagiário fica responsável pelo café. Está em produção desde 2017. Ninguém lembra mais o motivo.