矢沢久雄

図1●電卓というシステム
 今回は,クラス図とオブジェクト図の役割とかき方を学習します。はじめに,オブジェクト指向におけるクラス,インスタンス,および「オブジェクトという用語の意味を説明しておきましょう。ここでは,図1に示した電卓をオブジェクト指向で分析してみます。電卓は,複数のオブジェクトから構成されたシステムです。

 この電卓は,電卓の「土台」,8けたで計算結果を表示する「液晶画面」,計算結果をクリアする[C]ボタン,数値を入力する[0]~[9]ボタン,小数点を入力する[・]ボタン,計算の種類を指定する[+]~[÷]ボタン,および計算を実行する[=]ボタンから構成されています。土台が1つ,液晶画面が1つ,ボタンが17個なのですから,全部で19個のオブジェクトから構成されたシステムだと考えられます。「オブジェクト(object)」は,一般用語として「物」を表す言葉であり,それはオブジェクト指向においても同じです。

 電卓を構成するオブジェクトの中には,よく似た特徴を持つものがあります。それは,ボタンです。ボタンは17種類ありますが,どれもボタンであることに変わりはありません。似たものをまとめて分類し,名前を付けたものが「クラス(class)」です。17個のボタンは「ボタン・クラス」という名前で分類できます。オブジェクトが1つしかない土台と液晶画面も,「土台クラス」と「液晶画面クラス」という名前で分類できます。

 電卓を構成する19個のオブジェクトが,3つのクラスに分類できたことになります。これによって,システムが単純化されたことが分かるでしょう。オブジェクト指向によって複雑で大規模なシステムを単純化し,効率的に作成できるというイメージをつかんでいただけたはずです。

図2●クラスとインスタンス
 クラスは抽象的な概念であり,それ自体には実体がありません。「ボタン・クラス」,「土台クラス」「液晶画面クラス」,があっても,電卓ができるわけではありません。システムを作成するためには,これらのクラスを基にして,具体的な「緑色の土台」,「8けたの液晶画面」,[+]ボタンや[5]ボタンなどの実体を作成することが必要になります。このようなクラスの実体を「インスタンス(instance)」と呼びます。インスタンスは,抽象的なクラスを具現化したものです。

「クラスのインスタンス=オブジェクト」と言うことになりますが,「オブジェクト」という言葉が一般用語であるため,「クラスの実体」という意味合いを強調するときに「インスタンス」という言葉が使われます。ボタン・クラスの例でも分かるとおり,1つのクラスから複数のインスタンスを作成できます。このことから,クラスはインスタンスを作成するためのひな型であるとも考えられます(図2[拡大表示])。

図3●クラス図のかき方

●クラス図のかき方

 UMLでクラスを図示するために使われるのが「クラス図」です。クラス図は,3つの領域で区切られた長方形で表されます。一番上の領域に「クラス名」,中央の領域に「属性」,一番下の領域に「操作」を記述します。属性とはクラスが持つデータのことです。操作とはクラスが持つ処理のことです。操作は,プログラムのソース・コードでは関数となるので,操作を表す言葉の末尾に( )を付けます(C++やJavaの関数は,ソースコード上でMyFunc( )のように記述されます)。クラス名は一つだけですが,属性や操作は複数あってもかまいません。属性と操作の表記を省略して,クラス名だけのクラス図をかくこともできます。属性にデータ型と初期値を明記し,操作に引数リストと戻り値を明記することもできます(図3[拡大表示])。

図4●電卓のクラス図
 図4[拡大表示]に電卓のクラス図を示します。属性や操作の前にある「-」や「+」は,クラスを使う側から見えるかどうか(利用可能であるかどうか)を表すもので,必要に応じて明記します。-は見えないことを表し,+は見えることを表します。

●クラスの関連を示す方法

 一つのシステムは複数のクラスから構成され,個々のクラスは他のクラスと何らかの関連を持っている場合があります。クラス間の関連を図に示すには,クラスを表す長方形同士を実線で結び,実線の両端に関連するインスタンスの数(これを「多重度」と呼びます)を示し,線の上に方向を表す矢印とともに関連の説明を記述します。電卓では,一つの土台に17個のボタンが付いているのですから,図5のように表せます。ここでは,クラスの属性と操作を省略しています。液晶画面と土台の関連がどうなるかも考えてみてください。

図5●クラスの関連を示す
 クラスやオブジェクトの関連として「合成」や「汎化」を表すこともあり,どちらもクラス図を実線で結ぶことで表されます。合成とは,一つのクラスの中に他のクラスが含まれることです。汎化とは,一つのクラスの機能を引き継いで,他のクラスを作成することです。オブジェクト指向プログラミングの世界では,汎化のことを「継承」とも呼びます。このあたりは,詳しく説明すると長くなってしまうので,「クラス図を実線で結んで説明を付加することで関連が示されるのだ」ということだけを覚えておいてください(継承に関する関連記事はこちら)。合成の場合は,実線の一方の端をひし形とし,汎化の場合は,実線の一方の端を白抜きの三角形とします。

●ステレオ・タイプでUMLを拡張できる

 UMLでは様々な図記号が規定されていますが,それだけでは表現が不十分な場合もあるでしょう。ノートを使って注釈を記入することもできますが,あまり多用すると図が煩雑になってしまいます。このような場合には,「ステレオ・タイプ」を使います。ステレオ・タイプとは,「<<ステレオ・タイプ名>>」という構文で,UMLの図記号の中に独自の意味合いを付加するものです。ステレオタイプは,UMLを拡張するものだと言えます。

図6●ステレオタイプの使用例
 ステレオ・タイプ名には,任意の文字列を記述してかまいませんが,「例外(エラーのこと)」を表す <> や「インタフェース(クラスの仕様のこと)」を表す <> など,一般的によく用いられるものもあります。図6は,インタフェースを表すステレオ・タイプをクラス図に付加した例です。

●オブジェクト図のかき方

図7●オブジェクト図のかき方
 オブジェクト図のかき方を図7[拡大表示]に示します。長方形の中に「オブジェクト名:クラス名」を下線付きで記述するだけです。下線を付けることがポイントです。長方形を上下2つの領域に分け,下の領域に「属性:型=値」という形式で,オブジェクトの持つ属性の現在の値を明記することもできます。オブジェクト図は,セミナーの第4回で説明するシーケンス図などでも使われます。

 クラス図とオブジェクト図は,システム開発の様々な工程で参照されるものです。UMLの中心的な図であると言えるでしょう。開発者は,クラス図やオブジェクト図とにらめっこをしながらシステムを設計し開発していくのです。