ガイドライン: 関連
トピック
関連は、異なるクラスのオブジェクト間の構造的関係を表し、2 つ以上のクラスのインスタンス間における一定期間の接続を表します。
この接続と、操作の間だけ存在するような一時リンクとを対比してみると、一時リンクは関連ではなくコラボレーションによってモデル化できます。コラボレーションでは、リンクは特定の限られたコンテキストにのみ存在します。
関連は、オブジェクトが別のオブジェクトを知っていることを示すために使用できます。ときには、オブジェクト間でメッセージを相互に送信するといった相互作用を可能にするために、参照関係を保持する必要があります。そのため、関連はシーケンス図やコミュニケーション図の相互作用パターンに従う場合があります。
ほとんどの関連は 2 項関連 (ただ 2 つのクラス間に存在する) であり、一対のクラス記号をつなぐ実線として描かれます。関連に名前を付けることも、関連のロールに名前を付けることもできます。伝達できる情報量が多いため、ロール名の方が好ましいでしょう。1 つのロールにしか名前を付けられない場合でも、ロール名が関連付けられるオブジェクトから開始する 1 方向の関連であると予想される場合には、関連名よりロール名の方が適しています。
関連に名前を付けることが最も多いのは分析の段階であり、この時点ではまだロールに適切な名前を付けるのに十分な情報がありません。関連名を使う場合は、関係の目的を反映した動詞句にする必要があります。関連名は、関連パス上または関連パスに隣接する場所に配置します。
例
ATM では、「現金自動支払機」が払い出す現金を「現金引き出し」が提供します。「現金自動支払機」が現金を払い出すには、「現金引き出し」オブジェクトへの参照関係を維持する必要があります。同様に、「現金引き出し」に現金が無くなった場合は、「現金自動支払機」オブジェクトは通知を受ける必要があり、そのため、「現金引き出し」は「現金自動支払機」への参照関係を保つ必要があります。関連はこの参照関係をモデル化します。

「現金自動支払機」と「現金引き出し」の間の関連には、「値の供給」という名前が付いています。
関連名の選択を誤ると、混乱と誤解の原因になります。次に、命名の良い例と悪い例を示します。1 つ目のダイアグラムでは関連名が使用されており、構文的には正しいものの (動詞句を使用)、関係に関する情報をあまり伝えていません。2 つ目のダイアグラムではロール名が使用されており、関連への参加の性質に関するより多くの情報を伝えています。

関連名とロール名の使用法の良い例と悪い例
関連の両端はロールで、関連の中でクラスが演じる顔を指定します。各ロールには名前が必要で、あるクラスの反対側にあるロール名はユニークでなければなりません。ロール名は、関連元のオブジェクトに対する関連先のオブジェクトのロールを示す名詞にする必要があります。「トレーニング課」との関連において「先生」に適したロール名は、「講師」のような名詞です。「持つ」や「含む」といった名前は避けます。このような名前は、クラス間の関係に関する情報を何も付け加えません。
関連名とロール名の使用は相互に排他的であることに注意してください。関連名とロール名の両方を使用することはできません。
ロールに適切な名前を付けるには情報が不足している場合 (分析段階ではよくある) を除き、なるべく関連名ではなくロール名を使用するようにします (設計段階では常にロール名を使用)。適切なロール名が付いていない場合は、モデルが未完成であること、またはモデルに問題があることを示しています。
ロール名は、関連線の端の近くに配置します。
例
オーダー・エントリー・システムでのクラス間の関係を検討します。「顧客」には 2 つの異なる「住所」を設定できます。1 つは請求書を送る住所で、もう 1 つは注文品を送る住所です。その結果、「顧客」と「住所」の間には、次に示すように 2 つの関連があります。この関連には、関連する住所が「顧客」に対して演じるロールでラベルを付けます。

ロール名と多重度の両方が示されている「顧客」、「住所」、「注文」の間の関連
各ロールに対して、そのクラスの多重度を指定できます。多重度とは、他のクラスの 1 つのオブジェクトに対して関連付けることのできる、そのクラスのオブジェクトの数です。多重度は、ロールに対する文字式で示されます。式は、コンマで区切られた整数値の範囲のリストです。整数 (下限値)、2 つのピリオド、整数 (上限値) で範囲が示されます。1 つの整数だけも有効な範囲であり、記号「*」は「多数 (限定されない数)」のオブジェクトを表します。「*」は単独で「0..*」という意味になり、0 を含む任意の値を表します。これがデフォルト値です。オプションのスカラーのロールの多重度は 0..1 です。
例
前の例では、多重度は「注文」と「顧客」の間、および「顧客」と「住所」の間の関連に対して示されていました。
ダイアグラムを解釈してみると、「注文」には関連した「顧客」が必要です (「顧客」側の多重度は 1..1) が、「顧客」には「注文」がない場合もあります (「注文」側の多重度は 0..*)。さらに、「顧客」には請求書送付先住所が 1 つありますが、出荷先の住所は 1 つ以上あります。表記の混乱を減らすため、多重度が省略されている場合は、1..1 であると見なされます。
あるロールにおける誘導可能性のプロパティーは、関連を使用して、関連元のクラスから関連先のクラスに誘導できることを示しています。誘導可能性は、複数の方法で実装できます。オブジェクトの直接参照、連想配列、ハッシュ表、またはあるオブジェクトから別のオブジェクトを参照できるその他の実装技法を利用できます。誘導可能性は矢印で示します。矢印は、ターゲット・クラス (誘導先のクラス) に近い関係線の誘導先の終端に付けます。誘導可能性プロパティーのデフォルト値は true です。
例
オーダー・エントリーの例では、「注文」と「顧客」間の関連は双方向に誘導可能です。つまり、「注文」は「注文」を出した「顧客」を知る必要があり、「顧客」は出した「注文」を知る必要があります。矢印が示されていない場合は、関連は双方向に誘導可能であると見なされます。
「顧客」と「住所」間の関連の場合は、「顧客」は「住所」を知る必要がありますが、「住所」は、どの「顧客」(または他のクラス。住所を持っているものは多数あるため) が住所と関連付けられているのかを知りません。その結果、この関連の「顧客」端の誘導可能性プロパティーは無効になり、次のようなダイアグラムができます。

