Capítulo 08: Modelagem Rica de Domínio: Enumerações (Enum), Composição e Dataclasses (slots=True)
Especialização em Sistemas com Python & POO com Type Hints • Capítulo 08
🗺️ Mapa Conceitual do Tópico
classDiagram
class StatusContrato {
<<enumeration>>
RASCUNHO
EM_VIGENCIA
SUSPENSO
FINALIZADO
}
class Contratante {
+str razao_social
+str cnpj
}
class ContratoCorporativo {
+str id_contrato
+Contratante contratante
+Decimal valor_mensal
+StatusContrato status
+ativar() void
}
ContratoCorporativo o-- Contratante : Composição (Tem-Um)
ContratoCorporativo --> StatusContrato : Estado Semântico
✨ 1. Modelagem Rica com enum.Enum e Composição
- Enumerações (
Enum): Substituem constantes mágicas por tipos semânticos imutáveis e comparáveis por identidade (is). - Composição (“Tem-Um”): Estrutura objetos complexos agrupando referências a outras entidades, garantindo baixo acoplamento e alta coesão.
🚀 2. Dataclasses Modernas (@dataclass(slots=True, frozen=True))
Introduzidas na PEP 557 e otimizadas no Python 3.10+, dataclasses eliminam o código repetitivo de __init__, __repr__ e __eq__. Com slots=True, o interpretador não aloca o dicionário interno __dict__, gerando economia de até 40% de memória RAM.
💻 Exemplo Prático e Tipado
"""
exemplo_08_modelagem_de_dominio_e_dataclasses.py - Contratos com Enums e Dataclasses
"""
from dataclasses import dataclass
from decimal import Decimal
from enum import Enum, auto
class StatusContrato(Enum):
RASCUNHO = auto()
VIGENTE = auto()
CANCELADO = auto()
@dataclass(frozen=True, slots=True)
class ClienteCorporativo:
cnpj: str
razao_social: str
email_contato: str
@dataclass(slots=True)
class ContratoB2B:
id_contrato: str
cliente: ClienteCorporativo
valor_mensal: Decimal
status: StatusContrato = StatusContrato.RASCUNHO
def ativar_contrato(self) -> None:
if self.status != StatusContrato.RASCUNHO:
raise ValueError("Apenas contratos em rascunho podem ser ativados.")
self.status = StatusContrato.VIGENTE
if __name__ == "__main__":
cli = ClienteCorporativo(cnpj="12.345.678/0001-90", razao_social="Tech Solutions SA", email_contato="corp@tech.com")
contrato = ContratoB2B(id_contrato="CT-2026-001", cliente=cli, valor_mensal=Decimal("8500.00"))
print(f"Contrato : {contrato.id_contrato} | Cliente: {contrato.cliente.razao_social}")
print(f"Status : {contrato.status.name}")
contrato.ativar_contrato()
print(f"Novo Status: {contrato.status.name}")
🔗 Recursos Pedagógicos do Capítulo 08
| Recurso Didático | Finalidade | Link de Acesso |
|---|---|---|
| 📊 Slides de Aula | Apresentação visual interativa com Dark Mode e suporte a teclado | Ver Slides |
| 🧠 Quiz Formativo | Teste interativo de fixação com feedback imediato por alternativa | Fazer Quiz |
| 💻 Exemplos de Código | Demonstrações funcionais com Type Hints e saída no console | Ver Exemplos |
| 🧩 Exercícios em 4 Níveis | Lista progressiva de fixação com gabarito em bloco colapsável | Resolver Exercícios |
| 📅 Capítulo Anterior | 📚 Sumário de Tópicos | 🧬 Próximo Capítulo |