概念: イベントとシグナル
トピック
現実の世界では、多くの場合、同時かつ予期せずに物事が発生します。「発生する物事」を「イベント」と呼びます。
状態マシンのコンテキストでは、イベントは、状態遷移をトリガできる刺激の発生をモデリングします。イベントには、シグナル、コール、時間の経過、状態の変更があります。また、同期イベントと非同期イベントがあります。
「シグナル」は、2 つのインスタンス間の非同期刺激の仕様を表現するイベントです。
イベントには、外部イベントと内部イベントがあります。外部イベントは、システムとアクターの間で渡されるイベントです。内部イベントは、システム内にあるオブジェクトの間で渡されるイベントです。イベントの種類は、シグナル、コール、時間の経過、状態の変更の 4 つです。
シグナルは、1 つのオブジェクトによって非同期でディスパッチされ (スローされ)、別のオブジェクトによって受信される (キャッチされる) オブジェクトを表現します。例外はシグナルの一種です。
シグナルはインスタンスを持つことができますが、このインスタンスは普通は明示的にモデリングされません。シグナルは汎化関係に関与し、イベント階層のモデリングを可能にします。
シグナルは属性と操作を持つことができます。シグナルの属性は、シグナルのパラメータとなります。
シグナルは、状態マシン内の状態遷移のアクションとして、または相互作用内のメッセージの送信として送信できます。操作の実行でもシグナルを送信できます。クラスまたはインターフェイスをモデリングするときに、要素の振る舞いの指定で重要な部分は、操作によって送信できるシグナルを指定することです。操作とその操作が送信できるイベントとの関係は、依存関係を使用してモデリングされ、≪send≫ としてステレオタイプ化されます。
シグナル イベントがシグナルの発生を表現するのと同様に、コール イベントは操作のディスパッチを表現します。どちらの場合も、イベントが状態マシン内の状態遷移をトリガできます。
シグナルは非同期イベントであるのに対し、コール イベントは普通は同期イベントです。つまり、あるオブジェクトが別のオブジェクト上で操作を呼び出すと、その操作が完了するまで送信側から受信側にコントロールが渡され、完了するとコントロールが送信側に返されます。コール イベントのモデリングは、シグナル イベントと同じように視覚化されます。どちらの場合も、イベントが状態遷移のトリガとしてパラメータと共に表示されます。
シグナル イベントをコール イベントと区別する視覚的な手がかりはありませんが、受信側クラスに違いが現れます。なぜなら、コール イベントを処理する操作を受信側クラスが宣言するからです。シグナルの場合は、シグナルによってトリガされる状態マシンの遷移があります。
時間イベントは、時間の経過を表現します。時間イベントは、共通のクロック メカニズムを使用して、時間に依存するシステムの部分を同期するために使用されます。変更イベントは、システムの状態の変更、またはなんらかの条件の充足を表現します。
シグナル イベントとコール イベントは、少なくとも 2 つのオブジェクト、すなわち送信側と受信側を必要とします。シグナルが送信されるときに、送信側はシグナルをディスパッチし、受信側からコントロールが返されるのを待たずに、コントロールのフローに沿って進み続けます。これに対し、操作コールのセマンティクスでは、送信側が受信側の応答を待ってからコントロールのフローを再開します。このため、操作は通常は「妨害」の振る舞い (ほかの物事の発生を妨害または防止する振る舞い) の表現に使用され、シグナルは妨害しない振る舞いの表現に使用されます。
1 つのオブジェクトがオブジェクトのセットにシグナルを送信する行為を「マルチキャスト」と呼び、受信側のセットが入ったコンテナへのシグナルの送信によって表現されます。ブロードキャストは、システム内のすべてのオブジェクトにシグナルを送信する行為であり、システム全体を表現する 1 つのオブジェクトへのシグナルの送信によって表現されます。この「システム オブジェクト」はメッセージの分散メカニズムを実現し、そのシグナルがシステム内のすべての該当するオブジェクトに送信されるようにします。
|