📐 ATIVIDADE 07: DIAGRAMA DE CLASSES (UML)

📖 Fundamentação Teórica

Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 07: ESPECIFICAÇÃO DE REQUISITOS (ERS)

Bem-vindo a mais uma etapa da sua jornada no curso de Gestão de TI / Desenvolvimento de Sistemas. Hoje vamos mergulhar em conceitos que conectam a teoria técnica diretamente com o padrão de excelência da arquitetura de software, criando o guia mestre para a implementação do código. 🛡️🧩


🎯 Objetivos de Aprendizagem do Laboratório

Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:

  • Definir Atributos (o que o objeto guarda) e Métodos (o que o objeto faz).
  • Aplicar modificadores de Visibilidade (Público +, Privado -, Protegido #) baseados no princípio do Encapsulamento.
  • Modelar Associações e multiplicidade (1:1, 1:N, N:N).
  • Identificar oportunidades de Herança para otimização de código.

🏢 O Cenário Prático (Seu Desafio)

Na TecProExpress, os protótipos (Atividade 06) foram aprovados! Agora, o time de desenvolvimento backend (Java/C#/Python) precisa saber: "Como os dados serão organizados no código? Quais são as classes e como elas se conectam?".

Se você apenas disser "Cria uma tabela de motorista", o programador pode esquecer de validar se o motorista tem uma CNH válida ou se ele pode ter vários veículos associados a ele.

"Seu desafio é atuar como Arquiteto de Software. Você deve desenhar o Diagrama de Classes, que é o mapa estrutural que diz ao programador exatamente quais variáveis e funções ele deve criar para que o sistema suporte toda a lógica de logística da TecProExpress."


🧠 Fundamentos: A Teoria Traduzida

O Diagrama de Classes mostra a "foto" parada do sistema. Se o software fosse um prédio, o Diagrama de Classes seria a planta estrutural das paredes e colunas.

Anatomia da Classe

  1. Nome: Sempre substantivo e no singular (Ex: Motorista).
  2. Atributos (Dados): O que ele sabe? (Ex: - cnh: String).
  3. Métodos (Ações): O que ele faz? (Ex: + validarDocumento()).

📊 Visualizando a Lógica

Dica

Visibilidade: Por padrão, atributos são sempre Privados (-). Isso protege os dados contra alterações acidentais externas. Somente métodos de acesso (Getters/Setters) ou ações explícitas devem ser Públicos (+).

```mermaid classDiagram class Motorista { -String nome -String cnh +validarCnh() bool } class Veiculo { -String placa -String modelo } Motorista "1" -- "*" Veiculo : dirige ```

📖 Exemplo Guiado

Abaixo, veja como mapear as entidades da TecProExpress para classes UML.

PassoPergunta do ArquitetoTradução UML
01O que um 'Pacote' tem?Atributos: -id, -peso, -status.
02O que o 'Pacote' faz?Métodos: +calcularFrete(), +atualizarStatus().
03Como ele se conecta?Um Motorista leva Muitos Pacotes (1:N).

📊 Graus de Acoplamento e Relacionamentos entre Classes

flowchart LR
    A["Associação Simples<br/>(Uso comum - Acoplamento fraco)"] -->|Motorista - Veiculo| B["Ex: Um motorista dirige um veículo"]
    C["Agregação<br/>(Todo/Parte - Partes vivem sem o todo)"] -->|Pedido - Cliente| D["Ex: Cliente possui pedidos, mas cliente existe sem o pedido"]
    E["Composição<br/>(Todo/Parte rígido - Partes morrem com o todo)"] -->|Pedido - ItemPedido| F["Ex: Pedido possui itens de pedido, se o pedido morre, itens morrem"]

    style A fill:#eceff1,stroke:#607d8b
    style C fill:#e1f5fe,stroke:#0288d1
    style E fill:#ffebee,stroke:#c62828

Diagrama de Classes TecProExpress (UML)

🛠️ Estrutura de Atributo e Método

  • Atributo: - salario: Double = 1412.00
    • -: Privado.
    • salario: Nome.
    • Double: Tipo do dado.
    • = 1412.00: Valor padrão.
  • Método: + calcularIdade(dataNasc: Date): Int
    • +: Público.
    • dataNasc: Date: Parâmetro de entrada.
    • : Int: O que o método devolve (Tipo de retorno).

🔍 Detalhamento do Processo:

  • Note que no Diagrama de Classes não colocamos "clicar no botão". Colocamos a lógica do objeto. Se o botão na tela chama uma função de salvar, o método salvar() deve estar na Classe.

🛠️ Prática Obrigatória 1: O Diagrama de Classes

Cenário: O projeto semestral da sua equipe.

  1. Identifique as 5 principais entidades do seu sistema (ex: Usuário, Produto, Pedido, Categoria, Endereço).
  2. Utilizando uma ferramenta UML (Astah, Lucidchart ou Draw.io), desenhe o diagrama.
  3. Cada classe deve conter pelo menos 3 atributos e 2 métodos.
  4. Defina as multiplicidades corretamente (ex: Um cliente tem 0 ou N pedidos).

🏁 Resultado Esperado (Para sua Referência)

Uma imagem (PNG/JPG) do diagrama contendo as 5 classes conectadas, com tipos de dados e visibilidade (+ e -) aplicados.


💻 Implementação Orientada a Objetos em Python

Para materializar o seu Diagrama de Classes UML em código fonte executável com encapsulamento, execute a classe de domínio:

# modelo_classes.py
from datetime import datetime, timezone
from typing import Any

class EntregaPacote:
    def __init__(self, id_pacote: str, destinatario: str, peso_kg: float) -> None:
        self._id_pacote: str = id_pacote # Atributo Privado (-)
        self._destinatario: str = destinatario
        self._peso_kg: float = peso_kg
        self._status: str = "PENDENTE"
        self._data_criacao: datetime = datetime.now(timezone.utc)

    # Métodos Públicos (+)
    @property
    def status(self) -> str:
        return self._status

    def despachar_entrega(self) -> None:
        if self._status != "PENDENTE":
            raise ValueError("Apenas pacotes pendentes podem ser despachados.")
        self._status = "EM_TRANSITO"
        print(f"📦 Pacote {self._id_pacote} para '{self._destinatario}' despachado com sucesso!")

    def __repr__(self) -> str:
        return f"EntregaPacote(id={self._id_pacote}, dest='{self._destinatario}', status='{self._status}')"

if __name__ == "__main__":
    print("=" * 65)
    print("🏛️ DOMÍNIO ORIENTADO A OBJETOS (UML -> PYTHON) - TECPROEXPRESS")
    print("=" * 65)

    pkg = EntregaPacote("BR778899", "Hospital São Lucas", peso_kg=4.5)
    print(f"Instância Criada: {pkg}")
    print(f"Status Inicial Encapsulado: {pkg.status}")

    # Executando transição de método
    pkg.despachar_entrega()
    print(f"Status Atualizado: {pkg.status}")
    print("=" * 65)

🖥️ Saída Esperada no Terminal:

=================================================================
🏛️ DOMÍNIO ORIENTADO A OBJETOS (UML -> PYTHON) - TECPROEXPRESS
=================================================================
Instância Criada: EntregaPacote(id=BR778899, dest='Hospital São Lucas', status='PENDENTE')
Status Inicial Encapsulado: PENDENTE
📦 Pacote BR778899 para 'Hospital São Lucas' despachado com sucesso!
Status Atualizado: EM_TRANSITO
=================================================================

🌐 Exemplo de Payload JSON para Instanciação de Entidade (Swagger /docs)

{
  "id_pacote": "BR778899",
  "destinatario": "Hospital São Lucas",
  "peso_kg": 4.5,
  "endereco_entrega": {
    "rua": "Av. Brasil",
    "numero": 1500,
    "cidade": "São Paulo",
    "cep": "01430-000"
  },
  "prioridade_urgente": true
}

📤 Instruções de Entrega (Microsoft Teams)

Após validar suas documentações técnicas:

  1. Salve o arquivo de documentação com o nome Atividade_07.md e a imagem do seu diagrama de classes com o nome Atividade_07.png na pasta es-atv-07-classes/ do seu repositório GitHub.
  2. Certifique-se de fazer o commit e push para o repositório público.
  3. Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.

💡 Checkpoint de Lógica

Importante

Reflexão Profissional: Se você tem uma classe Funcionario e uma classe Gerente, e percebe que ambas têm os atributos nome, cpf e telefone, qual conceito de Orientação a Objetos você aplicaria para não precisar repetir esse código duas vezes? (Resposta: Herança. Você criaria uma classe pai 'Pessoa' e as outras herdariam dela). 🧠🛡️

---

📊 Rubrica Formativa de Avaliação

Critério de Avaliação Insuficiente (0% - 40%) Regular (41% - 70%) Excelente (71% - 100%)
Diagrama de Classes (UML) Menos de 5 classes ou sem tipos de dados nos atributos. Mapeia 5 classes mas sem multiplicidades ou sem visibilidade. Diagrama de classes impecável com 5 entidades, atributos com visibilidade (+/-), métodos e multiplicidades corretas.
Justificativa de Encapsulamento Deixa todos os atributos como públicos sem justificativa. Justifica superficialmente sem explicar o papel dos getters/setters. Justificativa técnica sólida de encapsulamento protegendo a integridade dos dados da classe.
Entrega no GitHub Entrega fora da pasta `es-atv-07-classes/`. Entrega apenas o texto sem o arquivo `.png` da modelagem. Submete `Atividade_07.md` e `Atividade_07.png` no repositório com formatação validada.