UML図は、構造やグループ化のエンティティの理解や関連付けに容易に利用できる方法です。オブジェクト指向のプログラミングの実行では、すべての技術面においてよく理解しておくこと、そして論理的な関係の概念を完全に理解しておくことが重要です。
UMLは、どのように1つまたは複数のものが互いに関連付けられるのか理解する際に役立ちます。関係性で最も一般的なものは、アソシエーション(関連)です。アソシエーションの詳細を確認していきましょう。
- 目次 -
Part 1: アソシエーションの関係性
1.1 アソシエーションの関係性とは
初心者向けの言葉で説明すると、アソシエーションの関係性は2つの異なるユニットの間に見られる関係性のことです。エンティティ(実体)とリンク間における共通性を求めます。アソシエーションでは、継続的な参照で論理的な繋がりを設けられます。UML図ではアソシエーションは、単線を使い、同じまたは異なるクラスを繋げて表し、1対1、1対複数、複数対複数のクラス間を表します。アソシエーションの関係性は、2つのエンティティ間の対話の関連付けを表すため、曖昧にせずに明白に名前を付けておく(ラベリング)必要があります。これは、小さな矢印を使って関係性がわかりやすいようにしておきます。
以下の画像の例では、銀行と従業員間におけるアソシエーションの関係性が表されています。複数の線が主となるクラスから発生していて(この場合「銀行」から)、この図では1対複数のアソシエーションの関係性を確認することができます。
1.2 ジェネラリゼーションとアソシエーションの比較
名前が示すとおり、ジェネラリゼーション(汎化)は、汎化を軸にして、さらに類似するオブジェクトを分類する方法です。エンティティは、一般的なエンティティと一意のエンティティ間にある親子関係を表します。このとき、一意のエンティティは、一般的なクラスを特別な形式にするようにします。比較すると、アソシエーションは異なるエンティティを関連付け、どのように、ある1つのクラスがほかの関連付けられたオブジェクトの機能を利用するのかを表します。
ジェネラリゼーションは、関係性「kind-of」を表し、アソシエーションは関係性「has-a 」を示すのに役立ちます。これは、アソシエーションは共通性に基づいた関連付けを表す一方で、ジェネラリゼーションはインヘリタンス(継承)の表示に関連付けられているという意味です。
Part 2: アソシエーションの関係性の種類
2.1 多重度
多重度のアソシエーションは、関連付けられているクラスが複数回出現する場合を指します。エンティティを繰り返すかわりに、関連付けが可能な最大/最小のインスタンスを指定します。そのため、そのような関係性では、アソシエーションの線にアスタリスク(*)を付けます。アスタリスクは中間に位置する最大を表しています。
以下の画像は、異なる状況で、どのように多重度が表されているかを理解する際に役立ちます。
2.2 直接アソシエーション
その名前に表されているように、直接的なアソシエーションは、アソシエーションの関係性内の対話の流れの方向を指します。既定では、アソシエーションの関係性は双方向でナビゲーション可能である一方、直接的なアソシエーションは一方向のみに流れを誘導するのに役立ちます。 直接的なアソシエーションは単線の矢印で表します。
ここでは、サーバーと顧客間の単一方向のアソシエーション示しています。矢印の方向は、サーバーがクライアントのリクエスト(要求)を処理していることを表しています。
2.3 対称アソシエーション
対称アソシエーションは、同じクラスのインスタンス間における関係性です。この種のアソシエーションはさらに、シンメトリカル(対称)とアシメトリ(非対称)2の種類に分類されます。それぞれを表す特定のシンボルは決まっていませんが、関係点は同じクラスに起因します。
EdrawMaxはUML図を簡単に書くためのオールインワンの作図ソフトです。EdrawMaxは、無料ダンロードできるので、ぜひ一度ご体験してください!
Part 3: アグリゲ―ションとコンポジションの比較
アグリゲ―ション(集約)とコンポジション(構成)はアソシエーションの2つのサブセットですが、コンポジションはアグリゲ―ションの関係性をさらにサブセット化したものです。簡単な言葉で表すと、 アグリゲ―ションはあるクラスのオブジェクトが別のクラスのエンティティにアクセスできる場合と定義できます。一方でコンポジションは双方向の関係性を表し、オブジェクトは一度に1つの構成物の一部のみとなります。
3.1 UML図で表すアグリゲ―ション
アグリゲ―ションは、より複雑なオブジェクトを作成する際、エンティティが共に構成されるアソシエーションです。 オブジェクトのグループとその共通の関連付けが、それを通じて表されます。アセンブリを表すオブジェクトのグループとアグリゲートを呼びだす、コントロール(制御)のあるポイントを定義します。
UML図では、アグリゲート(親クラス)からアセンブリ(子クラス)に向かうデータの流れが前のクラスに向かってダイヤモンドの形(塗りつぶしなし)で表されています。 部品のクラシファイア(分類要素)あるいはアセンブリのエンティティは、複数のアグリゲートに関連付けることができ、独立して存在しています。
この例は、車が常にホイールとエンジンが正常に働くことを必要としていることを表し、かつエンジンとホイールが必ずしも車が必要ではないことも表しています。ホイールとエンジンは、バス、バイク、機械、その他のものにも使われています。同様に、エンジンはエンジンの点検に必要ですが、エンジンはそれ単体で存在することができ、ほかの乗り物にも関連しています。
3.2 UML図で表すコンポジション
コンポジションもまた双方向で非常に依存性を持つ関係性を表すアソシエーションの種です。構成物が削除されてしまうと、それに関連付けられているその他のエンティティも削除されます。
コンポジションは、親子間の依存性を表します。UML図では、親と子のクラスの間に線を使います。その先の親のクラスに向かったダイヤモンドは、塗りつぶされています。
この図で示されているとおり、人には足、心臓、脳があります。この図が注視しているのが、「人が傷つけられる、あるいは殺される」にあれば、すべての構成物であるエンティティも傷を負ったり、機能したりしなくなります。アグリゲ―ションとは違い、エンティティはそれ自体独立して存在することができません。エンティティは、その人物の一部だからです。
アグリゲ―ション | コンポジション |
---|---|
アソシエーションのサブセット | アソシエーションのサブセット |
弱い種類のアソシエーション | 強い種類のアソシエーション |
関連付けられているオブジェクト同士は互いに独立 | 関連付けられているオブジェクト同士が互いに依存 |
単線と塗りつぶしのない矢印の先端で表す | 単線と塗りつぶした矢印の先端表す |
アグリゲ―ションは「has-a’ relationship」として定義される | コンポジションは「part-of’ relationship」として定義される |
Part 4: コンポジションはアグリゲ―ションより良いのだろうか?
コンポジションは、アグリゲ―ションより強いです。2つのオプジェクト間の関係性はアソシエーションとして引用され、これらの定義はアソシエーションのサブタイプになります。
2つのオブジェクトが互いに独立して存在し、互いに何も所有権を表さない場合は、アグリゲ―ションのアソシエーションとみなされます。 一方、システムの2つのオブジェクトが共存して、互いに依存する必要がある場合はコンポジションとみなされます。このようなアソシエーションは、オブジェクトの所有が打ち消されると、関連付けられているオブジェクトも消えるので、「strong」(強)と定義されます。反対に、アグリゲ―ションは、含まれているオブジェクトの性質がそれを含むオブジェクトに依存していないため、「weak」(弱)の アソシエーションを表します。
アソシエーションは関係性の関連付けにおいて最も基本的かつ最も重要な種類で、システムのオブジェクト同士を繋ぐことができます。誤りのない実装とUML図の作成においては、アグリゲ―ションとコンポジションの2つの種類を区別することが欠かせません。
Part 5: UML図を作成ならEdrawMax
EdrawMaxのようなユーザフレンドリーでツールを豊富に取り揃えたソフトウェアを利用すれば、アソシエーションを伴うUML図の作成は非常に簡単に行えます。編集ツール、カスタマイズ可能に優れたライブラリ、複数のテンプレートのオプションと多岐にわたる機能を備え、良いUML図の作成が簡単なクリック操作で行えるのは想像を超えていると言えるでしょう。初心者、技術に精通した専門家を問わず、ソフトウェアの理解と操作は非常に簡単です。まずは、EdrawMaxをダウンロードして、最も意義のある、刷新的な図の作成を開始してみてください!