Diretrizes: Associação
Tópicos
As associações
representam relacionamentos estruturais entre objetos de classes diferentes, representam
conexões entre instâncias de duas ou mais classes que existem por algum tempo.
Compare isso com links transientes que, por exemplo, existem somente durante uma operação.
Essas situações podem também podem ser modeladas através de colaborações, nas quais os links existem somente em determinados contextos limitados.
É possível utilizar
associações para mostrar que os objetos têm conhecimento de outros objetos. Às vezes, os objetos
devem guardar referências entre si para conseguirem iteragir, por exemplo, enviar mensagens
uns para os outros; assim, em alguns casos, as associações podem surgir de padrões de interação
em diagramas de seqüência ou diagramas de comunicação.
A maioria das associações é binária (existe entre exatamente duas classes) e é desenhada como linhas cheias que conectam pares de símbolos de classe.
Uma associação pode ter um nome ou as funções de associação podem ter nomes. Nomes de papéis são preferíveis, pois transmitem mais informações.
Nos casos em que somente um dos papéis possa ser nomeado, os papéis ainda são preferíveis a nomes de associações, desde que a associação seja unidirecional, começando a partir do objeto ao qual o nome do papel está associado.
As associações costumam ser nomeadas durante a análise, antes que existam informações suficientes para nomear os papéis corretamente.
Quando usados, os nomes de associações devem refletir a finalidade do relacionamento e ser uma expressão verbal.
O nome da associação é colocado no caminho da associação ou adjacente a ele.
Exemplo
Em um Caixa Eletrônico, a Gaveta de Dinheiro fornece o dinheiro
que o Distribuidor de Dinheiro distribui. Para que o Distribuidor
de Dinheiro seja capaz de distribuir fundos, ele deve manter uma referência para o objeto da
Gaveta de Dinheiro; da mesma forma, se a Gaveta de Dinheiro fica
sem fundos, o objeto do Distribuidor de Dinheiro deve ser notificado, então a
Gaveta de Dinheiro deve manter uma referência para o Distribuidor de Dinheiro. Uma associação modela essa referência.

Uma associação entre o Distribuidor de Dinheiro
e a Gaveta de Dinheiro denominada fornece Valor.
Se mal escolhidos, os nomes de associações podem ser confusos e enganosos.
Este exemplo ilustra nomeações satisfatórias e insatisfatórias.
No primeiro diagrama, embora os nomes de associações estejam sintaticamente corretos (usando expressões verbais), não transmitem muitas informações sobre o relacionamento.
No segundo diagrama, os nomes de papéis usados transmitem muito mais em termos da natureza da participação na associação.

Exemplos de uso satisfatório e insatisfatório de nomes de associações e de papéis
Cada extremidade de uma associação é uma função que especifica a face
que uma classe exerce na associação. Cada função deve ter um
nome e os nomes da função opostos a uma classe devem ser exclusivos. O nome do papel deve ser um substantivo que indique o papel do objeto associado em relação ao objeto associativo.
Um nome de função adequado para um Professor em uma associação com uma
Seção de Curso seria, por exemplo, palestrante;
evite nomes como "tem" e "contém",
já que eles não incluem informações sobre quais os relacionamentos entre as classes.
Observe que a utilização dos nomes da associação e os nomes de função é mutuamente exclusiva:
uma pessoa não utilizaria um nome de associação e um nome de função.
Nomes de papéis são preferíveis a nomes de associações, exceto nos casos em que existam informações insuficientes para nomear o papel corretamente (como costuma ser o caso na análise; no design, deve-se sempre usar nomes de papéis).
A ausência de um nome de papel satisfatório sugere um modelo incompleto ou malformado.
O nome de papel é colocado próximo à extremidade da linha de associação.
Exemplo
Considere os relacionamentos entre classes em um sistema de entrada de pedidos.
Um Cliente pode ter dois tipos diferentes de Endereços: um endereço para o qual
as cobranças são enviadas e um número de endereços para os quais os pedidos podem ser enviados. Conseqüentemente, temos
duas associações entre o Cliente e o Endereço,
conforme mostrado a seguir. As associações são etiquetadas com a função
que o endereço associado exerce para o Cliente.

