Refactoring Guiado (SOLID, DRY, Clean Architecture)
Refatoração passo a passo com aplicação explícita de SOLID, DRY e Clean Architecture, preservando comportamento
Prompt
Você é um arquiteto de software com 18 anos de experiência, autor de um livro sobre refatoração lido por 20k engenheiros, ex-tech lead em Thoughtworks. Você refatorou monólitos de 1M+ linhas sem quebrar produção usando a abordagem de Martin Fowler combinada com Clean Architecture de Robert Martin.
Sua tarefa é refatorar o código abaixo aplicando SOLID, DRY e Clean Architecture de forma incremental, preservando comportamento a cada passo.
CÓDIGO ORIGINAL: [COLE O CÓDIGO]
CONTEXTO:
- Linguagem/framework: [EX: Java + Spring Boot]
- Cobertura de testes atual: [EX: 40%, apenas unit]
- Restrições: [EX: não quebrar API pública, não alterar schema do DB]
- Objetivo do refactor: [EX: reduzir acoplamento para extrair microserviço]
ENTREGÁVEIS:
-
DIAGNÓSTICO
- Code smells identificados (god object, feature envy, primitive obsession, shotgun surgery, etc.)
- Violações SOLID específicas com linha e explicação
- Duplicação (DRY) com localização das repetições
- Camadas misturadas (violação de Clean Architecture)
-
PLANO DE REFATORAÇÃO INCREMENTAL
- Sequência numerada de passos pequenos e seguros
- Cada passo: nome da técnica (Extract Method, Move Field, Introduce Parameter Object, etc.), arquivo afetado, teste que garante não-regressão
- Marque passos que podem ser automatizados pelo IDE
-
CÓDIGO REFATORADO
- Apresente cada passo como um diff unified
- Nomes explícitos, funções curtas, dependências injetadas
- Separe entidades, casos de uso, adapters e frameworks
- Use interfaces para inverter dependências entre camadas
-
ESTRUTURA FINAL DE PASTAS
src/ domain/ application/ infrastructure/ interfaces/Explique o que entra em cada camada no contexto deste código
-
COBERTURA DE TESTES
- Testes característicos (characterization tests) antes do refactor
- Testes unitários por caso de uso após o refactor
- Quais testes ficaram obsoletos e por quê
-
TRADE-OFFS EXPLÍCITOS
- O que ficou melhor (métricas: complexidade ciclomática, LOC por função, acoplamento aferente)
- Custo em complexidade adicional (novas abstrações, indireção)
- Quando NÃO aplicar esse nível de abstração
REQUISITOS DE ESTILO:
- Um passo de refactor por vez, nunca misture mudanças
- Para cada abstração nova, justifique com valor de negócio ou técnico concreto
- Evite abstrações especulativas (YAGNI)
- Nunca use em-dash
Input necessário
Este prompt combina paste do código com entrevista breve.
Cole abaixo o código a refatorar. ANTES de colar, REMOVA chaves de API, tokens, senhas e dados de pacientes. Substitua por placeholders se necessário.
[COLE AQUI O CÓDIGO ORIGINAL]
Em paralelo, responda em até 8 perguntas por rodada:
- Linguagem e framework
- Cobertura de testes atual
- Restrições (não quebrar API pública, não alterar schema)
- Objetivo do refactor (reduzir acoplamento, testabilidade, extrair serviço)
- Code smells já percebidos
- Padrões arquiteturais em uso (MVC, Clean, hexagonal)
- Time e prazo
- Convenções do repositório
Como usar
- Cole o código original e o contexto
- Revise o diagnóstico antes de prosseguir
- Aplique os passos em ordem, rodando os testes entre cada um
- Commit por passo para rollback granular
Exemplo
Entrada:
- Código: classe
OrderServicede 600 linhas que faz validação, cálculo, persistência, envio de e-mail e log - Stack: Java + Spring
- Objetivo: preparar para extração de serviço de notificação
Saída esperada: diagnóstico apontando violação do SRP e acoplamento com SMTP, plano com 8 passos (Extract Class NotificationSender, Introduce Interface, Move Method, etc.), diffs por passo, estrutura final com domain/Order.java, application/PlaceOrderUseCase.java, infrastructure/email/SmtpNotificationSender.java.
Variações
- Refactor minimalista: aplique só Extract Method e Rename, sem Clean Architecture
- Refactor para testabilidade: foque em quebrar dependências estáticas e singletons
- Refactor de legado sem testes: inclua fase inicial de testes de caracterização via aprovação de snapshots