Começando bem - Diagrama de classes
Published: 2022-07-11 23:45:32

## Introdução

Os diagramas são representações visuais de como implementar as classes de um sistema com seus atributos, métodos e relacionamentos. Tendo um diagrama de classes bem definido, é possível ter uma visão geral da implementação de um projeto, o que, por sua vez, facilitará o trabalho dos desenvolvedores por terem uma documentação clara sobre cada classe a ser implementada e como elas se relacionam entre si.

## Diagrama de classes

Utilizando a **UML** (Unified Modeling Language), conseguimos estabelecer um padrão de como desenhar esses diagramas. Cada classe se torna um bloco dividido em 3 partes: nome, atributos e métodos, podendo definir o tipo de cada atributo ou os tipos dos parâmetros e retornos dos métodos.
  
- **Nome**: será simplesmente o identificador da classe;
- **Atributos**: também chamados de propriedades, são as características que definirão o formato do objeto instanciado nessa classe. Uma classe "Vídeo" poderia ter os atributos "nome" e "duração", por exemplo.
- **Métodos**: serão as funções executadas pelos objetos dessa classe. Continuando com o exemplo da classe "Vídeo", podemos implementar os métodos "play" e "pause".
  

![Exemplo de classe em um diagrama](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eqdc8s97i3mg175t8e1g.jpg)
<figcaption>Fig.1 - Exemplo de classes descritas em um diagrama.</figcaption>

Perceba que, antes de qualquer atributo ou método, é possível ver alguns sinais. Eles servem para indicar o tipo de encapsulamento de cada item, ou seja, de que forma ele será visível para outras classes do sistema.

- **+**: público. Qualquer classe pode acessar o método ou atributo. É mais comumente utilizado para métodos.
- **-**: privado. Nenhuma classe, que não seja ela própria, pode acessar o método ou atributo. Geralmente utilizado em atributos.
- **#**: protegido. A visibilidade protegida permite a utilização dos elementos apenas pela própria classe ou suas subclasses.

Além disso, as classes também podem interagir entre si por meio de relacionamentos, definindo como será feita a interação entre elas. Nesse caso, teremos:
  
- **Herança**: quando uma classe herda atributos ou métodos de outra classe mais abstrata/genérica. Uma classe "Tartaruga" pode implementar atributos e métodos da classe abstrata "Animal".

- **Associação**: um relacionamento simples e direto que pode ser descrito como uma ação. Uma classe "Pessoa" pode usar o método "play" da classe "Vídeo".

- **Composição**: uma classe depende da outra para existir. Um objeto da classe "Pedido" só pode existir enquanto houver um objeto da classe "Cliente" vinculado.

- **Agregação**: uma classe que também depende de outra, mas que não será destruída quando a classe pai não tiver mais nenhum objeto. Exclua os objetos da classe "Sala de aula" e os objetos da classe "Aluno" continuarão existindo.


![Tipos de relacionamento entre classes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ahcs5veyepp2gijey1bm.png)
<figcaption>Fig.2 - Tipos de relacionamento entre classes.</figcaption>

Todos esses relacionamentos também indicam quantos objetos de cada classe estarão envolvidos.

- **1**: apenas 1 objeto pode existir no relacionamento. Uma classe "Pedido" só pode estar vinculada a uma classe "Cliente.
- **1..***: inferência de, no mínimo um objeto no relacionamento, mas podendo ter vários. Uma classe "Pedido" tem que ter, no mínimo um objeto de "Item comprado", mas pode ter vários itens em um pedido.
- **0..***: no máximo vários, mas no mínimo nenhum. Uma classe "Pessoa" pode ter vários objetos "Pedido", assim como nenhum.
- **n**: "n" é um valor arbitrário que pode ser especificado por quem desenha o diagrama, sendo definido pela necessidade do projeto (1, 5, 2584...).

![Cardinalidade entre classes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o31083j4eifgsmnyqhl0.png)
<figcaption>Fig.3 - Exemplos de cardinalidade.</figcaption>
  
Com isso, temos tudo que é necessário para começar a construir nossos primeiros diagramas de classes. Não deixe de dar feedbacks ou sugestões para os próximos tópicos.