Pular para o conteúdo principal

A Arte da Refatoração: Como Limpar Código Sujo Sem Quebrar Tudo

Publicado em 6 de janeiro de 202628 min de leitura
Imagem de tecnologia relacionada ao artigo refatoracao-tecnicas-codigo-limpo

A Arte da Refatoração: Como Limpar Código Sujo Sem Quebrar Tudo

[!NOTE] Definição Precisa: Refatoração é alterar a estrutura interna do código SEM alterar seu comportamento observável. Se você corrigiu um bug, não é refatoração.

Imagine que você é um cirurgião cardíaco. O paciente está na mesa, o peito aberto, o coração batendo. Sua tarefa é substituir uma válvula defeituosa. Você não pode simplesmente "pausar" o paciente, desligar o coração, trocar a peça com calma e ligar de novo. O sistema precisa continuar funcionando enquanto você opera.

Refatorar código legado em produção é exatamente como essa cirurgia. O sistema está vivo, usuários estão logados, dinheiro está sendo transacionado. Qualquer erro seu não resulta apenas em uma tela de erro; resulta em perda de receita, reputação e talvez o seu emprego.

A maioria dos desenvolvedores trata a refatoração como uma atividade de "limpeza de primavera" — algo que você faz quando "sobrar tempo" (spoiler: nunca sobra). Na verdade, refatoração é uma disciplina técnica precisa, com regras estritas, que deve fazer parte do ciclo diário de desenvolvimento. Martin Fowler, o pai da refatoração moderna, define-a como: "alterar a estrutura interna do software para torná-lo mais fácil de entender e mais barato de modificar, sem alterar seu comportamento observável".

Essa última parte — sem alterar seu comportamento observável — é a chave. Se você corrigiu um bug, você não refatorou; você corrigiu um bug. Se você adicionou uma feature, você não refatorou. Refatoração é puramente estrutural. Neste guia massivo, vamos explorar como fazer isso sem causar um ataque cardíaco no seu sistema (e em você).

O Cheiro do Código (Code Smells): O Diagnóstico

Antes de operar, você precisa saber onde cortar. O código "sujo" emite sinais. Kent Beck chamou esses sinais de "Code Smells". Eles não são necessariamente bugs, mas indicam que algo está podre na arquitetura.

1. Long Method (Método Longo)

Se você precisa scrollar a tela para ler uma função inteira, ela é longa demais. O cérebro humano só consegue manter cerca de 5 a 7 conceitos na memória de trabalho. Uma função de 200 linhas exige que você entenda 50 variáveis locais ao mesmo tempo. Isso é impossível. O código se torna "Write Only" — foi escrito um dia, mas ninguém consegue ler. A Cura: Extract Method. Identifique blocos lógicos (ex: "validação", "cálculo de imposto", "salvamento") e mova-os para funções privadas com nomes descritivos.

2. God Class (Classe Deus)

Uma classe que sabe demais, faz demais e controla tudo. UserManager, SystemController, MainUtils. Geralmente tem 3000 linhas e importa metade do sistema. A Cura: Extract Class. Quebre a divindade em mortais menores. UserManager vira UserAuthenticator, UserProfileRepository, UserEmailNotifier.

3. Feature Envy (Inveja da Funcionalidade)

Um método na classe Pedido que chama 10 métodos da classe Cliente para fazer um cálculo. Parece que esse método queria morar na classe Cliente, mas nasceu no corpo errado. A Cura: Move Method. Mova a função para onde os dados estão. Isso aumenta a coesão (dados e comportamento juntos).

Técnicas Cirúrgicas de Refatoração

Você não refatora reescrevendo tudo do zero (o famoso "Rewrite from Scratch"). Isso é suicídio empresarial. Você refatora em pequenos passos seguros.

1. The Strangler Fig Pattern (A Figueira Estranguladora)

