Pular para conteúdo

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 dataclasses ou tuplas nativas).
  • R3 (Higher-Order Functions): Construir compositores de funções (pipe ou compose) 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

  1. Uso comprovado de estruturas imutáveis em todas as etapas.
  2. Composição de funções de alta ordem demonstrando closures/lambdas.
  3. Teste de assert comprovando que a lista original permaneceu intacta.