📐 ATIVIDADE 07: DIAGRAMA DE CLASSES (UML)
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
- Nome: Sempre substantivo e no singular (Ex:
Motorista). - Atributos (Dados): O que ele sabe? (Ex:
- cnh: String). - Métodos (Ações): O que ele faz? (Ex:
+ validarDocumento()).
📊 Visualizando a Lógica
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 (+).
📖 Exemplo Guiado
Abaixo, veja como mapear as entidades da TecProExpress para classes UML.
| Passo | Pergunta do Arquiteto | Tradução UML |
|---|---|---|
| 01 | O que um 'Pacote' tem? | Atributos: -id, -peso, -status. |
| 02 | O que o 'Pacote' faz? | Métodos: +calcularFrete(), +atualizarStatus(). |
| 03 | Como 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
🛠️ 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.
- Identifique as 5 principais entidades do seu sistema (ex: Usuário, Produto, Pedido, Categoria, Endereço).
- Utilizando uma ferramenta UML (Astah, Lucidchart ou Draw.io), desenhe o diagrama.
- Cada classe deve conter pelo menos 3 atributos e 2 métodos.
- 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:
- Salve o arquivo de documentação com o nome
Atividade_07.mde a imagem do seu diagrama de classes com o nomeAtividade_07.pngna pastaes-atv-07-classes/do seu repositório GitHub. - Certifique-se de fazer o commit e push para o repositório público.
- Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.
💡 Checkpoint de Lógica
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. |