Projeto 08: Diagnóstico e Eliminação de Code Smells e Anti-Patterns 🧹
Escopo do Projeto
Objetivo: Identificar e erradicar problemas comuns de design de software: Feature Envy, Long Method, Primitive Obsession, Data Clumps e Cadeias de Condicionais excessivas.
🎯 1. Contexto & Desafio Prático
Código com 'cheiro ruim' (Code Smell) degrada a manutenibilidade e eleva o custo de novos desenvolvimentos. Você atuará como engenheiro sênior em uma auditoria de código, identificando anti-padrões clássicos e aplicando técnicas de refatoração comprovadas.
📋 2. Requisitos Técnicos Obrigatórios
- R1 (Eliminação de Primitive Obsession): Substituir tipos primitivos soltos (strings e floats de CEP, CPF, Dinheiro) por Value Objects auto-validados.
- R2 (Eliminação de Data Clumps): Agrupar parâmetros que sempre viajam juntos em estruturas de dados coesas.
- R3 (Substituição de Condicionais por Polimorfismo): Eliminar cadeias de
if/elif/elseque decidem tipos de clientes aplicando o padrão Strategy. - R4 (Extração de Métodos e Nomes Expressivos): Quebrar funções com mais de 30 linhas em métodos menores com nomes que expressam intenção clara.
📐 3. Diagrama Conceitual & Arquitetura
graph LR
Smells["Code Smells: Primitive Obsession & Data Clumps"] --> Detect["Auditoria de Design de Código"]
Detect --> Fix1["Value Objects (CPF, CEP, Money)"]
Detect --> Fix2["Parameter Objects (Agrupamento de Dados)"]
Detect --> Fix3["Polimorfismo (Adeus Cadeias de IFs)"]
Fix1 & Fix2 & Fix3 --> CleanCode["Código Limpo, Expressivo e Sustentável"]
style Smells fill:#ffebee,stroke:#c62828
style Detect fill:#fff3e0,stroke:#e65100
style CleanCode fill:#e8f5e9,stroke:#2e7d32 💻 4. Especificação Técnica & Código de Referência
// clean_value_objects.py
import re
class CPF:
"""Value Object imutável com validação embutida (Anti-Primitive Obsession)."""
def __init__(self, raw_cpf: str):
cleaned = re.sub(r'\D', '', raw_cpf)
if len(cleaned) != 11:
raise ValueError(f"CPF inválido: {raw_cpf}")
self._value = cleaned
@property
def formatted(self) -> str:
return f"{self._value[:3]}.{self._value[3:6]}.{self._value[6:9]}-{self._value[9:]}"
def __eq__(self, other):
return isinstance(other, CPF) and self._value == other._value
📦 5. Critérios de Avaliação e Entrega
- Criação de Value Objects com validação atômica no construtor.
- Eliminação comprovada de métodos longos e cadeias de condicionais.
- Testes unitários cobrindo cenários válidos e exceções de Value Objects.