静的モデル:データ型におけるUMLとJavaのマッピング(2)Javaオブジェクトモデリング(6)(3/3 ページ)

» 2002年11月06日 12時00分 公開
[浅海智晴,@IT]
前のページへ 1|2|3       

6.サンプルプロファイル

 それでは、材料が出そろったところでサンプルプロファイルを考えることにしましょう。

6.1 UMLとJavaのマッピングの論点

 UMLのデータ型は、「UML定義データ型」と「ユーザー定義データ型」に分けることができました。まずUML定義データ型とユーザー定義データ型をどのような形で、Javaとのマッピングに用いるのかという点が1つの論点となります。この問題については「ユーザー定義データ型のみを用いる」というのが妥当な選択です。

 次の論点はUMLのデータ型(ユーザー定義データ型)とJavaのモデル要素の対応関係です。

 第1の案として、図1に示すように、UMLのユーザー定義データ型をJavaのプリミティブ型、UMLのクラスをJavaのクラスにマッピングする方法が考えられます。仕様上はこれが最も素直な方法なのですが、現実の開発に用いるにはかなり不便です。

ALT 図1 第1の案

 第2の案は、図2に示すように、UMLのユーザー定義データ型をJavaのプリミティブ型とJavaのクラスの両方にマッピングする方法です。

ALT 図2 第2の案

 この第2案を採るのであれば、Javaクラスの中で、データ型にマッピングするものと、クラスにマッピングするものの峻別(しゅんべつ)を明確に行えるようになっている必要があります。

6.2 サンプルプロファイル

 サンプルプロファイルでは第2の案を採ります。このとき、Javaクラスの中でデータ型にマッピングするオブジェクトを明確化しなければなりませんが、この目的で、値を表現するためのオブジェクトである「バリューオブジェクト」を導入しました。つまり、バリューオブジェクトをデータ型にマッピングし、それ以外のオブジェクトをクラスにマッピングするという戦略を採ります。

 図3は、サンプルプロファイルにおけるマッピングです。

ALT 図3 サンプルプロファイルの考え方

 仮想的なメタモデル要素である“データ型”を導入し、これにJavaのプリミティブ型とバリューオブジェクトのクラスをマッピングします。そして、この“データ型”をUMLのデータ型にマッピングすることで、Javaのメタモデル要素とUMLのメタモデル要素のマッピングを行うわけです。

 このプロファイルでは、Javaのオブジェクトを以下の2つに分ける必要があります。

  • バリューオブジェクト
  • バリューオブジェクト以外の一般のオブジェクト

 ここで、バリューオブジェクトであるためには、以下の性質を持っている必要があることを説明しました。

  • 変数への代入に特別な配慮がいらないこと
  • 内容による比較ができること

 さらに、この性質を実現するためには、以下の実装を行うことになることも説明しました。

  • イミュータブルオブジェクト
  • 内容による比較を行うequalsメソッド

 このバリューオブジェクトを導入することで、サンプルプロファイルを機能させることができるようになります。

6.3 コラム:“データ型”と“クラス”

 今回、データ型のサンプルプロファイルのマッピングに、クラスのマッピングの情報(第4回を参照)を加えると図4となります。

ALT 図4 “データ型”と“クラス”

 “データ型”と“クラス”という仮想的なメタモデル要素を補助線にしてUMLのメタモデルとJavaのメタモデルを接続しています。



6.4 記法

 それでは、サンプルプロファイルにおけるUMLによる記法について考えてみます。

6.4.1 プリミティブ型

 プリミティブ型の記法は図5となります。これは、一般的なUMLの記法なので問題ありませんね。

ALT 図5 プリミティブ型

6.4.2 バリューオブジェクト

 バリューオブジェクトの記法にはいろいろな考え方があります。図6に4つの記法を示しました。

ALT 図6 バリューオブジェクト(クリックすると拡大します)

 (1)はUMLの仕様を尊重した記法です。Pointがデータ型であることを明確にするためにステレオタイプdatatypeを明記しています。ただし、この記法の場合、Pointがオブジェクトとして実装されているというニュアンスが分からなくなってしまいます。

 (2)はバリューオブジェクトをデータ型でなく一般のクラスとして表現した記法です。この記法を用いるとクラス図が煩雑になりますが、場合によってはこの記法がよい場合もあるでしょう。

 (3)は(1)の簡略版です。この記法ではデータ型でない分類子を属性に使用していることになり、UMLの定義とは厳密な意味では違いがあります。しかし、実用上はこの方法でも十分でしょう。運用において属性にすることができるオブジェクトはバリューオブジェクトのみであるという点が明確になっていれば問題は起きません。

 (4)は(3)の変形ですが、クラスのプロパティにユーザ拡張のプロパティ値valueを指定することで、バリューオブジェクトであることを明確にしています。UMLの拡張機能であるステレオタイプやプロパティを使えば、他にも色々な指定方法を考えることができます。

 以上、4つの記法を考えました。どの方法を選ぶのがよいかというのはケースバイケースなのですが、現実的には(3)の方法が簡単でもあるし、十分な実用性を持っています。(3)を基本に考えた上で、問題が発生した場合に、必要に応じて他の方法を採用するのがよいでしょう。いずれにしても重要なのは、「UMLの属性にはJavaのプリミティブ型かバリューオブジェクトのみを用いる」という運用を徹底させることです。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