Diretrizes: Agregação
Tópicos
A agregação é usada para modelar um relacionamento de composição entre elementos do modelo.
Há muitos exemplos de relacionamentos de composição: uma Biblioteca
contém Manuais, dentro de uma empresa os Departamentos
são compostos de Funcionários, um Computador é
composto de um número de Dispositivos. Para modelar isso, o agregado (Departamento)
tem uma associação de agregação para as partes integrantes (Funcionário).
Um losango vazado é anexado à extremidade de um caminho de associação ao lado do agregado (o todo) para indicar agregação.
Exemplo
Neste exemplo, um Cliente tem um Endereço.
Usamos agregação, pois as duas classes representam parte de um todo maior.
Escolhemos também modelar o Endereço como uma classe separada, já que muitos
outros tipos de itens têm endereços também.

Um objeto agregado pode manter outros objetos juntos.
Um relacionamento de agregação que tem multiplicidade maior que um estabelecida
para o agregado é chamado de compartilhado e destruir o agregado
não necessariamente destrói as partes. Por dedução, uma agregação compartilhada forma um gráfico ou uma árvore com várias raízes.
As agregações compartilhadas são usadas em casos em que haja um forte relacionamento entre duas classes, para que a mesma instância possa participar de duas agregações diferentes.
Exemplo
Considere o caso em que uma pessoa possui uma empresa em casa.
A Pessoa e o Negócio têm um endereço, na verdade, é o mesmo
endereço. O Endereço é parte integrante tanto da Pessoa como da Empresa.
Mesmo que a Empresa deixe de existir, espera-se que a Pessoa continue no mesmo endereço.
Observe também que, nesse caso, a agregação compartilhada pode ser iniciada e convertida mais tarde em agregação não-compartilhada.
A empresa sediada em casa pode crescer e prosperar, podendo até mesmo acabar ocupando uma sede separada.
Nesse instante, a Pessoa e a Empresa não compartilham mais o mesmo endereço.
Conseqüentemente, a agregação não é mais compartilhada.

Um exemplo de agregação compartilhada.
Composição é uma forma de agregação com propriedade total e vida útil coincidente como parte do agregado. A multiplicidade da extremidade agregada (no exemplo, o Pedido) pode não exceder um
(ou seja, não pode ser compartilhada). A agregação também é inalterável, ou seja, depois de estabelecida, seus links não podem ser alterados.
Por dedução, uma agregação composta forma uma "árvore" de partes, com a raiz sendo o agregado e
as "ramificações" as partes.
Uma agregação de composição deve ser utilizada em vez de uma agregação "simples" quando existir relacionamento de interdependência total entre o agregado e as partes, em que a definição do agregado fica incompleta sem as partes. No exemplo apresentado a seguir, faz sentido até ter um Pedido
se nada estiver sendo pedido (ou seja, Itens de Linha). Em alguns casos, a interdependência pode ser identificada desde a análise (como no caso desse exemplo), mas o mais comum é que tais decisões só possam ser tomadas com segurança após o design.
Um losango totalmente preenchido é anexado à extremidade de um caminho de associação para indicar composição, como mostrado a seguir:

Um exemplo de agregação de composição.
Exemplo
Neste exemplo, a Interface com o Cliente é composta
de várias outras classes. As multiplicidades das agregações ainda não estão especificadas.

Um objeto de Interface com o Cliente sabe quais objetos de Vídeo,
Impressora de Recibo, Teclado e Falante
pertencem a ele.
A propriedade de uma classe é algo que a classe conhece.
Como no caso da classe Cliente mostrada anteriormente, é possível optar por modelar
o Endereço do Cliente como uma classe, como mostramos, ou como um conjunto de atributos
da classe. A decisão sobre usar um conjunto de atributos ou uma classe e a relação de agregação depende dos seguintes itens:
- As 'propriedades' precisam ter identidade independente, fazendo com que vários objetos as usem como referência?
Nesse caso, use uma classe e agregação.
- Várias classes precisam ter as mesmas 'propriedades'?
Nesse caso, use uma classe e agregação.
- As 'propriedades' possuem uma estrutura complexa e propriedades próprias?
Nesse caso, use uma classe (ou classes) e agregação.
- Caso contrário, use atributos.
Exemplo
Em um Caixa Eletrônico, o sistema deve
controlar o cliente atual e seu número de identificação pessoal, vamos supor que a Interface com o
Cliente seja responsável por isso. Essas informações podem ser vistas como
"propriedades" da classe. Isso pode ser feito usando uma classe separada, como mostrado abaixo:

Propriedades de objeto modeladas através de Agregação
A alternativa, fazendo com que a Interface com o Cliente
controle o Cliente atual e seu número de identificação pessoal utilizando atributos, é modelada da seguinte
forma:

Propriedades de Objeto modeladas usando Atributos
A decisão de utilizar atributos ou uma associação de agregação para uma classe
separada é determinada com base no grau de agrupamento entre os conceitos sendo
representados: quando os conceitos sendo modelados estão estritamente conectados, utilize
atributos. Quando houver alguma possibilidade de que os conceitos sejam alterados de forma independente, use agregação.
A agregação deve ser utilizada somente nos casos em que há um relacionamento de composição
entre as classes, onde uma classe é composta por outras classes,
em que as "partes" são incompletas fora do contexto geral.
Considere o caso de um Pedido: não faz sentido ter um pedido
que esteja "vazio" e consiste em "nada". O mesmo
é verdadeiro para todos os agregados: Os Departamentos devem ter Funcionários, as Famílias devem ter Membros
da Família e assim por diante.
Se as classes puderem ter identidade independente fora do contexto fornecido por outras classes e se elas não forem partes de algum todo maior, o relacionamento de associação deve ser usado.
Quando estiver em dúvida, lembre-se de que uma associação é sempre mais adequada. As agregações geralmente são óbvias e a escolha da agregação é feita somente para ajudar a esclarecer.
Não é algo vital para o sucesso do esforço de modelagem.
Algumas vezes, uma classe pode ser agregada a ela mesma.
Isso não significa que uma instância dessa classe seja formada por si própria (isso seria tolice), mas sim que uma instância da classe é um agregado composto de outras instâncias da mesma classe.
No caso de auto-agregações, nomes de papéis são essenciais para distinguir a finalidade da associação.
Exemplo
Considere a seguinte auto-agregação envolvendo a classe Produto:

Nesse caso, um produto pode ser formado por outros produtos. Quando isso acontece, os produtos agregados são denominados subprodutos.
A associação é navegável somente do agregado para o subproduto; por exemplo, os subprodutos não saberiam de quais produtos fazem parte (já que podem fazer parte de muitos produtos).
|