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.
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.
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.
À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.
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.
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.
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.
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.
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.
|