トピック

説明 ページの先頭へ

あるオブジェクトがほかのオブジェクト内で発生している特定のイベントに依存することがあります。そのイベントがバウンダリ オブジェクトまたはコントロール オブジェクトの内部で発生している場合、そのオブジェクトは発生している事柄をほかのオブジェクトに単に通知します。しかし、そのイベントがエンティティ オブジェクト内で発生している場合、状況は少し違ってきます。通常はエンティティ オブジェクトからほかのオブジェクトに何かを通知することはありません。必要に応じて、エンティティ オブジェクトから通知を受けるように予約します。

現金自動預払機を使用して銀行口座から現金を引き出せるようにモデル化されたシステムがあるとします。顧客が残高よりも多い額を引き出そうとした場合、直ちに警告が顧客に送られなければなりません。エンティティ オブジェクトとしてモデル化されている口座は、顧客への通知にかかわりません。その代わりに、バウンダリ オブジェクトが顧客に通知を行うべきです。

上の例において、バウンダリ オブジェクトはエンティティ オブジェクトに対して繰り返し「問題のイベントは発生しましたか」という質問を提示する必要があります。状況をはっきりさせるために、また実装にかかわる細目を設計フェーズまで先送りするために、このことを表す特別の関係があります。それが通知予約関係です。

通知予約関係は任意のタイプのオブジェクトをエンティティ オブジェクトに関係づける働きをします。通知予約関係は、エンティティ オブジェクト内で特定のイベントが発生したときに、関係先のオブジェクトに通知がなされることを表します。この関係づけはエンティティ オブジェクトに関してのみ行うようにお薦めします。その理由は、関係づけを必要とする原因は、エンティティ オブジェクトの受動的な性質にあるからです。それと異なり、インターフェイス オブジェクトとコントロール オブジェクトは共に自発的に通信を開始できます。したがって、それらのオブジェクトは「予約をする」必要がなく、ほかの方法で責任 を果たすことができます。

通知予約関係は任意のタイプのオブジェクトをエンティティ オブジェクトに関係づけます。関係元のエンティティ オブジェクトに特定のイベントが発生すると、関係先のオブジェクトに通知がなされます。

2 つのオブジェクトの間の関係は予約する側のオブジェクトからのみ認識される一方通行になっていることに、注意してください。予約の内容はすべて予約する側のオブジェクト側に持たれています。他方、関係元のエンティティオブジェクトは通常どおりに定義され、ほかのオブジェクトがエンティティ オブジェクト内の作業に関連があるかどうかは考慮されません。このことは、予約先のオブジェクトを変更することなく、予約する側のオブジェクトをモデルに追加またはモデルから削除できることを暗示しています。

通知予約関係には多重度が割り当てられます。この多重度は、関係先のオブジェクトにターゲットとするオブジェクトを同時にいくつまで関係づけられるかを示します。それから、関係にいくつかの条件が記述されます。その条件は、関係先のオブジェクトに通知がなされるためには何が発生しなければならないかを示します。イベントは関係または属性の値の変化、または操作の評価の (一部の) 変化でもあり得ます。そのイベントが発生すると、予約する側のオブジェクトにそのことが通知されます。通知されるのは、そのイベントが発生したという事実だけです。そのイベントの結果については何の情報も伝えられないことに、注意してください。そのイベントが発生した結果としてのエンティティ オブジェクトの状態を関係先のオブジェクト側で知りたい場合、通常の方法でエンティティ オブジェクトと情報を交換する必要があります。このことは、両者の間にリンクも必要であることを意味します。

貯蔵所システムにおいて、パレットの余命を測定するために、ときどきチェックを行う必要があります。そこで、貯蔵所内でパレットがある場所から別の場所へ移動された回数が 100 回に達するたびに、そのパレットを特別の検査場へ送ってチェックします。そのことをモデル化するために、コントロール クラスである「パレット チェッカー」からエンティティ クラスである「パレット」に通知予約関係を設定します。各「パレット」のインスタンスでは、カウンタ属性を使用して、それが移動された回数を数えます。その「パレット」のインスタンスの移動回数が 100 回に達すると、通知予約関係の条件に従って、「パレット チェッカー」に通知がなされます。すると、「パレット チェッカー」は特別な「タスク」を生成して、「パレット」を検査場へ移動させます。「パレット チェッカー」から「パレット」へのリンクは必要ありません。しかし、「タスク」を起動するために、「パレット チェッカー」から「タスク」へのリンクが必要です。

「パレット」が 100 回移動された後で、「パレット チェッカー」は新しい「タスク」を生成

通知予約関係の条件は、特定の属性または操作の観点からではなく、抽象的な特性の観点から表現されます。そうすることによって、変更される可能性のある関係元のエンティティ オブジェクトの内容に関係先のオブジェクトは依存しないで済みます。

通知予約関係は必ず 2 つのオブジェクト インスタンスを関係づけるとは限りません。通知予約関係はクラスからインスタンスへのメタ関係にも有効です。この詳細は後述します。オブジェクトのクラスが通知予約関係によって関係づけられることもあります。たとえば、該当のイベントがクラスをインスタンス化したものであった場合です。

使用 ページの先頭

バウンダリ クラスからの通知予約関係 ページの先頭へ

エンティティ オブジェクト内でイベントが発生した場合に、バウンダリ オブジェクトが通知を受ける必要があることがあります。そのためには通知予約関係が必要です。

