Spec Sistemas Com Python • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 08.1 — Enumerações Fortemente Tipadas com enum.Enum e StrEnum

Contexto: Enumerações Fortemente Tipadas com enum.Enum e StrEnum no contexto de Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True).

Requisitos de Execução:

  1. Declarar enum de perfis de usuário com StrEnum garantindo validações no domínio.

Resultado Esperado

Enumerações aplicadas com segurança de tipos e serialização direta.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_1_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True)
🔑 Gabarito de Código & Solução Comentada
from enum import StrEnum

class PerfilAcesso(StrEnum):
    ADMIN = "ADMINISTRADOR"
    OPERADOR = "OPERADOR"
    AUDITOR = "AUDITOR"

p = PerfilAcesso.ADMIN
print(f"Perfil: {p.value} (Eh string direta: {p == 'ADMINISTRADOR'})")

🔍 Nível 2: Prática

Problema 08.2 — Dataclasses Modernas com @dataclass(frozen=True, slots=True)

Contexto: Dataclasses Modernas com @dataclass(frozen=True, slots=True) no contexto de Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True).

Requisitos de Execução:

  1. Criar entidade de domínio imutável e com alocação otimizada no Python 3.12.

Resultado Esperado

Dataclass imutável e otimizada instanciada com hashing automático.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_2_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True)
🔑 Gabarito de Código & Solução Comentada
from dataclasses import dataclass

@dataclass(frozen=True, slots=True)
class Endereco:
    logradouro: str
    numero: int
    cidade: str

e = Endereco("Av. Paulista", 1000, "Sao Paulo")
print(f"Endereco imutavel: {e}")

⚡ Nível 3: Integração

Problema 08.3 — Validação Pós-Inicialização com post_init em Dataclasses

Contexto: Validação Pós-Inicialização com post_init em Dataclasses no contexto de Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True).

Requisitos de Execução:

  1. Executar validação de regras de negócio complexas após a construção dos campos.

Resultado Esperado

Regra de negócio validada no ciclo de vida __post_init__ da dataclass.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_3_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True)
🔑 Gabarito de Código & Solução Comentada
from dataclasses import dataclass

@dataclass
class ItemFatura:
    descricao: str
    quantidade: int
    preco_unitario: float

    def __post_init__(self) -> None:
        if self.quantidade <= 0:
            raise ValueError("Quantidade deve ser positiva.")
        if self.preco_unitario < 0:
            raise ValueError("Preco nao pode ser negativo.")

item = ItemFatura("Teclado Mecanico", 2, 250.0)
print(f"Total do item: R$ {item.quantidade * item.preco_unitario:.2f}")

🏆 Nível 4: Desafio Corporativo

Problema 08.4 — Campos com Valores Padrão Mutáveis usando field(default_factory=…)

Contexto: Campos com Valores Padrão Mutáveis usando field(default_factory=…) no contexto de Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True).

Requisitos de Execução:

  1. Declarar listas e dicionários padrão em dataclasses com field(default_factory=list) prevenindo bugs de referências compartilhadas.

Resultado Esperado

Prevenção do bug clássico de listas mutáveis compartilhadas entre instâncias.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_4_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True)
🔑 Gabarito de Código & Solução Comentada
from dataclasses import dataclass, field

@dataclass
class CarrinhoCompras:
    cliente_id: int
    itens: list[str] = field(default_factory=list)

c1 = CarrinhoCompras(1)
c1.itens.append("Item A")
c2 = CarrinhoCompras(2)
print(f"c1: {c1.itens} | c2: {c2.itens} (Listas independentes)")