Diretriz: Agregação
A agregação modela um relacionamento de composição entre os elementos de modelo. Esta diretriz demonstra como utilizar esse relacionamento.
Relacionamentos
Descrição Principal

Agregação

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.

Exemplo de Agregação

Um objeto agregado pode manter outros objetos juntos.

Agregação Compartilhada

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.

Exemplo de Agregação

Um exemplo de agregação compartilhada.

Composição

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:

Agregação de Composição

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 exemplo de agregação de composição

Um objeto Interface com o Cliente sabe quais objetos Vídeo, Impressora de Recibos, KeyPad e Alto-falante pertencem a ele.

Utilizando a Composição para Modelar Propriedade de Classes

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 modeladas utilizando a agregação

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 modeladas utilizando atributos

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.

Agregação ou Associaçã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.

Auto-agregações

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:

Exemplo de auto-agregação

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).