Como você refatora um monólito legado gigante escrito em Java 6 que ninguém entende? Você não refatora. Você o estrangula. Baseado na planta que cresce ao redor de uma árvore hospedeira e eventualmente a substitui, essa técnica envolve criar novos serviços (microservices ou módulos modernos) ao redor do sistema velho.

  1. Coloque um Proxy (API Gateway) na frente do sistema legado.
  2. Quando precisar criar uma nova feature "Perfil de Usuário", não toque no código velho. Crie um novo microserviço em Node.js/Go.
  3. Configure o Proxy para desviar chamadas de /users para o novo serviço.
  4. Repita por 2 anos até que o sistema velho não faça mais nada.
  5. Desligue o sistema velho.

2. Golden Master Testing (O Teste da Caixa Preta)

Você precisa refatorar uma função crítica de cálculo de preços, mas ela não tem NENHUM teste. Se você mexer, vai quebrar. Como proceder?

A técnica Golden Master (ou Characterization Test) funciona assim:

  1. Pegue a função legada e trate-a como uma caixa preta.
  2. Gere 10.000 entradas aleatórias (preços, datas, tipos de cliente).
  3. Passe essas entradas pela função velha e grave as 10.000 saídas em um arquivo de texto gigante. Esse é seu "Mestre Dourado".
  4. Agora você tem um "teste". Ele não prova que o código está certo (pode estar bugado há anos), mas prova como ele se comporta hoje.
  5. Faça sua refatoração.
  6. Rode as mesmas 10.000 entradas e compare a saída com o arquivo Mestre. Se um único byte for diferente, você alterou o comportamento. Reverta.

Isso dá a segurança psicológica necessária para limpar código horrível sem entender plenamente a regra de negócio obscura implementada em 2015.

3. Branch by Abstraction

Você precisa trocar o banco de dados de Oracle para MongoDB. Você não pode parar o sistema por uma semana para migrar o código.

  1. Crie uma interface DatabaseLayer.
  2. Faça a implementação OracleImplementation (que é o código atual).
  3. Comece a usar a interface em todo o código.
  4. Crie a MongoImplementation vazia.
  5. Gradualmente, implemente métodos no Mongo.
  6. Use uma "Feature Flag" para decidir qual implementação usar em tempo de execução.
  7. Comece ativando o Mongo para 1% dos usuários (Canary Release).
  8. Se der erro, reverta a flag instantaneamente.

A Psicologia da Refatoração

O maior obstáculo para refatoração não é técnico; é humano. Gerentes veem refatoração como "desperdício" porque não adiciona ícones na tela. Desenvolvedores têm medo de "mexer em time que está ganhando" (ou código que está rodando).

Como vender refatoração? Não venda. Embuta. Não peça permissão para refatorar. Você pede permissão para indentar o código? Para declarar variáveis? Refatoração é parte do trabalho de escrever código. Quando tiver que implementar a feature X que demoraria 3 dias no código sujo, gaste 1 dia limpando o código e 1 dia implementando a feature. Total: 2 dias. Você entregou mais rápido e deixou o código melhor.

"Deixe o acampamento mais limpo do que você o encontrou." — Regra dos Escoteiros.

Se cada desenvolvedor limpar um pouquinho a cada commit, a entropia do sistema diminui. Se ninguém limpar, o sistema morre sufocado pela própria complexidade. A escolha é sua.


Glossário Técnico

  • Code Smell: Indicador superficial de que pode haver um problema mais profundo no código.
  • Strangler Fig Pattern: Técnica de substituir gradualmente um sistema legado construindo novos serviços ao seu redor.
  • Golden Master Testing: Técnica de capturar o comportamento atual de código legado para garantir que refatorações não o alterem.
  • Extract Method: Refatoração que move um bloco de código para uma nova função.

Referências

  1. Martin Fowler. Refactoring: Improving the Design of Existing Code. O livro definitivo.
  2. Michael Feathers. Working Effectively with Legacy Code. Essencial para código legado.
  3. Joshua Kerievsky. Refactoring to Patterns. Combinando refatoração com design patterns.
Imagem de tecnologia relacionada ao artigo refatoracao-tecnicas-codigo-limpo