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 vários
Dispositivos. Para modelar isso, o agregado (Departamento) tem uma associação de agregação para as
partes constituintes (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
também têm endereços também.
Um objeto agregado pode manter outros objetos juntos.
Um relacionamento de agregação que tem multiplicidade maior que uma estabelecida para o agregado é chamado de
compartilhado e destruir o agregado não destrói necessariamente 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 Interface com o Cliente sabe quais objetos Vídeo, Impressora de Recibos, KeyPad e
Alto-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 consista 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 é composta
de si mesma, e sim que uma instância da classe é um composto agregado 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 a 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).
|