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 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.
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.
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 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.
Associações entre Cliente, Endereço e Pedido, mostrando nomes de função 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 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.
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:
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 Funcionário:
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, 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.
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.
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 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.
A associação entre Item de Linha e 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.
|