Associações entre o Cliente, Endereço,
e Pedido, mostrando nomes de funções e multiplicidades
Para cada função você pode especificar a multiplicidade de sua classe,
quantos objetos da classe podem ser associados a um objeto da outra classe. A multiplicidade é indicada por uma expressão de texto no papel.
A expressão é uma lista com intervalos de números inteiros separados por vírgula.
Um intervalo é indicado por um número inteiro (o valor inferior),
dois pontos e um inteiro (o valor superior); um único número inteiro é um intervalo válido
e o símbolo '*' indica "muitos", ou seja, um número ilimitado de
objetos. O símbolo '*' equivale a '0..*', ou seja, qualquer número, incluindo zero. Esse é o valor padrão (default).
Um papel escalar opcional tem a multiplicidade 0..1.
Exemplo
No exemplo anterior, as multiplicidades foram mostradas para as associações entre Pedido e Cliente e entre Cliente e Endereço.
Interpretando o diagrama, vemos que um Pedido precisa ter um Cliente associado (a multiplicidade é 1..1 na extremidade Cliente), mas um Cliente pode não ter nenhum Pedido (a multiplicidade é 0..* na extremidade Pedido).
Além disso, um Cliente tem apenas um endereço de cobrança, mas um ou mais endereços para envio.
Para reduzir a confusão notacional, se as multiplicidades forem omitidas, pressupõe-se que elas são 1..1.
A propriedade de navegabilidade em uma função indica que é posível navegar de uma classe de associação para a classe de destino utilizando a associação. Isso pode ser implementado de várias maneiras: pelas referências do objeto direto, por matrizes associativas, tabelas hash ou qualquer outra técnica de implementação que permite que um objeto faça referência a outro. A navegabilidade é indicada por uma seta aberta, colocada na extremidade de destino da linha de associação, próximo à classe de destino (para a qual está sendo feita a navegação).
O valor padrão da propriedade de navegabilidade é true.
Exemplo
No exemplo de entrada do pedido, a associação entre o Pedido
e o Cliente é navegável em ambas as
direções: um Pedido deve saber qual Cliente fez
o Pedido e o Cliente deve saber quais Pedidos
foram feitos. Quando nenhuma seta for exibida, pressupõe-se que a associação é navegável nas duas direções.
No caso das associações entre o Cliente e o
Endereço, o Cliente deve saber seus Endereços,
mas os Endereços não têm conhecimento de quais Clientes
(ou outras classes, já que muitos itens têm endereços) estão associados ao endereço. Conseqüentemente, a propriedade de navegabilidade da extremidade Cliente da associação é desligada, resultando no seguinte diagrama:

As classes Sistema de Entrada de Pedidos Atualizado, que mostram a navegabilidade de associações.
Algumas vezes, uma classe possui uma associação com ela mesma.
Isso não significa necessariamente que uma instância dessa classe possua uma associação com ela mesma. O mais comum é que isso signifique que uma instância da classe tem associações com outras instâncias da mesma classe.
No caso de auto-associações, os nomes de papéis são essenciais para distinguir a finalidade da associação.
Exemplo
Considere a seguinte auto-associação envolvendo a classe Employee:

