関連や関係の落とし穴(後編)UML BASIC LECTURE(4)(1/2 ページ)

» 2004年09月03日 12時00分 公開
[羽生田栄一(取締役会長), 岡村敦彦,豆蔵]

 「関連や関係の落とし穴(前編)」では関連の多重度にまつわる落とし穴を整理したのちに、「関連」「関係」のさまざまな種類を確認した。「関連や関係の落とし穴(後編)」は、オブジェクトのライフサイクルと「関連」「関係」とのつながりを考察しながら、「関連」クラスに関する誤解にまで話を展開する[編集局]。

ライフサイクル

 さて、それではコンポジションの話に戻ります。まず1点目のライフサイクルの話から始めましょう。ここでいうライフサイクルとは、どこからどこまでを表しているのでしょうか。もちろんオブジェクトの生成から消滅までの範囲であるのは間違いないのですが、この条件が適用されるのはどのような場合でしょうか。

 例えば、生成時について考えてみましょう。全体側と部分側は生成時から完全に一致していなければならないのでしょうか。つまり全体側が生成されたのと同時に部分側も生成されるのでしょうか。これは、ちょっと考えれば分かると思います。

 よくある例として自動車を考えてみます。自動車は、ボディやエンジン、タイヤ、ハンドルなどさまざまな部品から成立している製品の概念です。従って、自動車とエンジンは、通常の関連ではなく全体と部分の関連、つまり集約として考えることができます。さらにライフサイクルについて考えると、エンジンは自動車が廃車になると(通常は)利用価値がなくなり、存在意義を失います。従って消滅のライフサイクルを同一にするコンポジションとして考えることができるわけです。

ALT 図4 自動車

 その一方、生成時に関してはどうでしょうか。自動車の部品は、それぞれ個別に製作され、それらが組み立てられて自動車が造られます。つまり、エンジンができた段階では、まだ自動車として認識できるものは存在していない可能性があるわけです。どの時点をもって自動車の完成とするかはまた別の問題ですが、少なくとも自動車とエンジンは、同時に存在を開始するわけではありません。ここから分かることは、消滅時においてはその命運を共にする必要はあるものの、生成時においては特に特別な関係がなくても構わない、ということが理解できるかと思います。

 これは、もっと実装に近い話でもいえることで、例えばファクトリのような仕組みを考えてみても、インスタンスを生成するクラスとそれを保持するクラスが別の場合というのは、よくある話だと思います。

コンポジションの共有?

 さて、次は共有不可についてです。まず以下の図を見てください。

ALT 図5 共有不可……?

 いかがでしょう。コンポジションの部分側クラスが、2つのクラスとつながっています。これを見て、「ああ、よくある間違いだね。コンポジションは共有できないのに。この人はUMLを分かってないね……」といってしまっては、実はその人こそ UMLを分かっていない、ということになってしまいますので、十分に注意が必要です。

 え? そんなはずはない? これは明らかに間違い? 本当にそうでしょうか。そう思われる人は、まずUMLの文法にとらわれずに、素直にこの問題領域を考えてみてください。

 例えば、リンゴで考えてみましょう。木クラスのインスタンスであるどこかのリンゴの木には、季節になるとリンゴの実が実ります。木からしてみると、実がない場合もあるし、実がなる場合は複数なので、多重度は 0 以上です。また、リンゴの木がなくなればリンゴの実だけでは存在できないため、コンポジションとして表現できます。しかしある程度熟してきた結果、採り入れの時期になるとリンゴの実は収穫されて単独で出荷可能となります。そしてそれが何らかの食品として利用される、例えばアップルパイを考えてみると、リンゴの実は明らかにアップルパイの一部となり、アップルパイを構成する一要素となります。

 この世界を表現してみましょう。

  • リンゴの木が単独で存在している
  • 季節になると、リンゴの実がなる
  • 時期が来ると、リンゴの実は収穫され、単独で存在可能になる
  • 出荷されたリンゴの実は、ある製菓工場に運ばれる
  • この時点では、リンゴの実はすでにリンゴの木との関連はない
  • リンゴの実は加工され、アップルパイの一部となる
  • アップルパイは一般消費者の元に売られ、食べられる
  • アップルパイが食べられた時点で、アップルパイの一部であったリンゴの実も消滅する

 つまり、リンゴの実には以下の状態が考えられます。

  • リンゴの木の一部
  • リンゴの実が単独で存在している
  • アップルパイの一部となる

 実は先ほどの図における多重度は、リンゴの実が上記のような状態を取り得ることを許容しています。

 ということで、コンポジションの本質は単に共有不可というわけではなく、「同時に」共有することはできない、ということになります。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