Artefatos >
Conjunto de Artefatos de Análise e Design >
Modelo de Design... >
Modelo de Design >
Diretrizes >
Agregação
Diretrizes:
|
|
|
Uma agregação é uma forma especial de associação que modela um relacionamento de inclusão entre um agregado (o todo) e suas partes. |
A agregação é usada para modelar um relacionamento de composição entre elementos do modelo. Podem haver muitos exemplos de relacionamento de composição: uma Biblioteca contém Livros; dentro de uma empresa, Departamentos são constituídos de Funcionários; um Computador é formado por vários Dispositivos. Para modelar isso, o (Departamento) agregado possui uma associação de agregação com suas 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
Nesse exemplo, um Cliente possui um Endereço. Usamos agregação, pois as duas classes representam parte de um todo maior. Também escolhemos modelar Endereço como uma classe separada, já que muitos outros elementos possuem endereços também.

Um objeto agregado pode manter outros objetos juntos.
Um relacionamento de agregação que possua uma multiplicidade maior que a estabelecida para o agregado é denominado compartilhado. A destruição do 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. Tanto a Pessoa como a Empresa possuem um endereço. Na realidade, é 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 do agregado (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 os "galhos" formando as partes.
Use uma agregação de composição em vez de uma agregação "simples" quando existir relacionamento de interdependência total entre o agregado e as partes, no qual a definição do agregado ficaria incompleta sem as partes. No exemplo apresentado abaixo, faz sentido ter um Pedido mesmo que houver nada esteja 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
Nesse exemplo, a Interface do Cliente é composta por várias outras classes. As multiplicidades das agregações ainda não estão especificadas.

O objeto Interface do Cliente sabe quais objetos Vídeo, Impressora de Recibo, Teclado Numérico e Alto-falante pertencem a ele.
A propriedade de uma classe é algo que a classe conhece. Como no caso da classe Cliente mostrada acima, é possível modelar o Endereço do Cliente como uma classe (como já 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:
Exemplo
Em um Caixa Eletrônico, o sistema precisa se manter informado sobre os clientes atuais e seus números de identificação pessoal. Vamos supor que a Interface do 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 - fazer com que a Interface do Cliente se mantenha informada sobre os Clientes atuais e seus números de identificação pessoal através de atributos - é modelada da seguinte forma:

Propriedades de Objeto modeladas usando Atributos
A decisão de usar atributos ou uma associação de agregação para uma classe separada é determinada com base no grau de acoplamento entre os conceitos que estão sendo representados. Quando os conceitos que estão sendo modelados estiverem intrinsecamente conectados, use atributos. Quando houver alguma possibilidade de que os conceitos sejam alterados de forma independente, use agregação.
A agregação deve ser usada somente nos casos em que haja um relacionamento de composição entre classes, em que uma classe seja composta de outras classes, em que as "partes" fiquem incompletas fora do contexto do todo. Considere o caso de um Pedido. Não faz sentido ter um pedido que esteja "vazio" e que não consista em "nada". O mesmo vale para todos os agregados: Departamentos devem ter Funcionários, 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 auto-agregação a seguir que envolve 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, ou seja, os subprodutos não sabem de quais produtos eles fazem parte (já que podem fazer parte de muitos produtos).
|
Rational Unified Process |