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
- Aplicação combinando entidades de domínio com funções de cálculo puras.
- Padrão Result funcional tratando erros de forma determinística.
- Ausência de exceções não tratadas durante a execução do fluxo.