🔧 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étodo62887% menor
Complexidade ciclomática12375% menor
Níveis de aninhamento6183% menor
Métodos por classe28Responsabilidades separadas
Duplicação de código35%0%100% elimination
Cobertura de testes45%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

  1. Abra ExemploAntes.java
  2. Identifique todos os code smells presentes
  3. Classifique por severidade (Alto/Médio/Baixo)
  4. Compare com ExemploDepois.java

Exercício 2: Aplicar Extract Method

  1. Pegue um método longo de TecnicasRefatoracao.java
  2. Aplique Extract Method passo a passo
  3. Execute testes após cada extração
  4. Valide que comportamento foi preservado

Exercício 3: Decompose Conditional

  1. Encontre condicionais aninhadas no código
  2. Aplique guard clauses
  3. Extraia métodos de validação
  4. Compare legibilidade before/after

Exercício 4: Medição Objetiva

  1. Execute mvn clean verify
  2. Analise relatórios em target/site/
  3. Compare métricas do código original vs. refatorado
  4. 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.xml

Eclipse

# Plugins recomendados:
- Checkstyle Plug-in
- PMD Eclipse Plugin
- EclEmma (JaCoCo)
- SonarLint
 
# Configurações:
Window Preferences Java Code Style
Importar: projeto-pratico/eclipse-codestyle.xml

VS 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

🎥 Videos Recomendados

🌐 Sites e Ferramentas


🤝 Contribuição

Para Estudantes

  1. Fork este repositório
  2. Crie branch para seus exercícios: git checkout -b exercicio-1
  3. Implemente soluções dos exercícios
  4. Commit com mensagens descritivas
  5. Abra Pull Request para discussão

Para Professores

  1. Reporte bugs ou melhorias nas Issues
  2. Compartilhe adaptações para outras disciplinas
  3. Contribua com novos exercícios
  4. 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

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

0 items neste arquivo.