この短期集中連載も,今回で最終回となります。これまでに皆さんがマスターしてきたのは,OOP(Object Oriented Programming=オブジェクト指向プログラミング)の基本中の基本である「クラス」と,クラスを対象とした便利な機能である「OOPの三本柱(継承,カプセル化,多態性)」です。ここまでわかれば,OOPの基礎知識は十分なのですが,まだまだスッキリした気分になれないという人がいるかもしれませんね。その理由は,OOPの細かい部分が見えてきたものの,OOPの全体像がつかめていないからでしょう。そんな皆さんをスッキリさせるために,格好の題材があります。それは「UML(ユー・エム・エル,名前の由来は後述)」です。

 UMLは,OOPの考え方を図示する際に使われる表記法です。UMLには9種類の図(ダイアグラム)があります。「9種類も図があるなんて覚えるのが面倒だなあ…」などと嘆いてはいけません。プラス発想で考えてください。たった9種類の図の役割がわかれば,OOPのさまざまな概念を網羅して理解できたことになるのです。すなわちOOPの全体像がつかめるのです。個々の図の細かな描き方を覚える必要などありません。まずは,9種類の図の用途と名称を「OOPでは○○と考えるから△△図を使う」という理屈をつけて言えるようになってください。それでは,始めましょう!

UMLが重要である理由

図1●UMLは統一モデリング言語である
図2●UMLモデリング・ツールの例(グレープシティのWithClass)
表1●UMLの9種類の図
図3●クラス図の例
図4●オブジェクト図の例
図5●クラスの使われ方の表し方
図6●シーケンス図の例
図7●コラボレーション図の例

 はじめに,OOPにおいてUMLが重要である理由を説明しておきます。かつて世の中には,OOPの考え方を図示するためにさまざまな表記方法が存在していました。その中でも特に有名なものとして,James Rumbaugh氏が開発した「OMT(Object Modeling Technique)」,Grady Booch氏が開発した「Booch法」,およびIvar Jacobson氏が開発した「OOSE(Object Oriented Software Engineering)」がありました。たくさんの表記方法があるのは不便なことですね。そこで,1995年に米Rational Softwareが,3氏を集めて統一的な表記方法を開発させました。それがUMLです(図1[拡大表示])。現在では,オブジェクト指向技術の標準化団体であるOMG(Object Management Group)がUMLを認可していて,仕様の管理などを行っています。UMLの最初のバージョン1.0は1997年にOMGに提案され,その改良版であるUML 1.1が同年11月にOMGによって認可されました。

 UMLは,Unified Modeling Language(統一モデリング言語)の略です。「統一」は,3氏の表記方法を統一したことを意味しています。「モデリング」とは,オブジェクト指向の設計のことです。「Language=言語」といっても,UMLはプログラミング言語ではありません。図の表記法を規定したものです。

 有名な3人の大先生(「スリー・アミーゴ」と呼ばれます)の表記方法を統一したものであり,OMG認可の世界標準なのですから,好むと好まざるとにかかわらず,OOPの考え方を図示するならUMLを使うべきです。UMLの図は,手書きでも構いませんが,市販のモデリング・ツールを利用することもできます。モデリング・ツールの種類には日本ラショナルソフトウェアの「Rational Rose」,マイクロソフトの「Visio for Enterprise Architects」,グレープシティの「WithClass」などがあります。このようなモデリング・ツールの中には,単に図を描くだけでなく,図からプログラムのソースコードを自動生成(フォワード・エンジニアリング)したり,ソースコードから図を自動生成(リバース・エンジニアリング)したりすることができるものもあります(図2[拡大表示])。

 UMLは図の描き方を規定しているだけであって,OOPの考え方まで規定しているわけではありません。なぜでしょう? それは,3氏の表記方法は統一できても,3氏のOOPの考え方までは統一できなかったからです。UMLでは,表1[拡大表示]に示した9種類の図が規定されています。個々の図の用途は決まっていますが,図を描く基になるOOPの考え方は,皆さんの自由です。必要に応じて,必要な図だけを使えばよいのです。

【ここまでのまとめ】
・UMLは,OMGが認可した世界標準の統一モデリング言語である。
・UMLは,9種類の図の描き方を規定しているが,OOPの考え方までは規定していない。

