Projeto 04: Imutabilidade, Funções Puras e Pipelines Funcionais ⚡
Escopo do Projeto
Objetivo: Projetar um pipeline de análise de dados adotando os princípios da Programação Funcional: pureza de funções, dados imutáveis, funções de ordem superior (Higher-Order Functions) e composição com currying.
🎯 1. Contexto & Desafio Prático
A manipulação de fluxos contínuos de eventos exige previsibilidade matemática. Você implementará um motor de auditoria de compras de cartão de crédito usando composição de funções puras, garantindo que nenhum estado original seja alterado durante o processo de enriquecimento e detecção de anomalias.
📋 2. Requisitos Técnicos Obrigatórios
- R1 (Funções Puras sem Efeitos Colaterais): Todas as rotinas de filtragem e cálculo devem retornar novos objetos, jamais mutar listas originais.
- R2 (Estruturas de Dados Imutáveis): Utilizar tipos imutáveis (
NamedTuple,frozen dataclassesou tuplas nativas). - R3 (Higher-Order Functions): Construir compositores de funções (
pipeoucompose) combinando validadores e transformadores. - R4 (Agregação de Métricas): Calcular o total de despesas suspeitas utilizando encadeamento funcional com
reduce.
📐 3. Diagrama Conceitual & Arquitetura
graph LR
Events["Eventos de Transação (Imutáveis)"] --> F1["Filtro: transacoes_acima_limite()"]
F1 --> F2["Map: normalizar_moeda_usd()"]
F2 --> F3["Reduce: somar_total_auditoria()"]
F3 --> FinalStats["Relatório Financeiro Imutável"]
style Events fill:#e1f5fe,stroke:#01579b
style F1 fill:#fff3e0,stroke:#e65100
style F2 fill:#f3e5f5,stroke:#7b1fa2
style F3 fill:#e8f5e9,stroke:#2e7d32 💻 4. Especificação Técnica & Código de Referência
// pipeline_funcional.py
from typing import NamedTuple
from functools import reduce
class Transacao(NamedTuple):
id: str
valor: float
categoria: str
def filtrar_por_categoria(categoria: str):
return lambda txs: [t for t in txs if t.categoria == categoria]
def aplicar_desconto(taxa: float):
return lambda txs: [Transacao(t.id, t.valor * (1 - taxa), t.categoria) for t in txs]
# Composição declarativa pura
def totalizar(txs: list[Transacao]) -> float:
return reduce(lambda acc, t: acc + t.valor, txs, 0.0)
📦 5. Critérios de Avaliação e Entrega
- Uso comprovado de estruturas imutáveis em todas as etapas.
- Composição de funções de alta ordem demonstrando closures/lambdas.
- Teste de assert comprovando que a lista original permaneceu intacta.