Pular para conteúdo

Projeto 06: Arquitetura Híbrida Multi-Paradigma em Sistemas Modernos 🔀

Escopo do Projeto

Objetivo: Projetar uma arquitetura de software híbrida combinando classes para modelagem de domínio (OO) com funções puras e streams para transformação de dados (Funcional).


🎯 1. Contexto & Desafio Prático

Linguagens modernas (TypeScript, Python, Kotlin, Java, Rust) são fundamentalmente multiparadigma. O arquiteto sênior não escolhe um paradigma em detrimento de outro, mas combina o melhor de cada mundo: classes para gerenciar entidades e identidade, e programação funcional para transformações matemáticas sem efeitos colaterais.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Entidades de Domínio OO): Modelar classes de negócio ricas (Usuario, CarrinhoDeCompras) com invariantes de validação nos métodos.
  • R2 (Cálculos Funcionais Desacoplados): Extrair toda a lógica de tributação, descontos e cupons para funções puras encadeadas.
  • R3 (Uso de Monads ou Resultados Tipados): Implementar padrão Result[Success, Failure] funcional para tratamento de erros sem uso desordenado de exceptions.
  • R4 (Teste de Integração): Demonstrar o fluxo completo de checkout integrando objetos de domínio com funções de cálculo puras.

📐 3. Diagrama Conceitual & Arquitetura

graph LR
    Entity["Entidade de Domínio (OO: Estado & Identidade)"] --> Pipeline["Funções Puras de Negócio (Funcional: Sem Efeitos)"]
    Pipeline --> Result["Result Pattern: Ok(PedidoFaturado) / Err(Motivo)"]
    Result --> Store["Persistência Imutável"]
    style Entity fill:#e1f5fe,stroke:#01579b
    style Pipeline fill:#fff3e0,stroke:#e65100
    style Result fill:#e8f5e9,stroke:#2e7d32

💻 4. Especificação Técnica & Código de Referência

// hybrid_domain_service.py
from dataclasses import dataclass
from typing import Generic, TypeVar, Union

T = TypeVar('T')
E = TypeVar('E')

@dataclass(frozen=True)
class Ok(Generic[T]):
    value: T

@dataclass(frozen=True)
class Err(Generic[E]):
    error: E

Result = Union[Ok[T], Err[E]]

@dataclass
class Carrinho:
    cliente_id: str
    itens: list[float]

# Função pura de cálculo
def calcular_total_com_desconto(carrinho: Carrinho, cupom: float) -> Result[float, str]:
    if cupom < 0 or cupom > 1:
        return Err("Cupom de desconto inválido")
    subtotal = sum(carrinho.itens)
    return Ok(subtotal * (1 - cupom))

📦 5. Critérios de Avaliação e Entrega

  1. Aplicação combinando entidades de domínio com funções de cálculo puras.
  2. Padrão Result funcional tratando erros de forma determinística.
  3. Ausência de exceções não tratadas durante a execução do fluxo.