現金自動預払機を使用して銀行口座から預金を引き出す場合を考えてみます。ここで、エンティティ オブジェクトである「口座」に対する操作を行うのは、コントロール オブジェクトである「引き出しハンドラ」です。「口座」の残高が負になる場合、バウンダリ オブジェクトである「注意書き」によって作成された注意が、顧客に送られる必要があります。したがって、このバウンダリ オブジェクトは「口座」との通知予約関係を持ちます。そこに記述されている通知の条件は、残高が負になったときです。そのイベントが発生するとすぐに、「注意書き」に通知が送られます。この場合の通知予約関係はインスタンスの関係です。つまり、「注意書き」のインスタンスがたえず「口座」のインスタンスの引き出し過剰を監視しています。

残高が不足していること以上の情報を顧客が通知されないとしたら、それは十分ではありません。しかし、顧客に不足額まで知らせるとしたら、「注意書き」は「口座」から正確な金額を知る必要があります。そのためには、「注意書き」は「口座」とリンクされている必要があります。

バウンダリ クラスの「注意書き」は、エンティティ オブジェクトの「口座」内で残高があるレベルを割り込むイベントが発生したら、通知してもらうよう予約します。「注意書き」が不足額をも正確に知る必要があるならば、「口座」とのリンクも必要となります。

バウンダリ クラスからのメタ関係の一例は、エンティティ オブジェクト内のイベントによって、ユーザーに新しいウィンドウを提示することになるときです。その場合、インターフェイス オブジェクトクラスがエンティティ オブジェクトのインスタンスにイベントの通知を予約します。

エンティティ クラスからの通知予約関係 ページの先頭へ

ネットワークを取り扱っているシステムには、ノードとして機能するステーションとそれらを相互に接続する回線があります。各ステーションは何本もの回線を通じてほかのステーションに接続されます。ステーションの能力は回線のうちの何本が機能しているかによって決まります。もし回線の 80% 以上が機能しているならば、そのステーションの能力は高いと言えます。もし回線の 20 % 以下しか機能していないならば、そのステーションの能力は低いと言えます。回線が機能している割合がその中間であれば、ステーションの能力は中位と言えます。このシステムのモデルには、「ステーション」と「回線」という 2 つのエンティティ オブジェクトがあります。そして、「ステーション」は「回線」と通知予約関係を持ちます。この関係の条件は、接続または遮断され得る「回線」の状態が変化したら、「ステー ション」は通知を受けるということです。

さらに、コントロール オブジェクトから「ステーション」に通知を予約すると、ステーションの能力が低くなったときに、コントロール オブジェクトに通知がなされます。上の例をさらに続けて、このことを下に説明します。

「回線」のインスタンスのどれか 1 つの状態が変化すると、すぐにその情報が「ステーション」のインスタンスに通知されます。

エンティティ クラス同士の間の通知予約関係はほとんど常にインスタンス関係です。なぜなら、参加するのは通常、既に存在するインスタンスであるからです。しかし、関係元のエンティティ オブジェクト内で指定されているイベントが発生したときに、予約する側のエンティティ オブジェクトのインスタンスが作成される場合があり得ます。この場合、関係はクラスからインスタンスへと移ります。つまり、それがメタ関係です。ある特定のエンティティ オブジェクトのインスタンス側で、ほかのエンティティ オブジェクトの新しいインスタンスが生成されたことを知りたい場合があることも、想像がつきます。

コントロール クラスからの通知予約関係 ページの先頭へ

上の例において、エンティティ オブジェクトの「ステーション」はエンティティ オブジェクトの「回線」との通知予約関係を持っています。したがって、「回線」のインスタンスの状態が変わるたびに、「ステーション」は通知を受けます。そのような状態の変化は「ステーション」の能力を変化させます。「ステーション」の能力が低くなった場合、つまり回線の 20% 以下しか機能していない場合、この「ステーション」を避けるように、システムはネットワークを通過する新しい適切な道を見つけ出す必要があります。それは、当然のことながら、「ステーション」が行う仕事ではなく、「ステーション」の各インスタンスと通知予約関係を持つコントロール オブジェクトの「ステーション監視デバイス」によって行われるべきです。

コントロール オブジェクトの「ステーション監視デバイス」はエンティティ オブジェクトの「ステーション」に通知を予約します。それを受けた「ステーション」はエンティティ オブジェクトの「回線」に通知を予約します。

ほとんどの場合、コントロール オブジェクトからの通知予約関係はクラスからインスタンスに移るか、またはその逆です。つまり、それはメタ関係です。通常は、エンティティ オブジェクト内のイベントを処理するコントロール オブジェクトのインスタンスは、イベントが実際に発生して初めて生成されます。しかし、コントロール オブジェクトのインスタンスがエンティティ オブジェクトの新しいインスタンスの発生を知りたい場合があることも、想像がつきます。このような訳で、まれに通知予約関係がインスタンス関係の場合もあります。

上の例において、「ステーション監視デバイス」から「ステーション」への通知予約関係にはメタ関係の特性があります。つまり、「ステーション」の能力が下がったときに通知を受けるのは「ステーション監視デバイス」のクラスです。「ステーション監視デバイス」はその通知を受けると、実際にイベントを処理するインスタンスを生成します。



Rational Unified Process   2003.06.15