Diretriz: Associação de Assinatura
A associação de assinatura especifica que um objeto deve ser informado sempre que um determinado evento ocorrer no objeto de entidade associado. Esta diretriz demonstra como utilizar esse relacionamento.
Relacionamentos
Descrição Principal

Explicação

Em alguns casos, um objeto depende de um evento específico que ocorre em outro objeto. Se o evento ocorre dentro de um objeto de fronteira ou de controle, esse objeto simplesmente informa o outro objeto sobre o que aconteceu. Mas se o evento ocorre dentro de um objeto de entidade, a situação é um pouco diferente. Um objeto de entidade talvez não possa informar nada a outros objetos caso ele não tenha sido expressamente solicitado para fazê-lo.

Exemplo

Suponha que um sistema tenha sido modelado com a possibilidade de sacar dinheiro de uma conta bancária através de transferências. Se uma tentativa de saque causar um saldo negativo na conta, um aviso será escrito imediatamente e enviado ao cliente. A conta, que foi modelada como um objeto de entidade, não deve estar envolvida com o fato de o cliente ser ou não notificado. Ao invés disso, um objeto de fronteira deve notificar o cliente.

No exemplo anterior, o objeto de limite deveria perguntar "o evento esperado ocorreu?" repetidamente para o objeto de entidade. Para tornar a situação mais clara e adiar os detalhes da implementação até a fase de design, existe uma associação especial para expressar isso, denominada associação de assinatura.

A associação de assinatura, que associa um objeto de qualquer tipo a um objeto de entidade, expressa que o objeto associante será informado quando um determinado evento ocorrer no objeto de entidade. É recomendável usar a associação apenas para associar objetos de entidade, pois é a natureza passiva dos objetos de entidade que torna necessária a associação. Os objetos de controle e de interface, por outro lado, podem iniciar a comunicação. Portanto, eles não precisam ser "assinados", mas podem desempenhar suas responsabilidades de outras maneiras.

Diagrama de UML descrito abaixo.

A associação de assinatura associa um objeto de qualquer tipo a um objeto de entidade. O objeto associante será informado quando um certo evento ocorrer no objeto de entidade associado.

Observe que a direção da associação mostra que o objeto assinante está ciente do relacionamento entre os dois objetos. A descrição da assinatura está inteiramente no objeto assinante. O objeto de entidade associado, por sua vez, é definido de forma usual sem considerar que outros objetos possam estar interessados em sua tarefa. Isso também implica que um objeto assinante pode ser adicionado ao modelo, ou removido, sem mudar o outro objeto da assinatura.

A associação de assinatura contém uma multiplicidade que indica quantas instâncias do objeto-alvo o objeto associante pode associar simultaneamente. Em seguida, uma ou mais condições são descritas na associação para indicar o que deve ocorrer para que o objeto associante seja informado. O evento pode ser uma alteração no valor de uma associação ou de um atributo ou (parte) da avaliação de uma operação. Quando o evento ocorrer, o objeto assinante será informado que algo aconteceu. Observe que não são transmitidas informações sobre o resultado do evento, apenas o fato de que o evento ocorreu. Caso o objeto associante esteja interessado no estado resultante do objeto de entidade após o evento, ele precisará interagir com o objeto de entidade de forma normal. Isso significa que ele precisará também de um vínculo com ele.

Exemplo

No Sistema para Administração de Depósito, devem ser feitas checagens aleatórias nos estrados de carga, para avaliar sua expectativa de vida. Assim, a cada cem deslocamentos de um lugar para outro de uma plataforma de carga do depósito, o estrado será checado em uma estação especial de teste. Isso é modelado por uma associação de assinatura da classe de controle Checagem Aleatória de Plataforma de Carga para a classe de entidade Plataforma de Carga. Cada instância de Plataforma de Carga conta quantas vezes ele foi movido, usando um atributo contador. Quando ocorre a centésima movimentação, a Checagem Aleatória de Plataforma de Carga é informada por causa da condição da associação de assinatura. A Checagem Aleatória de Plataforma de Carga cria, então, uma Tarefa especial, que transporta a plataforma de carga para a estação de teste. A Checagem Aleatória de Plataforma de Carga não necessita de nenhum vínculo com a Plataforma de Carga, mas precisa ter um com a Tarefa para poder iniciá-la.

Diagrama descrito no texto associado.

Após uma plataforma de carga ter sido removida centenas de vezes, a Checagem Aleatória da Plataforma de Carga cria uma nova Tarefa.

As condições de associação de assinatura devem ser expressas em termos de características abstratas, e não em termos de suas operações ou seus atributos específicos. Dessa forma, o objeto associativo é mantido independente do conteúdo do objeto de entidade associado, que pode ser mudado.

A associação de assinatura nem sempre associa duas instâncias do objeto. Ela também é válida de uma classe para uma instância, uma metarrelação. Isso é descrito em subseções abaixo. Há também casos em que a classe de um objeto será associada por uma associação de assinatura, por exemplo, se um determinado evento ocorrer à instância da classe.