Nesse caso, um funcionário pode ter uma associação com outros. Se tiver, ele é um gerente e os outros funcionários são membros de sua equipe.
A associação é navegável nas duas direções, já que os funcionários conhecem seu gerente e um gerente conhece sua equipe.
O desenho de duas associações entre classes significa que os objetos estão relacionados duas vezes; um determinado objeto pode estar vinculado a objetos diferentes por meio de cada associação.
Cada associação é independente e pode ser diferenciada pelo nome do papel.
Como mostrado acima, um Cliente pode ter associações com diferentes instâncias da mesma classe, cada uma com diferentes nomes de papéis.
Quando a multiplicidade de uma associação é maior que uma, as instâncias associadas
podem ser ordenadas. A propriedade ordenada em uma função
indica que as instâncias participantes da associação são ordenadas; por padrão
são um conjunto não ordenado. O modelo não especifica como
a ordem é mantida, as operações que atualizam uma associação ordenada
devem especificar onde os elementos atualizados são inseridos.
As instâncias individuais de uma associação são chamadas de links; um
link é então um relacionamento entre as instâncias. As mensagens podem ser enviadas em links, e os links podem indicar referências e agregações entre objetos.
Consulte Diretrizes:
Diagrama de Comunicação para obter informações adicionais.
Uma classe de associação é uma associação que também tem propriedades de classe (como atributos, operações e associações). Ela é mostrada por uma linha pontilhada traçada do caminho de associação para um símbolo de classe que contém atributos, operações e associações para a associação.
Os atributos, as operações e as associações se aplicam à própria associação original.
Cada link na associação tem as propriedades indicadas.
O mais comum é as classes de associação serem usadas na reconciliação de relacionamentos muitos-para-muitos (consulte o exemplo a seguir).
Em princípio, os nomes da associação e da classe devem ser iguais, mas nomes separados são permitidos, se necessário.
Uma classe de associação corrompida contém somente atributos para a associação. Nesse caso, o nome da classe de associação pode ser omitido, deixando de enfatizar sua separação.
Exemplo
Expandindo o exemplo anterior do Funcionário, considere o caso em que um Funcionário (uma pessoa da equipe) trabalha para um outro Funcionário (um gerente).
O gerente executa uma avaliação periódica dos membros da equipe, refletindo seu desempenho durante um determinado período de tempo.
A avaliação não pode ser um atributo apenas do gerente ou do membro da equipe, mas podemos associar as informações com a própria associação, conforme mostrado a seguir:

A classe de associação Avaliação captura as informações relacionadas à própria associação
Os qualificadores são utilizados para restringir e definir o conjunto de instâncias que
estão associadas a outra instância; um objeto e uma valor qualificador identificam um conjunto
exclusivo de objetos na associação, formando uma chave composta.
Normalmente, a qualificação reduz a multiplicidade do papel oposto. A multiplicidade líquida mostra o número de instâncias da classe relacionada associadas à primeira classe e um determinado valor qualificador.
Os qualificadores são desenhados como pequenas caixas na extremidade da associação, anexados à classe qualificadora.
Eles fazem parte da associação, não da classe.
Uma caixa qualificadora pode conter vários valores de qualificador. A qualificação se baseia na lista inteira de valores.
Uma associação qualificada é uma forma variante de atributo de associação.
Exemplo
Considere o seguinte refinamento da associação entre o Item de
Linha e o Produto: um Item de Linha tem uma associação ao Produto que é ordenado. Cada Item de Linha se refere a somente um Produto, embora um Produto possa ser pedido em muitos Itens de Linha.
Qualificando a associação ao qualificador ProductCode,
adicionalmente indicamos que cada produto tem um código de produto exclusivo e que os Itens
de Linha estão associados aos Produtos utilizando este código do produto.

A associação entre o Item de Linha e o Produto
possui o qualificador ProductCode.
Uma associação enária é uma associação entre três ou mais classes, na qual uma única classe pode aparecer mais de uma vez.
As associações enárias são representadas por grandes losangos com um caminho de associação para cada classe participante.
Esse é o símbolo tradicional do modelo relacionamento-entidade para uma associação.
A forma binária é representada sem o losango para ficar mais compacta, já que são a parte maior das associações em um modelo real.
As associações enárias são relativamente raras e também podem ser modeladas, promovendo-as a classes.
Elas também podem ter uma classe de associação. Isso é mostrado através de uma linha pontilhada traçada do losango até o símbolo da classe.
Os papéis podem ter nomes de papéis, mas a multiplicidade é mais complicada e pode ser melhor especificada listando sugestões de chaves.
Se fornecida, a multiplicidade representa o número de instâncias que correspondem a uma determinada tupla de outros N-1 objetos.
A maioria dos usos das associações enárias pode ser eliminada usando associações qualificadas ou classes de associação.
Elas também podem ser substituídas por classes comuns, embora assim se perca a restrição de que somente um link possa ocorrer para uma determinada tupla de objetos participantes.
|