関連の誘導可能性を示すように更新された「オーダー・エントリー・システム」クラス
クラスに自分自身への関連がある場合があります。これは、必ずしもそのクラスのインスタンスが自分自身に関連することを意味するものではありません。多くは、クラスが同じクラスの別のインスタンスに関連している場合の 1 つのインスタンスを意味しています。自己関連の場合には、関連の目的を区別するためにロール名が重要です。
例
「従業員」クラスに関する次のような自己関連を考えます。

この例では、ある従業員が他の従業員への関連を持つ場合があります。このような従業員は管理者であり、他の従業員は管理者のスタッフ・メンバーです。従業員は自分の管理者を知っており、管理者は自分のスタッフを知っているので、この関連は双方向に誘導可能です。
クラス間に 2 つの関連を定義するのは、オブジェクトが 2 回関係付けられることを意味します。各関連を通じて、特定のオブジェクトを異なるオブジェクトにリンクできます。各関連は独立しており、ロール名で区別されます。前記のように、「顧客」は同じクラスの異なるインスタンスとの間に関連を持つことができ、各関連は異なるロール名で示されます。
関連の多重度が 2 以上の場合、関連するインスタンスを順序付きにできます。ロールの順序付きプロパティーとは、関連に参加するインスタンスに順序が付いていることを示しています。デフォルトでは順序は付いていません。モデルでは、順序を維持する方法は指定されません。順序付きの関連を更新する操作において、更新された要素を挿入する位置を指定する必要があります。
関連の個々のインスタンスはリンクと呼ばれます。したがって、リンクとはインスタンス間の関係です。リンク上をメッセージが送信される場合があります。また、リンクはオブジェクト間の参照と集約を表す場合があります。詳しくは、『ガイドライン: コミュニケーション図』を参照してください。
関連クラスは、クラスのプロパティー (属性、操作、関連など) も備えている関連です。関連クラスは関連パスからクラス記号へ引かれた破線によって示され、クラス記号には関連に対する属性、操作、関連が含まれます。この属性、操作、関連は、元の関連そのものに適用されます。関連の各リンクは、示されているプロパティーを備えています。関連クラスを最もよく使用するのは、多対多の関係を整理するときです (次の例を参照)。原則として、関連とクラスの名前は同じでなければなりませんが、必要であれば異なる名前を付けてもかまいません。省略された関連クラスは、関連の属性だけを含みます。この場合には、関連クラス名を省いて独立性を強調しないことができます。
例
前の「従業員」の例を拡張して、「従業員」(スタッフ) が別の「従業員」(管理者) のために働く場合を考えます。管理者は、一定期間におけるスタッフ・メンバーの働きを考慮して、スタッフ・メンバーの定期的な評価を行います。
査定は、管理者とスタッフ・メンバーのどちらか一方だけの属性ではありませんが、次に示すように情報を関連そのものに関連付けることができます。

関連自体に関する情報を獲得する関連クラス「査定」
別のインスタンスに関連づけられたインスタンスのセットにさらに制約を加え、定義するために使用します。オブジェクトと限定子の値で、関連にあるオブジェクトのユニークなセットを識別し、複合キーを形成します。
修飾することにより、通常は相対するロールの多重度が減少します。全体の多重度は、最初のクラスと指定された限定子の値に関連づけられた関係するクラスのインスタンス数を示します。限定子は、修飾するクラスに接続された関連の終端上の小さな箱として描かれます。限定子は、クラスではなく関連の一部です。限定子の箱では、限定子の値を複数指定することができます。修飾は値のリスト全体に基づいています。限定子付き関連は、関連属性の変形です。
例
品目名と製品間の関連を改良する次の例を考えます。品目名は、注文された製品と関連があります。各「品目名」は、ただ 1 つの「製品」だけを参照しています。一方、「製品」は、多数の「品目名」で注文されることができます。この関連を、限定子製品コードで修飾することにより、各製品にはユニークな製品コードがあることを示すことができます。また、この製品コードを使って、品目名と製品とが関連することを示すこともできます。

「品目名」と「製品」の間の関連には「製品コード」という限定子があります。
n 項関連とは、3 つ以上のクラス間の関連で、1 つのクラスが 2 度以上現れることもあります。n 項関連は大きなひし形で表し、参加するクラスごとに関連パスを 1 本描きます。これは、関連を示す伝統的なエンティティー関係モデルの記号です。2 項関連は、実際のモデルで使用する関連の大部分がこれなので、簡潔さを高めるためにひし形を省略して描きます。n 項関連はごくまれで、クラスに昇格させてモデル化することもできます。n 項関連にも関連クラスを持たせることができ、ひし形からクラス記号に破線を引くことで示します。ロールにはロール名を付けられますが、多重度が複雑になるため、候補キーをリストアップして指定するのが最善の方法です。多重度がある場合には、多重度は他の n-1 個のオブジェクトの組に対するインスタンスの数を表します。n 項関連のほとんどは、限定子付き関連または関連クラスを使用することで除去できます。また、n 項関連は通常のクラスで置き換えることも可能です。ただし、この場合には、参加オブジェクトの特定の組に対して発生することのできるリンクは 1 つだけである、という制約を失います。
|