🔧 Aula 03 - Refatoração Segura em Java
Projeto Prático: Aplicação de Técnicas de Refatoração
Desenvolvimento de Sistemas II
Prof. Ricardo Pires
ETEC - Centro Paula Souza
📋 Visão Geral
Este projeto demonstra a aplicação prática de técnicas de refatoração segura em Java, incluindo:
- Extract Method: Decomposição de métodos longos
- Decompose Conditional: Simplificação de condicionais complexas
- Guard Clauses: Eliminação de aninhamento excessivo
- Validação de Comportamento: Testes que garantem preservação da funcionalidade
🎯 Objetivos Pedagógicos
- Identificar código que precisa ser refatorado (code smells)
- Aplicar técnicas de refatoração de forma incremental e segura
- Validar que o comportamento foi preservado através de testes automatizados
- Medir objetivamente a melhoria na qualidade do código
🏗️ Estrutura do Projeto
projeto-pratico/
├── src/
│ ├── main/java/br/etec/refatoracao/
│ │ ├── ExemploAntes.java # Código problemático original
│ │ ├── ExemploDepois.java # Código refatorado
│ │ ├── TecnicasRefatoracao.java # Demonstrações das técnicas
│ │ └── GabaritoExercicios.java # Soluções dos exercícios
│ └── test/java/br/etec/refatoracao/
│ └── ExemploDepoisTest.java # Testes de validação
├── docs/
│ └── METRICS.md # Métricas before/after
├── pom.xml # Configuração Maven
├── checkstyle.xml # Regras de estilo
├── README.md # Este arquivo
└── .gitignore # Arquivos ignorados
🚀 Como Executar
📋 Pré-requisitos
- Java 21 ou superior instalado
- Maven 3.8.0 ou superior instalado
- IDE com suporte a Java (IntelliJ IDEA, Eclipse, VS Code)
⬇️ Download e Configuração
# Clone ou baixe o projeto
git clone https://github.com/etec/aula03-refatoracao.git
cd aula03-refatoracao/projeto-pratico
# Compilar o projeto
mvn clean compile
# Executar testes
mvn test
# Gerar relatórios de qualidade
mvn verify site🔧 Comandos Maven Úteis
# Executar apenas testes unitários
mvn test
# Executar testes com cobertura
mvn test jacoco:report
# Verificar estilo de código
mvn checkstyle:check
# Análise completa de qualidade
mvn clean verify
# Gerar site com relatórios
mvn site
# Executar perfil de qualidade completa
mvn clean verify -P quality📊 Demonstrações Incluídas
🔴 1. ExemploAntes.java - Código Problemático
Este arquivo contém exemplos de código com vários code smells:
public class ExemploAntes {
// ❌ PROBLEMA: Método longo com múltiplas responsabilidades
public String processarPedido(Pedido pedido) {
// 60+ linhas fazendo:
// - Validação do pedido
// - Cálculo de total
// - Aplicação de desconto
// - Formatação do resultado
}
// ❌ PROBLEMA: Condicionais aninhadas complexas
public boolean podeComprar(Usuario usuario, Produto produto) {
// 6 níveis de aninhamento
if (usuario != null) {
if (usuario.isAtivo()) {
// ... mais aninhamento
}
}
}
}Code Smells demonstrados:
- Método longo (60+ linhas)
- Múltiplas responsabilidades
- Condicionais aninhadas (6 níveis)
- Duplicação de código
- Nomes pouco expressivos
- Valores mágicos hardcodados
🟢 2. ExemploDepois.java - Código Refatorado
Versão limpa aplicando as técnicas de refatoração:
public class ExemploDepois {
// ✅ SOLUÇÃO: Método principal focado e legível
public String processarPedido(Pedido pedido) {
String validacao = validarPedido(pedido);
if (validacao != null) {
return validacao;
}
double total = calcularTotal(pedido);
total = aplicarDesconto(pedido.getCliente(), total);
return formatarResultado(total);
}
// ✅ SOLUÇÃO: Validação com guard clauses
public boolean podeComprar(Usuario usuario, Produto produto) {
return isUsuarioValido(usuario) &&
isProdutoDisponivel(produto);
}
private boolean isUsuarioValido(Usuario usuario) {
if (usuario == null) return false;
if (!usuario.isAtivo()) return false;
return true;
}
}🎯 3. TecnicasRefatoracao.java - Catálogo de Técnicas
Demonstrações passo-a-passo das principais técnicas:
- Extract Method: Como quebrar métodos longos
- Decompose Conditional: Simplificação de condicionais
- Extract Variable: Clarificação de expressões complexas
- Replace Magic Number: Substituição de valores mágicos
- Guard Clauses: Redução de aninhamento
- Remove Duplication: Eliminação de código duplicado
📝 4. GabaritoExercicios.java - Soluções dos Exercícios
Soluções completas dos exercícios propostos no material pedagógico.
🧪 Testes e Validação
teste de Comportamento Preservado
@Test
@DisplayName("Comportamento idêntico após refatoração")
void devePreservarComportamento() {
// Arrange
Pedido pedido = criarPedidoValido();
// Act - executar ambas as versões
String resultadoAntes = exemploAntes.processarPedido(pedido);
String resultadoDepois = exemploDepois.processarPedido(pedido);
// Assert - resultados idênticos
assertEquals(resultadoAntes, resultadoDepois);
}Testes Parametrizados
@ParameterizedTest
@ValueSource(doubles = {10.0, 50.0, 100.0, 500.0, 1000.0})
@DisplayName("Preserva cálculo de desconto para diferentes valores")
void deveCalcularDescontoCorretamente(double valor) {
Cliente cliente = criarClienteVip();
double antes = exemploAntes.calcularDesconto(cliente, valor);
double depois = exemploDepois.calcularDesconto(cliente, valor);
assertEquals(antes, depois, 0.001);
}Cobertura de Código
O projeto está configurado com JaCoCo para medir cobertura:
- Meta: 90% de cobertura de linhas
- Relatório:
target/site/jacoco/index.html
📈 Métricas de Qualidade
Before vs After Comparison
| Métrica | ❌ Antes | ✅ Depois | 📈 Melhoria |
|---|---|---|---|
| Linhas por método | 62 | 8 | 87% menor |
| Complexidade ciclomática | 12 | 3 | 75% menor |
| Níveis de aninhamento | 6 | 1 | 83% menor |
| Métodos por classe | 2 | 8 | Responsabilidades separadas |
| Duplicação de código | 35% | 0% | 100% elimination |
| Cobertura de testes | 45% | 95% | 111% improvement |
Code Smells Eliminados
- ✅ Long Method: Dividido em métodos focados
- ✅ Complex Conditional: Substituído por guard clauses
- ✅ Duplicate Code: Extraído para métodos auxiliares
- ✅ Magic Numbers: Replaced by named constants
- ✅ Poor Names: Métodos com nomes expressivos
Ferramentas de Análise
- Checkstyle: Verificação de estilo e convenções
- PMD: Detecção de code smells
- SpotBugs: Identificação de possíveis bugs
- JaCoCo: Cobertura de código
💻 Instruções para Desenvolvimento
🎯 Para Alunos - Exercícios Práticos
Exercício 1: Análise de Code Smells
- Abra
ExemploAntes.java - Identifique todos os code smells presentes
- Classifique por severidade (Alto/Médio/Baixo)
- Compare com
ExemploDepois.java
Exercício 2: Aplicar Extract Method
- Pegue um método longo de
TecnicasRefatoracao.java - Aplique Extract Method passo a passo
- Execute testes após cada extração
- Valide que comportamento foi preservado
Exercício 3: Decompose Conditional
- Encontre condicionais aninhadas no código
- Aplique guard clauses
- Extraia métodos de validação
- Compare legibilidade before/after
Exercício 4: Medição Objetiva
- Execute
mvn clean verify - Analise relatórios em
target/site/ - Compare métricas do código original vs. refatorado
- Documente melhorias encontradas
🧪 Para Professores - Material de Apoio
Demonstrações Live Coding
// Use estes trechos para demonstração ao vivo:
// DEMO 1: Extract Method step-by-step
public String exemploExtracao() {
// Mostrar processo incremental de extração
// Destacar execução de testes a cada passo
}
// DEMO 2: Decompose Conditional
public boolean exemploCondicional() {
// Mostrar transformação de aninhamento para guard clauses
// Enfatizar legibilidade melhorada
}Pontos de Discussão
- Por que refatoração é investimento, não custo?
- Como medir objetivamente melhoria de código?
- Quando refatorar e quando deixar código como está?
- Como garantir que nova funcionalidade não introduza code smells?
🔧 Configuração de Desenvolvimento
IDEs Recomendadas
IntelliJ IDEA
# Plugins recomendados:
- SonarLint
- CheckStyle-IDEA
- PMDPlugin
- JaCoCo Coverage
# Configurações:
File → Settings → Editor → Code Style → Java
Importar: projeto-pratico/idea-codestyle.xmlEclipse
# Plugins recomendados:
- Checkstyle Plug-in
- PMD Eclipse Plugin
- EclEmma (JaCoCo)
- SonarLint
# Configurações:
Window → Preferences → Java → Code Style
Importar: projeto-pratico/eclipse-codestyle.xmlVS Code
// settings.json recomendado
{
"java.checkstyle.configuration": "${workspaceFolder}/checkstyle.xml",
"java.checkstyle.active": true,
"java.format.settings.url": "${workspaceFolder}/eclipse-java-google-style.xml"
}Git Hooks (Opcional)
# Pre-commit hook para validação automática
#!/bin/sh
mvn clean test checkstyle:check
if [ $? -ne 0 ]; then
echo "❌ Tests ou Checkstyle falharam. Commit bloqueado."
exit 1
fi
echo "✅ Validação passou. Commit liberado."📚 Recursos de Aprendizagem
📖 Leitura Essencial
- Refactoring - Martin Fowler
- Clean Code - Robert Martin
- Working Effectively with Legacy Code - Michael Feathers
🎥 Videos Recomendados
- Refactoring at Scale - Code Europe
- The Art of Readable Code - KevlinHenney
- Therapeutic Refactoring - Katrina Owen
🌐 Sites e Ferramentas
- Refactoring.guru - Catálogo visual
- SonarQube - Análise contínua
- JetBrains Qodana - Code quality platform
🤝 Contribuição
Para Estudantes
- Fork este repositório
- Crie branch para seus exercícios:
git checkout -b exercicio-1 - Implemente soluções dos exercícios
- Commit com mensagens descritivas
- Abra Pull Request para discussão
Para Professores
- Reporte bugs ou melhorias nas Issues
- Compartilhe adaptações para outras disciplinas
- Contribua com novos exercícios
- Documente lições aprendidas
📄 Licença
Este projeto é material educacional da ETEC - Centro Paula Souza e está disponível para uso acadêmico.
Uso Permitido
- ✅ Uso em sala de aula
- ✅ Adaptação para outras disciplinas
- ✅ Estudo individual
- ✅ Compartilhamento entre educadores
Uso Restrito
- ❌ Uso comercial sem autorização
- ❌ Remoção de créditos autorais
- ❌ Redistribuição sem contexto educacional
📞 Contato e Suporte
Prof. Ricardo Pires
- 📧 Email: ricardo.pires@etec.sp.gov.br
- 🏫 Instituição: ETEC - Centro Paula Souza
- 👨💻 GitHub: @ricardopires
Para dúvidas sobre o projeto:
- 🐛 Bugs: Abra uma Issue
- 💡 Sugestões: Discussion no GitHub
- 📚 Dúvidas acadêmicas: Email do professor
🏆 Agradecimentos
- Martin Fowler pelos conceitos fundamentais de refatoração
- Robert C. Martin pelos princípios de código limpo
- IntelliJ IDEA pelas ferramentas de refatoração
- Comunidade Java pelo ecossistema de qualidade
- Alunos da ETEC pelo feedback e melhorias contínuas
🎯 Lembre-se: Refatoração é disciplina, não evento!
“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” - Martin Fowler