É o principal diagrama da UML
Descreve a estrutura do sistema por meio de Classes e outras entidades do sistema, bem como os relacionamentos entre essas entidades
Observação: Se você ainda não está familiarizado com o conceito de Classes, veja esta aula sobre Introdução à Orientação a Objetos.
O Diagrama de Classes permite visualizar sistemas graficamente. Apresentar ideias complexas em forma visual é importante porque nossos cérebros podem processar imagens mais rapidamente do que outros tipos de informação.
Com o Diagrama de Classes é possível:
Ajudar desenvolvedores a pensar sobre a estrutura e as interações das classes antes de escrever qualquer código. Isso pode levar a um software mais limpo e com melhor funcionamento;
Representar requisitos elicitados que precisam ser incluídos no código;
Compartilhar informações com as partes interessadas mais facilmente com apresentações visuais sem mergulhar no código.
Identificar e corrigir possíveis áreas problemáticas do sistema, antes que erros aconteçam;
Gerar código para linguagens orientadas a objetos, como Java, Python, C++, etc.
Representa o conceito de um conjunto de objetos que possuem a mesma estrutura: características (atributos) e comportamentos (métodos, que são chamados de operações).
Representação: Um retângulo que contém 3 compartimentos: nome da classe com inicial maiúscula, lista de atributos e lista de operações.
Composição de uma Classe em UML
Atributos são as propriedades de uma determinada classe
Ex.: Classe Pessoa – Atributos: idade, nome, gênero, etc.
Todo atributo possui um tipo
O tipo pode ser primitivo (ex.: int, float, boolean,...)
Ou complexo / não primitivo (ex.: String, Class, Pessoa,...)
Representação:
<<estereotipo>> visibilidade nomeDoAtributo : tipoDoAtributo = valorInicial
O estereótipo e o valor inicial de um atributo é um elemento opcional.
São ações que os objetos daquela classe poderão executar
Ex.: Classe Pessoa – Operações: andar, falar, comer, etc.
Equivalem aos métodos
Representação:
<<estereotipo>> visibilidade nomeDaOperação(listaDeParâmetros) : tipoDeRetorno
O estereótipo e a lista de parâmetros de uma operação é um elemento opcional.
O nome de uma classe deve ser descritivo e ter significado, identificando claramente pelo que cada classe é responsável.
Adicione apenas atributos e operações relevantes a cada classe. Adicionar atributos e operações desnecessárias pode fazer com que seu diagrama pareça confuso e excessivamente complicado.
Define qual entidade pode acessar aquele elemento. Há 4 tipos de visibilidade:
- private - privado
# protected - protegido
~ package - pacote
+ public - público
Privado (-):
O elemento privado só é
acessível pelas operações
do objeto. Normalmente este é o
estado inicial dos atributos, depois
se necessário, pode ser modificado.
Protegido (#):
O elemento só pode ser acessado por uma classe que tenha uma relação de generalização/herança,
independente do pacote.
Pacote (~):
O elemento pode ser acessado por
qualquer outra classe no mesmo pacote.
Público (+):
O elemento pode ser acessado por
qualquer outra classe do sistema.
As Classes em UML podem representar abstrações específicas, que serão notadas visualmente ou marcadas com estereótipo antecedendo o nome da classe.
Os tipos de classes mais comuns são listados a seguir.
Uma classe abstrata não é instanciada no sistema
Geralmente está envolvida em um relacionamento de herança, onde desempenha o papel de classe “mãe”/superclasse
Representação: O nome da Classe aparece em itálico. Estereótipo: <<abstract>>
É muito útil adicionar ao diagrama uma classe que representa o sistema como um todo, atuando, por exemplo, como a classe principal do sistema, ela representa a conexão entre a interface do sistema e as operações de objetos.
Representação: um círculo com uma seta. Estereótipo: <<control>>
Uma Interface não é uma Classe, ou seja, é um outro tipo de entidade similar a Classe, mas que não pode ser instanciada.
Assim como as classes, uma interface pode ser composta por atributos e métodos.
Todos os métodos de uma interface são públicos. Uma interface pode ter métodos abstratos e concretos.
Todo atributo em uma interface é público, final e estático.
Ela não pode ser instanciada e deve ter pelo menos uma classe que descreva todos os corpos das suas operações
Classes podem implementar mais de uma interface ao mesmo tempo (implements)
Uma interface pode estender o comportamento de outra interface (extends)
Veja mais sobre interfaces em Interfaces.
Representação: um Círculo. Estereótipo: <<interface>>
Uma enumeração, também conhecida como "enum", é um tipo de dado em algumas linguagens de programação que consiste em um conjunto de constantes nomeadas.
As constantes de uma enumeração são valores fixos e predefinidos, e cada constante é referenciada pelo seu nome na enumeração. Estas constantes são chamadas de Literais.
As enumerações são usadas para representar um conjunto fixo de valores que não devem ser alterados durante a execução do programa, como os dias da semana, meses do ano, etc.
Representação: uma caixa de dois compartimentos com o estereótipo <<enumeration>> e uma lista de valores literais
São utilizados para agrupar um conjunto de classes
Propósitos:
Organização
Políticas de acesso
Representação: uma pasta de arquivos com classes no seu interior
Os tipos de relacionamentos entre Classes são:
Associação
Generalização
Composição
Agregação
Realização
Classe de Associação
Dependência
Todo relacionamento pode ter um nome que fica localizado no meio da reta que traça a relação destino x origem da relação.
Representa a relação de uma classe com outra
É representado por uma reta
Somente classes que estão relacionadas podem se comunicar
O papel que a classe desempenha na relação deve ser identificado na extremidade da reta
Um conceito pode estar associado a outro conceito de diversas formas diferentes, para isto utilizamos associações com papéis
É possível o auto-relacionamento de associação.
É preciso entender a granularidade das associações dentro do cenário modelado
A MULTIPLICIDADE da relação de associação é o elemento responsável por definir a quantidade de instâncias possíveis de determinada classe dentro de uma relação - é semelhante ao conceito de cardinalidade em Banco de Dados.
0..1
1
0..*
1..*
*
Outros exemplos:
2..5
2,5..8
Etc.
Indica um relacionamento do tipo “é um”
Representa a herança entre conceitos
Uma superclasse é relacionada a uma subclasse que irá estender a superclasse
A superclasse pode ser abstrata, ou seja, não poderá ser instanciada
Uma subclasse não pode ter mais de uma superclasse
Uma superclasse pode ter várias subclasses
É representada por uma seta larga que aponta para a superclasse
Evite utilizar a generalização quando as subclasses não possuem atributos ou associações que os diferenciem
Indica um relacionamento do tipo “é composto de”
Funciona como uma relação todo-parte onde as partes não existem sem o todo
A remoção do todo implica na remoção das partes
É representado por uma reta com um losango preenchido na parte do todo
Indica um relacionamento do tipo “contém”/“agrega”
Funciona como uma relação todo-parte onde o todo existe sem as partes e as partes existem sem o todo
A remoção do todo implica não implica na remoção das partes
É representado por uma reta com um losango sem preenchimento na parte do todo
A multiplicidade na agregação é sempre 0..1 ou 1
A multiplicidade na composição é sempre 1
A composição indica exclusividade na relação.
É similar a generalização, mas trabalha com interfaces ao invés de superclasses.
Indica que a classe implementa a interface.
Representado por uma reta tracejada com ponta fechada
Ex.: Todas as operações definidas em Modelo devem ser implementadas em Carro e todas as características de Modelo serão herdadas por Carro
É um recurso a nível de modelo e sua aplicação não é recomendada atualmente
Permitem a adição de informações em uma associação
Devem ser transformadas em classes comuns posteriormente para viabilizar implementação
Representado por uma reta tracejada com ponta aberta
Deixa explícito que mudanças em uma classe podem gerar consequências em outra classe, por exemplo:
– Uma classe tem operações que esperam como parâmetro outra classe (emprestaLivro)
– Uma classe tem operações que retornam outra classe (consultaLivro)
– Uma classe utiliza a outra na implementação de sua operação (cadastraLivro)
Comece identificando os conceitos e características, ou seja, as classes e seus atributos.
O processo de identificação dos conceitos e atributos, então, consiste em:
identificar no texto dos casos de uso as palavras ou sintagmas que correspondem a conceitos sobre os quais se tem interesse em manter informação no sistema;
agrupar as palavras ou expressões que são sinônimos, como, por exemplo, “compra” e “aquisição”, “comprador” e “cliente” etc.;
identificar quais dos itens considerados correspondem a conceitos complexos e quais são meros atributos. Os atributos são aqueles elementos que podem ser considerados alfanuméricos, usualmente: nomes, números em geral, códigos, datas, valores em moeda, valores booleanos (verdadeiro ou falso) etc.
Identifique as demais entidades do sistema ou que interagem com o sistema.
Identifique as classes que precisam se comunicar e atribua associações para elas.
Reflita sobre a navegabilidade das associações e sobre as multiplicidades de papéis das associações entre classes.
Identifique relacionamentos complexos como generalização, agregação, composição, etc e substitua as associações quando for o caso.
Inclua as operações de cada classe quando necessário.