No mundo real, os fatos acontecem; em geral, simultaneamente e de modo imprevisível. Os "fatos que acontecem" são
chamados de 'eventos'.
No contexto das máquinas de estado, os eventos modelam a ocorrência de um estímulo que pode disparar uma transição de
estado. Os eventos podem incluir sinais, chamadas, o decorrer do tempo ou uma mudança de estado. Eles podem ser
síncronos ou assíncronos.
Um 'sinal' é um tipo de evento que representa a especificação de um estímulo assíncrono entre duas instâncias.
Os eventos podem ser externos ou internos. Os eventos externos são aqueles que ocorrem entre o sistema e seus atores.
Os eventos internos são aqueles que ocorrem entre os objetos que vivem no sistema. Há quatro tipos de eventos: sinais,
chamadas, decorrência do tempo e alteração no estado.
Um sinal representa um objeto que é enviado (lançado) assincronamente por um segundo objeto e, em seguida, recebido
(capturado) por um terceiro objeto. As exceções são um exemplo de um tipo de sinal.
Os sinais podem ter instâncias, embora essas instâncias não sejam, em geral, explicitamente modeladas. Eles podem estar
envolvidos em relacionamentos de generalização, permitindo a modelagem das hierarquias de eventos.
Eles podem ter atributos e operações. Os atributos de um sinal atuam como seus parâmetros.
Um sinal pode ser enviado como a ação de uma transição de estado em uma máquina de estado ou como o envio de uma
mensagem em uma interação. A execução de uma operação também pode enviar sinais. Quando uma classe ou uma interface
estiver sendo modelada, uma parte importante na especificação do comportamento é especificar os sinais que podem ser
enviados por suas operações. O relacionamento entre uma operação e os eventos que ela pode enviar são modelados
utilizando um relacionamento de dependência, estereotipados como <<envio>>.
Assim como um evento de sinal representa a ocorrência de um sinal, um evento de chamada representa a execução de uma
operação. Nos dois casos, o evento pode disparar uma transição de estado em uma máquina de estado.
Enquanto um sinal é um evento assíncrono, um evento de chamada é, em geral, síncrono. Isso significa que, quando um
objeto chama uma operação em outro objeto, o controle passa do emissor para o receptor até que a operação seja
concluída. Depois disso, o controle retorna ao emissor. A modelagem de um evento de chamada é visualizada da mesma
maneira que um evento de sinal. Nos dois casos, o evento é exibido junto com seus parâmetros como o trigger de um
estado de transição.
Embora não existam indícios visuais para distinguir um evento de sinal de um evento de chamada, a diferença aparecerá
na classe do receptor, já que ela declarará uma operação que manipula o evento de chamada. No caso de um sinal, haverá
uma transição na máquina de estado que será disparada pelo sinal.
Um evento de tempo representa o decorrer do tempo. Os eventos de tempo são usados para sincronizar partes do sistema
que dependem do tempo usando um mecanismo de relógio comum. Um evento de alteração representa uma mudança no estado do
sistema ou o cumprimento de alguma condição.
Os eventos de sinal e de chamada envolvem, pelo menos, dois objetos: um emissor e um receptor. Quando o sinal é
enviado, o emissor o transmite e continua em seu fluxo de controle sem precisar esperar um retorno do receptor. Isso
está em contraste com a semântica da chamada de operação, em que o emissor deve aguardar o receptor responder para
retomar seu fluxo de controle. Por isso, as operações são geralmente utilizadas para representar um comportamento de
bloqueio (que bloqueia ou impede outros eventos), enquanto os sinais são utilizados para representar um comportamento
sem bloqueio.
O ato de um objeto enviar um sinal a um conjunto de objetos chama-se 'difusão seletiva' e é representado pelo envio de
um sinal a um contêiner que retém um conjunto de receptores. A difusão é o ato de enviar um sinal a todos os objetos de
um sistema e é representado pelo envio de um sinal a um objeto que representa o sistema como um todo. Esse 'objeto
sistema', por sua vez, percebe o mecanismo de distribuição de mensagens, que assegura que o sinal será enviado a todos
os objetos apropriados do sistema.
|