クラス図とオブジェクト図

 それでは,UMLの9種類の図のサンプルを示しながら,何を表すために使われるものなのかを説明していきましょう。まず,「クラス図」と「オブジェクト図」です。多くのOOP言語では「クラス」と「オブジェクト」を異なる概念として区別しています。クラスはオブジェクトの定義(型)であり,オブジェクトはクラスの実体です。オブジェクトのことを「クラスのインスタンス」とも呼びます。この考え方はUMLでも同じです。UMLでは,クラスをクラス図で表し,オブジェクトをオブジェクト図で表します。

 クラス図では,四角形の中にクラス名を書いて一つのクラスを表します(図3(a))。UMLでは,クラスのメンバーとなっている変数と関数のことをそれぞれ,「属性」,「操作」と呼びます。属性や操作をクラス図に示す場合は,四角形を三つの領域に区切り,上から順にクラス名,属性,操作を記入します。メンバーの可視性(public=見せる/private=隠す)は,+(見せる)/-(隠す)で示します(図3(b))。メンバーは,page,setPage( ),getPage( )のようにプログラムの表記に合わせても,「ページ数」「ページ数を設定する( )」「ページ数を取得する( )」のように日本語で記述しても構いません(図3(c))。

 オブジェクト図では,四角形の中にオブジェクト名を下線付きで書いて,一つのオブジェクトを表します。何というクラスのオブジェクトなのかを明記する場合は「オブジェクト名:クラス名」と記述します(図4(a))。オブジェクト名を省略する場合は「:クラス名」と記述します(図4(b))。四角形を二つの領域に区切り,上段にオブジェクト名,下段に属性の型と値を「属性名:型=値」という書式で記述することもできます(図4(c))。

 一つのプログラムは,複数のクラスから構成されるのが一般的です。本連載の前回(2003年9月号)で説明したように,複数のクラスの間には3通りの使われ方があります。「メンバーを使う」「継承して使う」「含めて使う」です。メンバーを使うことは,クラス図同士を直線で結び,その上に説明を書き添えて表します(図5(a)[拡大表示])。継承して使うときは,直線の先に白抜きの三角形を付けます。この三角形の向きは,スーパークラス(複数のサブクラスの共通点を抽出したクラス)への汎化を表しています(図5(b)[拡大表示])。含めて使うことは,直線の先に白抜きまたは塗りつぶしたひし形を付けて表します(図5(c)[拡大表示] )。塗りつぶしたひし形を使った場合は,クラス間の結び付きが強い(そのクラスが存在しないと,それを含むクラスが成り立たない)ことを意味します。

【ここまでのまとめ】
・クラスは型であり,クラスの実体がオブジェクトである。
・クラスはクラス図で表され,オブジェクトはオブジェクト図で表される。

シーケンス図とコラボレーション図

 OOPでは,オブジェクト間でメッセージ・パッシングを行うことでプログラムが動作すると考えます。メッセージ・パッシングとは,オブジェクトがほかのオブジェクトの持つ関数を呼び出すことです。UMLでメッセージ・パッシングを図示するには「シーケンス図」または「コラボレーション図」を使います。

 シーケンス図は,時間軸に注目してメッセージ・パッシングを表した図です。シーケンス(sequence)とは「連鎖,連続,順序」という意味です。横方向にオブジェクト図を並べ,その下に破線を描きます。図の上から下に向かって時間が経過します。破線の上に細長い長方形を描いて,オブジェクトが活性化している(動作している)期間を示します。矢印の上に関数名を書き添えてメッセージ・パッシングを表します(図6[拡大表示])。

 一方のコラボレーション図は,オブジェクト間の協調関係に注目してメッセージ・パッシングを表した図です。コラボレーション(collaboration)とは「協力,協調」という意味です。コラボレーション図では,オブジェクト図の間を直線と矢印で結び,その上に順序を表す番号と関数名を書き添えてメッセージ・パッシングを表します。コラボレーション図とシーケンス図で表せることに大差はありません。注目していることが違うだけです。図6のシーケンス図をコラボレーション図で書き直すと図7[拡大表示]のようになります。

 ここまでの説明は,連載の第1回と第2回の内容を復習しているようでしたね。すでに皆さんがマスターしているOOPのさまざまな概念を,UMLという表記方法で図示する方法を説明しているだけだからです。UMLの説明をすんなり理解できる自分自身に感激してください。

【ここまでのまとめ】
・オブジェクト間でメッセージ・パッシングを行うことでプログラムが動作する。
・オブジェクト間のメッセージ・パッシングは,シーケンス図またはコラボレーション図で表される。