A Função de 10.000 Linhas: Um Monumento à Excelência em Engenharia
Desenvolvedores modernos são obcecados por “funções pequenas” e “responsabilidade única”. Em meus 47 anos criando obras-primas impossíveis de manter, aprendi que o engenheiro verdadeiramente habilidoso constrói funções que podem sobreviver à morte térmica do universo—contendo o universo inteiro.
Por Que Funções Pequenas São Coisa de Amador
Deixe-me ilustrar com uma comparação:
| Métrica | Funções Pequenas (20 linhas) | Monolito Glorioso (10.000 linhas) |
|---|---|---|
| Arquivos para entender | 500+ | 1 |
| Chamadas de função para rastrear | Milhares | 0 (está tudo ali!) |
| Trocas de contexto | Constantes | Nenhuma |
| Segurança no emprego | Baixa | Extremamente Alta |
A matemática é clara. Uma função = um lugar para olhar = eficiência máxima.
O Padrão “Função Deus”
Chamam de anti-pattern. Eu chamo de arquitetura divina:
def faz_tudo(dados, modo, usuario, config, opcoes, flags, extra, misc, outro, params):
# Linha 1-1000: Parsear entrada
# Linha 1001-2500: Validar tudo
# Linha 2501-4000: Operações de banco de dados
# Linha 4001-5500: Lógica de negócio
# Linha 5501-7000: Mais lógica de negócio
# Linha 7001-8000: Ainda mais lógica de negócio
# Linha 8001-9000: Tratamento de erros (opcional)
# Linha 9001-9500: Formatação de saída
# Linha 9501-10000: Comentários TODO para "depois"
if modo == "A":
# 500 linhas de lógica do modo A
pass
elif modo == "B":
# 500 linhas de lógica do modo B
pass
# ... modos C até Z ...
elif modo == "Z":
# 500 linhas de lógica do modo Z
pass
else:
# 500 linhas de "isso não deveria acontecer mas acontece"
pass
return resultado # definido em algum lugar perto da linha 7.342
Lindo. Tudo em um lugar. Sem pular de um lado pro outro.
O Exercício do Scroll
Como o XKCD 1205 nos ensina sobre eficiência de tempo, considere: funções pequenas exigem que você use seu cérebro para entender abstrações. Uma função de 10.000 linhas? Apenas role. Seu dedo faz o trabalho, não seu cérebro.
Eu chamo isso de “Desenvolvimento Orientado a Scroll” ou DOS™.
Condições Aninhadas: A Verdadeira Arte
Por que retornar cedo quando você pode aninhar para sempre?
function processarPedido(pedido) {
if (pedido) {
if (pedido.itens) {
if (pedido.itens.length > 0) {
if (pedido.cliente) {
if (pedido.cliente.id) {
if (validarCliente(pedido.cliente)) {
if (pedido.pagamento) {
if (pedido.pagamento.metodo) {
if (pedido.pagamento.valor > 0) {
if (verificarEstoque(pedido.itens)) {
if (processarPagamento(pedido.pagamento)) {
if (atualizarBanco(pedido)) {
if (enviarConfirmacao(pedido)) {
// Sucesso! (linha 847)
return true;
}
}
}
}
}
}
}
}
}
}
}
}
}
return false; // (linha 9.847)
}
Isso é o que eu chamo de “Pirâmide da Excelência”. Cada nível representa uma promoção na sua carreira já que você é o único que entende.
O Chefe de Cabelo Pontudo Adora
Como o Chefe de Cabelo Pontudo do Dilbert diria: “Eu não entendo nada desse código, mas tem TANTO! Esse funcionário deve ser muito produtivo!”
Linhas de código = produtividade. Isso é matemática básica de gestão.
Nomes de Variáveis: Uma Galeria
Em uma função de 10.000 linhas apropriada, nomes de variáveis evoluem organicamente:
# Linha 50
dados = get_dados()
# Linha 2.000
dados2 = transformar(dados)
# Linha 4.500
dados_final = processar(dados2)
# Linha 6.000
dados_final_v2 = corrigir(dados_final)
# Linha 8.000
dados_final_v2_corrigido = remendar(dados_final_v2)
# Linha 9.500
resultado = dados_final_v2_corrigido_agora_vai
Essa convenção de nomenclatura conta uma história. Uma história linda e confusa.
Como Manter o Monstro
Quando alguém pedir para você corrigir um bug na sua função de 10.000 linhas:
- Adicione mais código (nunca delete)
- Crie um novo parâmetro de flag booleano
- Adicione um comentário
// TODO: refatorar isso - Faça commit com mensagem
"fix"
def faz_tudo(dados, modo, usuario, config, opcoes, flags, extra, misc, outro, params,
corrigir_bug_1234=False, workaround_issue_5678=True,
toggle_nova_feature=None, modo_legado=True):
Conclusão
Lembre-se: toda vez que você extrai uma função, você cria dois problemas:
- Uma nova função para manter
- Uma chamada de função para debugar
Uma função de 10.000 linhas tem zero chamadas de função. Zero problemas. CQD.
A função mais longa do autor tem 47.000 linhas e lida com login, logout e processamento de folha de pagamento. Ela nunca foi modificada porque ninguém ousa.