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