連載
Javaオブジェクトモデリング
第6回
静的モデル:データ型におけるUMLとJavaのマッピング(2)
浅海智晴
2002/11/6
6.サンプルプロファイル |
それでは、材料が出そろったところでサンプルプロファイルを考えることにしましょう。
■■6.1 UMLとJavaのマッピングの論点■■
UMLのデータ型は、「UML定義データ型」と「ユーザー定義データ型」に分けることができました。まずUML定義データ型とユーザー定義データ型をどのような形で、Javaとのマッピングに用いるのかという点が1つの論点となります。この問題については「ユーザー定義データ型のみを用いる」というのが妥当な選択です。
次の論点はUMLのデータ型(ユーザー定義データ型)とJavaのモデル要素の対応関係です。
第1の案として、図1に示すように、UMLのユーザー定義データ型をJavaのプリミティブ型、UMLのクラスをJavaのクラスにマッピングする方法が考えられます。仕様上はこれが最も素直な方法なのですが、現実の開発に用いるにはかなり不便です。
図1 第1の案 |
第2の案は、図2に示すように、UMLのユーザー定義データ型をJavaのプリミティブ型とJavaのクラスの両方にマッピングする方法です。
図2 第2の案 |
この第2案を採るのであれば、Javaクラスの中で、データ型にマッピングするものと、クラスにマッピングするものの峻別(しゅんべつ)を明確に行えるようになっている必要があります。
■■6.2 サンプルプロファイル■■
サンプルプロファイルでは第2の案を採ります。このとき、Javaクラスの中でデータ型にマッピングするオブジェクトを明確化しなければなりませんが、この目的で、値を表現するためのオブジェクトである「バリューオブジェクト」を導入しました。つまり、バリューオブジェクトをデータ型にマッピングし、それ以外のオブジェクトをクラスにマッピングするという戦略を採ります。
図3は、サンプルプロファイルにおけるマッピングです。
図3 サンプルプロファイルの考え方 |
仮想的なメタモデル要素である“データ型”を導入し、これにJavaのプリミティブ型とバリューオブジェクトのクラスをマッピングします。そして、この“データ型”をUMLのデータ型にマッピングすることで、Javaのメタモデル要素とUMLのメタモデル要素のマッピングを行うわけです。
このプロファイルでは、Javaのオブジェクトを以下の2つに分ける必要があります。
- バリューオブジェクト
- バリューオブジェクト以外の一般のオブジェクト
ここで、バリューオブジェクトであるためには、以下の性質を持っている必要があることを説明しました。
- 変数への代入に特別な配慮がいらないこと
- 内容による比較ができること
さらに、この性質を実現するためには、以下の実装を行うことになることも説明しました。
- イミュータブルオブジェクト
- 内容による比較を行うequalsメソッド
このバリューオブジェクトを導入することで、サンプルプロファイルを機能させることができるようになります。
【■■6.3
コラム:“データ型”と“クラス”■■】
今回、データ型のサンプルプロファイルのマッピングに、クラスのマッピングの情報(第4回を参照)を加えると図4となります。
“データ型”と“クラス”という仮想的なメタモデル要素を補助線にしてUMLのメタモデルとJavaのメタモデルを接続しています。 |
■■6.4 記法■■
それでは、サンプルプロファイルにおけるUMLによる記法について考えてみます。
●6.4.1 プリミティブ型
プリミティブ型の記法は図5となります。これは、一般的なUMLの記法なので問題ありませんね。
図5 プリミティブ型 |
●6.4.2 バリューオブジェクト
バリューオブジェクトの記法にはいろいろな考え方があります。図6に4つの記法を示しました。
図6 バリューオブジェクト(クリックすると拡大します) |
(1)はUMLの仕様を尊重した記法です。Pointがデータ型であることを明確にするためにステレオタイプdatatypeを明記しています。ただし、この記法の場合、Pointがオブジェクトとして実装されているというニュアンスが分からなくなってしまいます。
(2)はバリューオブジェクトをデータ型でなく一般のクラスとして表現した記法です。この記法を用いるとクラス図が煩雑になりますが、場合によってはこの記法がよい場合もあるでしょう。
(3)は(1)の簡略版です。この記法ではデータ型でない分類子を属性に使用していることになり、UMLの定義とは厳密な意味では違いがあります。しかし、実用上はこの方法でも十分でしょう。運用において属性にすることができるオブジェクトはバリューオブジェクトのみであるという点が明確になっていれば問題は起きません。
(4)は(3)の変形ですが、クラスのプロパティにユーザ拡張のプロパティ値valueを指定することで、バリューオブジェクトであることを明確にしています。UMLの拡張機能であるステレオタイプやプロパティを使えば、他にも色々な指定方法を考えることができます。
以上、4つの記法を考えました。どの方法を選ぶのがよいかというのはケースバイケースなのですが、現実的には(3)の方法が簡単でもあるし、十分な実用性を持っています。(3)を基本に考えた上で、問題が発生した場合に、必要に応じて他の方法を採用するのがよいでしょう。いずれにしても重要なのは、「UMLの属性にはJavaのプリミティブ型かバリューオブジェクトのみを用いる」という運用を徹底させることです。
3/3
|
Javaオブジェクトモデリング 第6回 | |
Javaによるデータ型の実装 | |
バリューオブジェクトの実装例 | |
サンプルプロファイル |
Javaオブジェクトモデリング INDEX |
IT Architect 連載記事一覧 |