連載
Javaオブジェクトモデリング
第2回 静的モデルの全体像
4.クラス図のモデル |
オブジェクト指向開発におけるクラス図とJavaの関係に対する本連載の立場が明確になりました。次回以降で、クラス図とJavaの具体的なマッピングについて検討していきます。その準備として、クラス図およびJavaの静的モデルについて概観します。
クラス図は、突き詰めて考えていくと、クラス、リレーションシップ、パッケージの3つのモデル要素で構成されています。
■■4.1 クラス■■
クラスは、共通の性質を持ったオブジェクトを抽象化したモデル要素で、クラス図の中心となるものです*1。
*1:クラス一般をメタモデルのレベルで議論する際は「分類子(classifier)」という用語を使う方が正確ですが、表現がとっつきにくいので、ここでは「クラス(class)」という用語を用います。
●4.1.1 クラスの構成
クラスを示すアイコンを図11に示します。
図11 クラスアイコン |
クラスアイコンは複数の区画から構成されます。必ず必要なのが名前区画(name compartment)で、ここにクラス名が記述されます。クラスに対するステレオタイプと要素プロパティもこの名前区画に記述されます。
名前区画の下には、必要に応じて複数の並び区画(list compartment)が配置されています。クラス用の並び区画としては、属性用の並び区画とオペレーション用の並び区画が標準で定義されています。
属性用の並び区画には、属性の定義が記述されます。属性は可視性(visibility)、名前(name)、多重度(multiplicity)、型表現(type-expression)、初期値(initial-value)、プロパティ文字列(property-string)から構成されます。
オペレーション用の並び区画には、オペレーションの定義が記述されます。オペレーションは可視性(visibility)、名前(name)、パラメータ並び(parameter-list)、返却値型表現(return-type-expression)、プロパティ文字列(property-string)から構成されます。
また、属性とオペレーションにはほかのモデル要素と同様に、ステレオタイプによる機能の拡張を行うことができます。図11では、Javaのコンストラクタを表現するため、オペレーションに対してステレオタイプconstructorを指定してみました。なお、このステレオタイプconstructorは、UMLで標準に定義されているものではありません。つまり、UMLの標準機能の範囲ではJavaの言語機能を正確に表現しきれないので、このような形でステレオタイプを用いて拡張していく必要があるわけです。このような拡張に対する検討もJava向けプロファイルの一環で行うことになります。
●4.1.2 クラスの種類
一口にクラスといっても、さまざまな用途のクラスが存在します。UMLではステレオタイプを使用して、クラスの種類を定義することができます。Java向けのクラスとして、図12のように、具象クラス、抽象クラス、インターフェイス、ユーティリティ、例外、といったクラスを利用することになります。
図12 クラスの種類 |
具象クラスはインスタンス化して利用されるクラス、抽象クラスはそれ自体はインスタンス化されず、サブクラスから継承されることを前提としたクラスです。
インターフェイスはオペレーションの集まりをモデル化したもので、Javaのinterfaceに対応します。
ユーティリティはグローバルなスコープを持つ変数や手続き、関数をクラスとして定義したものです。Javaプログラミングにおいても重要な構成要素となっています。
例外はプログラム実行中の振る舞い上の失敗(fault)を通知するためのシグナル(signal)です。Javaでは言語仕様としてサポートされています。
以上、クラス図の重要な構成要素であるクラスについて概観しました。クラスとJavaの具体的なマッピングについては次回説明します。
■■4.2 リレーションシップ■■
リレーションシップは、クラスとクラスの間の関係を表現するモデル要素です。リレーションシップには多様な表現方法が用意されており、リレーションシップの用い方がクラス図の重要な情報となります。
リレーションシップには以下の種類があります*2。
- アソシエーション
- 集約
- 合成集約
- 汎化
- リアライゼーション
- ディペンデンシィ
*2:UMLのメタモデル上では、リレーションシップの定義はこの分類とは異なった形で行われています。本連載では、直感的に分かりやすいことを重視して、アイコンの形状によるリレーションシップの分類を用いることにします。
これらのリレーションシップは、図13に示すように専用のアイコンが用意されています。
図13 リレーションシップの種類 |
アソシエーション(association)はクラスとクラスの間の結合を示す関係です。
集約(aggregation)と合成集約(composition)はアソシエーションの一種で、集約は全体―部分(whole―part)の関係を持つアソシエーション、合成集約は強い結合を持つ集約という意味を持っています。アソシエーション、集約、合成集約は、図14に示すような関係となります。集約はアソシエーションの部分集合であり、合成集約は集約の部分集合です。
図14 アソシエーション、集約、合成集約の関係 |
汎化(generalization)は、より一般的なモデル要素とより特殊なモデル要素を分類関係として表現したものです。正確な定義は異なりますが、一般的には継承と考えると分かりやすいでしょう。
リアライゼーション(realization)は、仕様モデルと実装モデルの関係を表現するリレーションシップです。Javaでは、interfaceとこれをimplementsするクラスの間でリアライゼーションの関係が発生します。
以上、アソシエーション、集約、合成集約、汎化、リアライゼーションがクラス間の主要なリレーションシップですが、これらに分類できないリレーションシップもいろいろあります。このようなリレーションシップを表現するために用意されているのがディペンデンシィ(dependency)です。
リレーションシップとJavaの具体的なマッピングについては、次々回より複数回に分けて取り上げる予定です。
■■4.3 パッケージ■■
大規模なシステムでは、クラスなどのモデル要素の論理的な集まりを1つの大きなモデル要素で表すことができると便利です。この目的で使用されるのがパッケージであり、強い相関関係のあるモデル要素を束ねることを目的としています。
サブシステムは、パッケージの一種であり、モデル要素の物理的な集まりを束ねたモデル要素です。
パッケージとサブシステムは、UML上では図15のようにパッケージアイコンを用いて表現されます。
図15 パッケージの種類 |
3/4
|
Javaオブジェクトモデリング 第2回 | |
UMLの静的モデル | |
モデルの流れ | |
クラス図のモデル | |
Javaの静的モデル |
Javaオブジェクトモデリング INDEX |
IT Architect 連載記事一覧 |