Diretriz: Associação
Associação representa um relacionamento estrutural entre objetos. Esta diretriz demonstra como utilizar esse relacionamento.
Relacionamentos
Descrição Principal

Associações

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.

Nomes de Associaçã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 ao objeto Gaveta de Dinheiro; da mesma forma, se a Gaveta de Dinheiro fica sem fundos, o objeto Distribuidor de Dinheiro deve ser notificado, portanto a Gaveta de Dinheiro deve manter uma referência ao Distribuidor de Dinheiro. Uma associação modela essa referência.

Um exemplo de nome de associação

Uma associação entre o Distribuidor de Dinheiro e a Gaveta de Dinheiro, denominada Valor de Suprimentos.

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.

Diagrama descrito no texto associado.

Exemplos de uso satisfatório e insatisfatório de nomes de associações e de papéis

Funções

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 de 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 são os relacionamentos entre as classes.

Observe que a utilização dos nomes de associação e os nomes de função é mutuamente exclusiva: uma pessoa não utilizaria um nome da associação e um nome da 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, termos 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.

Exemplos de associações

Associações entre Cliente, Endereço e Pedido, mostrando nomes de função e multiplicidades

Multiplicidade

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 inteiro (o valor inferior), dois pontos e um inteiro (o valor superior); um único 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.

Navegabilidade

A propriedade de navegabilidade em uma função indica que é possí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 é desativada, resultando no seguinte diagrama:

Exemplos de navegabilidade em associações

As classes Sistema de Entrada de Pedidos Atualizado, que mostram a navegabilidade de associações.

Auto-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 Funcionário:

Exemplo de uma auto-associação

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.

Múltiplas Associações

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.

Ordenando Funções

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, elas 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.

Links

As instâncias individuais de uma associação são chamadas de links; um link é, portanto, 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 Técnica: Diagrama de Comunicação para obter informações adicionais.

Classes de Associação

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:

Exemplo de uma classe de associação

A classe de associação Avaliação captura as informações relacionadas à própria associação

Associações Classificadas

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 com o 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.

Uma associação qualificada

A associação entre Item de Linha e Produto possui o qualificador ProductCode.

Associações Enárias

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.