Uso

Associações de Assinatura de Classes de Limite

Às vezes, é necessário que um objeto de fronteira seja informado se um evento ocorre em um objeto de entidade. Isso chama uma associação de assinatura.

Exemplo

Imagine um saque de uma conta bancária por meio de transferências. Aqui, é o objeto de controle Administrador de Transferências que executa as operações no objeto de entidade Conta. Se o saldo de Conta ficar negativo, o cliente receberá uma notificação preparada pelo objeto de fronteira Autor de Notificações. Este objeto tem, portanto, uma associação de assinatura para a Conta. A condição estabelecida foi que o saldo descesse abaixo de zero. Assim que o evento ocorre, o Autor de Notificações é informado. Essa associação de assinatura específica é uma associação de instância, pois uma instância do Autor de Notificações procura constantemente saques a descoberto nas instâncias de Conta.

Se o cliente não for receber mais informações além da que seu saldo está baixo, então, isso será suficiente. Mas, se ele tiver que ser informado o quanto o saldo está baixo, o Autor de Notificações deverá executar uma operação em Conta para saber a quantia exata. Para tanto, o Autor de Notificações precisará de um vínculo com a Conta.

Diagrama descrito no texto associado.

A classe de fronteira Autor de Notificações faz uma assinatura do evento de queda do saldo abaixo de um certo nível no objeto de entidade Conta. Se o Autor de Notificações também precisar saber a soma exata do déficit, ele precisará de um vínculo com Conta.

Um exemplo de uma metassociação de uma classe de fronteira é quando um evento em um objeto de entidade faz com que uma nova janela seja exibida ao usuário. Em seguida, uma classe de objetos de interface faz assinaturas de instâncias do objeto de entidade.

Associações de Assinatura de Classes de Entidade

Exemplo

Em um sistema que administra uma rede, existem estações que funcionam como nós da rede e existem linhas para interconectá-las. Cada estação está conectada a outras estações através de várias linhas. A capacidade de uma estação é determinada pela quantidade de linhas funcionais. Se mais de 80% delas estiverem funcionais, a capacidade da estação será alta; se menos de 20% estiverem funcionais, a capacidade da estação será baixa; entre esses dois valores, a capacidade será média. No nosso modelo de sistema, temos dois objetos de entidade, Estação e Linha, em que Estação tem uma associação de assinatura para Linha. A condição da associação é que a Estação deve ser informada quando o status da Linha, que pode ser ativado ou desativado, for mudado.

Além disso, um objeto de controle que faça assinatura para a Estação será informado se a capacidade da estação ficar baixa. Isso é descrito abaixo, onde há uma continuação do exemplo.

Diagrama descrito no texto associado.

Uma instância da Estação será informada assim que o status de uma das suas instâncias de Linha for mudado.

Uma associação de assinatura entre classes de entidade é quase sempre uma associação de instâncias, pois geralmente envolve instâncias já existentes. No entanto, pode haver casos em que uma instância do objeto de entidade assinante é criada quando o evento especificado ocorre no objeto de entidade associado. Nesses casos, a associação parte de uma classe para uma instância, isto é, ela é uma metassociação. Também é possível que uma instância de um dado objeto de entidade deseje saber quando uma nova instância de outro objeto de entidade é criada.

Associações de Assinatura de Classes de Controle

Exemplo

No exemplo anterior, o objeto de entidade Estação possui uma associação de assinatura para o objeto de entidade Linha. Assim, a Estação será informada sempre que o status da instância de uma Linha for mudado. Essa mudança no status alterará a capacidade da Estação. Se a capacidade ficar baixa, isto é, se menos de 20% de suas linhas estiverem funcionais, o sistema precisará encontrar novos trajetos através da rede para que a estação seja evitada. Isso, obviamente, não é tarefa da Estação, mas deve ser realizada pelo objeto de controle Supervisor de Estação, que tem uma associação de assinatura para cada instância da Estação.

Diagrama descrito no texto associado.

O objeto de controle Supervisor de Estação faz uma assinatura para o objeto de entidade Estação, que por sua vez faz uma assinatura para o objeto de entidade Linha.

Muitas vezes, uma associação de assinatura de um objeto de controle será de uma classe para uma instância, ou vice-versa, isto é, uma metassociação. Em geral, a instância do objeto de controle que tratará o evento no objeto de entidade só é criada quando ocorre o evento. Mas também é possível, por exemplo, que uma instância de um objeto de controle deseje saber quando uma nova instância de um certo objeto de entidade é criada. Portanto, em alguns casos, a associação de assinatura pode ser uma associação de instância.

Exemplo

No exemplo anterior, a associação de assinatura do Supervisor de Estação para a Estação apresenta as características de uma metassociação, ou seja, é a classe Supervisor de Estação que será informada quando a capacidade da Estação ficar baixa. Quando o Supervisor de Estação recebe essa mensagem, ele cria uma instância que trata do evento.