🧩 Exercícios: Modelagem Rica de Domínio: Enum, Composição e Dataclasses (slots=True)
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:
- Declarar enum de perfis de usuário com
StrEnumgarantindo 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)
- Salve o arquivo como:
Atividade_08_1_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_08_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_08_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_08_4_SeuNome - 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)")