---
# System prepended metadata

title: Leitura de UMLs

---

# Leitura de UMLs

Anotações sobre a forma correta de se fazer uma leitura de um diagrama de classes com UML.

## 1. Atributos e Métodos

Observe o diagrama abaixo:
![Atributos e Métodos](https://i.imgur.com/pCI2jw6.png)

Através dele, podemos identificar duas sessões (atributos e operações). Atributos representam variáveis de escopo de classe, e operações representam métodos e/ou funções. Ao lado de cada operação e atributo entretanto, pode-se notar um sinal que varia entre "**#**" (cerquilha), "**-**" (menos) e "**+**" (mais):
- O sinal " **-** " representa que o atributo ou operação é privado (visibilidade interna).
- O sinal " **+** " representa que o atributo ou operação é público (visibilidade externa).
- O sinal " **#** " representa que o atributo ou operação é público (visibilidade interna, e herdada por classes filhas).

----

## 2. Herança

Observe o diagrama abaixo:
![Relação de Herança](https://i.imgur.com/DGY9aCd.png)

Através de uma flecha com a ponta não-preenchida, partindo de **classe A** até **classe B**, dizemos que **classe A** é **filha** de **classe B**.
No caso acima, dizemos que a classe "**Circle**" é filho da classe "**Shape**" ─ ou que a classe "**Circle**" *extende* a classe "**Shape**".

![Relação de Herança de uma classe abstrata](https://i.imgur.com/65QAo0T.png)

Mesmo em um cenário onde a "classe pai" for abstrata e, no nosso caso, destacado por uma cor diferente, e uma informação *{abstract}* ser adicionada abaixo do nome da classe, a relação de herança permanece a mesma. "**Dog**" extende "**Animal**".

----

## 3. Agregação e Composição

No caso abaixo, a relação entre "**Carro**" e "**Motor**" é:
- Uma **Agregação** no primeiro exemplo, pois vários objetos "Carro" podem compartilhar de um mesmo "Motor";
- Uma **Composição** no segundo exemplo, pois o objeto "Carro" precisa de um "Motor" para existir.

![Agregação e Composição](https://i.imgur.com/645hVcV.png)

Apesar de serem bem parecidos, vale apena o conhecimento da diferença entre os dois tipos relações. De toda forma, tanto **Agregação** quanto **Composição** significam que a classe **Carro** não pode existir sem antes possuir uma classe **Motor** associado a ela.

----

## 4. Dependências

No caso de a classe "**Printer**" depender de "**Document**" de qualquer forma, como no exemplo, representamos esta relação da forma abaixo.

![Dependências](https://i.imgur.com/ahgxESY.png)

----

## 5. Realização

Observe o diagrama abaixo:
![Realização](https://i.imgur.com/BExR7Ty.png)

No caso acima:
- **Bluray** é uma *implementação da interface* de **ControleRemoto**;
- **Som** é uma *implementação da interface* de **ControleSom**;
- **ControleSom** é uma extenção de **ControleRemoto**, pois os dois são interfaces.

Apesar de a comunidade chamar majoritariamente essa relação de "**Implementação de Interface**", vale mencionar que o nome técnico desta relação é "**Realização**".
