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