クラス図もっと詳しく

ステレオタイプ

UMLはどのプログラミング言語にも依存しない.そこで,UMLにはさまざまな拡張機能が定義されている.ステレオタイプ(streotype)はUMLの拡張機能の一つで,ステレオタイプを用いれば,役割や用法上の違いなどをモデル要素に修飾することができるようになる.ここで,役割や用法上の違いとは,同一の要素でも頻繁に発生する.例えば,一口にメソッドといっても,理論的に役割は異なる.コンストラクタ,イベントなどが存在するだろう.ステレオタイプはこのような違いを明確に記述し,その意味を開発者に伝えるものである.ステレオタイプはギュメ$<<$type$>>$を用いて,ステレオタイプ名を囲み,以下のように記述する.

図:
\begin{figure}\begin{center}
\includegraphics[width=10.2cm]{UMLFIG/class-ext-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

この図はコントロールの役割を持つクラス Component とインターフェイスとしての役割を持つ Container クラス,そして,属性クラスである ControlAttribute の3つを表現している.

C++ 言語には抽象クラスという概念だけで,インターフェイスは存在しない.また,Microsoft .NET には属性クラスという概念が存在する.開発者は Java の AWT を使った GUI アプリケーションの開発でそのクラスが重量か,軽量コンポーネントかを記述したいかもしれない.ステレオタイプを使えば,こうした役割や用法を表現することができる.

一般に次のようなステレオタイプが利用される.

図:
\begin{figure}\begin{center}
\includegraphics[width=9.6cm]{UMLFIG/class-6.eps}
\end{center}\vspace{-1cm}
\end{figure}

派生関連と派生属性

派生関連(inherited association)と派生属性(inherited attribute)はクラス図において他の関連や属性より求めることができる.例えば,Personクラスの年齢属性はPersonの誕生日が分かれば求めることができる.

図: 派生属性
\begin{figure}\begin{center}
\includegraphics[width=11.5cm]{UMLFIG/derived-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

インターフェイス

オブジェクト指向開発の価値ある一つに,実装とは関係なく操作の宣言のみを行なうクラスを設けることができることである.インターフェイスは以下のように記述する.

図:
\begin{figure}\begin{center}
\includegraphics[width=3.5cm]{UMLFIG/inter-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

関連クラス

関連クラス(association classes)はクラスの関連に関する情報を保持するクラスである.

下の図より,人は1つの会社で働くかも知れない.そこで,それぞれの従業員がそれぞれの会社でどのくらいの間働くのかという情報を保持する必要がある.このようなとき,関連にdateRange属性を加えることにより,その情報を保持することができる.

図:
\begin{figure}\begin{center}
\includegraphics[width=8.4cm]{UMLFIG/asso-class-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

限定子

限定関連(qualified associations)はプログラミングの概念である関連配列,マップ,または辞書とUMLで同等なものである.つまり,一対多関連や多対多関連の多のオブジェクトを区別し,クラス間の多重度を減少されるものである.

下の図より,人は1つの会社で働くかも知れない.そこで,それぞれの従業員がそれぞれの会社でどのくらいの間働くのかという情報を保持する必要がある.このようなとき,関連にdateRange属性を加えることにより,その情報を保持することができる.

図:
\begin{figure}\begin{center}
\includegraphics[width=9.5cm]{UMLFIG/qualified-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

依存関係

2つのクラスの間に,なんらかの関係があり,その2つのクラス間の依存度合いが非常に弱い場合(疎結合)は,関連よりも依存関係(dependency)を使うとよい.依存関係の具体的な例を図に示す.

図: 依存関係
\begin{figure}\begin{center}
\includegraphics[width=12.5cm]{UMLFIG/depend-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

このように,依存関係は一時的に相手オブジェクトを使用する際の関係を表す.依存はクラス間に点線矢印で記述する.また線上には,ステレオタイプにより、依存の意味を書くこともできる.

実現関係

実現関係(realization)とは,「仕様」と「実現」を表現するための関係である.図は電話という仕様と,その仕様を実現する携帯電話,PHS,卓上電話の関係を実現関係で表している.また,人というクラスは電話を使うことを依存関係によって示している.このモデルが意味するのは「人は,電話という規格を通して具体的な電話を利用する.よって電話のメーカーやタイプが多少異なっていても操作できる」ということである.

図: 実現関係
\begin{figure}\begin{center}
\includegraphics[width=9.7cm]{UMLFIG/real-1.eps}
\end{center}\vspace{-1cm}
\end{figure}

テンプレート

C++などの言語はテンプレートというものを持っている.この概念を用いるとSetの行動を定義することができる.例えば,

class Set $<$T$>${
 void insert (T nextElement);
 void remove (T anElement);

と書くと,次のようにして特定の要素にsetクラスを作成できる.

Set $<$Employee$>$ employeeSet;

UMLではテンプレートを次のようにして記述する.

図:
\begin{figure}\begin{center}
\includegraphics[width=5cm]{UMLFIG/template-1.eps}
\end{center}\vspace{-1cm}
\end{figure}