# 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:

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:

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**".

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.

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.

----
## 5. Realização
Observe o diagrama abaixo:

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**".