ステート・チャート図

 ここから,ちょっとだけ新しい概念が登場します。オブジェクトの状態変化を表す「ステート・チャート図」です。ステート(state)とは「状態」という意味です。オブジェクトの状態変化とは何でしょう? オブジェクトが持つ変数の値が変化することです。そもそも,プログラムとは関数(命令)と変数(データ)の集合体です。オブジェクトがほかのオブジェクトの持つ関数を呼び出すこと(メッセージ・パッシング)でプログラムが動作します。関数を呼び出したことでプログラムの状態が変化したなら,その内容はオブジェクトの持つ変数に記憶されているのです。

図8●ステート・チャート図の例
図9●ユースケース図の例
図10●アクティビティ図の例
図11●コンポーネント図とデプロイメント図の例

 ステート・チャート図では,角の丸い四角形の中に状態名を書いて一つの状態を表します。複数の四角形を矢印で結んで状態変化を示します。矢印の上には,状態変化の要因を書き添えます。例えば,水を表すオブジェクトがあり,温度を表す変数tを持っているとしましょう。氷→水→水蒸気という状態変化をステート・チャート図で表すと図8[拡大表示]のようになります。

【ここまでのまとめ】
・オブジェクトの状態変化とは,オブジェクトが持つ変数の値が変化することである。
・オブジェクトの状態変化は,ステート・チャート図で表される。

ユースケース図

 OOPは,大規模なプログラム(システム)に適した開発手法です。システムが動作しているときには,膨大な数のオブジェクトがメッセージ・パッシングを行っていることになります。その様子を1枚のシーケンス図やコラボレーション図に描き表せるでしょうか? よほど大きな紙がないと無理ですね。

 大規模なシステムの動作は,小さな動作に分けて考え,個々の動作をシーケンス図やコラボレーション図などで示すべきです。大規模なシステムの動作を区切るためのポイントは「システムの使われ方」に注目することです。ユーザーが,システムに何らかの入力を行うことがきっかけとなって,ひとまとまりの動作が起動されるはずです。このひとまとまりの動作のことを「ユースケース(use case)」と呼び,ユースケースを図示したものを「ユースケース図」と呼びます。シーケンス図やコラボレーション図は,ユースケースの単位で記述できます。

 ユースケース図では,システム全体を四角形で表し,その中にだ円で囲んでユースケースを記述します。ユースケースを起動するユーザー(またはシステムに接続されているほかのシステム)を人間の形の図記号で表します。これを「アクター」と呼びます。図9[拡大表示]は,皆さんが普段お使いのワープロ・ソフトを例にしたユースケース図です。「文書を編集する」「文書を保存する」「文書を印刷する」がユースケースです。個々のユースケースは,いくつかのオブジェクトがメッセージ・パッシングを行うことで実現されます。ユースケースを表すだ円の中にシーケンス図やコラボレーション図があるようなイメージで,ユースケース図を見てください。

【ここまでのまとめ】
・大規模システムの動作は,システムの使われ方という観点で区切ることができる。
・システムの使われ方は,ユースケース図で表される。

アクティビティ図

 「アクティビティ図」は,オブジェクトのアクション(動作)の変化を示すものです。これは,プログラムの流れを表すために従来から使われてきた「フローチャート(流れ図)」のOOP版だといえます。オブジェクトの状態の変化を示すステート・チャート図とペアになる図であるとも考えられます。

 アクティビティ図では,両端が半円の四角形の中にアクション名を書いて一つのアクションを表し,複数のアクションの流れを矢印で結びます。フローチャートのように条件分岐を表すひし形の図記号も使えます。アクションの初期状態は黒丸で表し,終了状態は内部が塗りつぶされた二重丸で表します。図10[拡大表示]は,ワープロのアクションの変化を表すアクティビティ図です。

【ここまでのまとめ】
・オブジェクトのアクションの変化は,アクティビティ図で表される。
・アクティビティ図は,OOP版のフローチャートである。

コンポーネント図とデプロイメント図

 UMLで規定されている図の説明も,残すところあと二つになりました。最後に紹介する「コンポーネント図」と「デプロイメント図」は,プログラミングに関係する図ではありません。システムの開発後に必要なインストール担当者のための図だといえます。

 コンポーネント図は,システムを構成するソフトウエア・コンポーネント(ソフトウエア部品)を表すものです。Windows環境なら,アプリケーションの実行形式ファイルであるEXEファイル,DLLファイル,各種のデータ・ファイルなどがソフトウエア・コンポーネントに相当します。コンポーネント図では,差し込み付きの部品のような図記号の中にコンポーネント名を書いて一つのコンポーネントを表します。

 デプロイメント図は,システムの物理的な構成を示します。デプロイメント(deployment)とは「配置」すなわち「インストール」という意味です。UMLでは,システムを構成する装置のことを「ノード」と呼びます。ノードは,直方体の図記号の中に装置の名前や型番などを書き添えて表します。ノードの中にコンポーネント図を描くことで,システムのハードウエアとソフトウエアの構成が示せます。接続されたノードは,直線で結びます。

 図11[拡大表示]は,ソフトウエア・コンポーネントとして「Windows XP」と「ワープロ(Word 2002)」がインストールされたパソコンの構成を,コンポーネント図とデプロイメント図で表したものです。この図は「パソコン本体」の中にWindows XPとWord 2002がインストールされ,「ディスプレイ」と「プリンタ」が接続されていることを表しています。

【ここまでのまとめ】
・ソフトウエア・コンポーネントは,コンポーネント図で表される。
・システムのハードとソフトの構成は,デプロイメント図で表される。

OOPの全体像をチェック

 皆さんがOOPの全体像をつかめたかどうかをチェックしてみましょう。紙を1枚用意してください。ぶつぶつと理屈を言いながら,UMLの9種類の図の役割と名称を書いてください。

・UMLでもクラスとオブジェクトを区別する→クラス図,オブジェクト図
・メッセージ・パッシングを表す→シーケンス図,コラボレーション図
・状態変化を表す→ステート・チャート図
・大規模なシステムの動作を区切る→ユースケース図
・OOP版のフローチャートである→アクティビティ図
・システムのインストール担当者が見る→コンポーネント図,デプロイメント図

 はいOK,合格です。皆さんは,OOPのさまざまな概念を網羅して理解しています。OOPの全体像をバッチリつかんでいます。あとは,実践あるのみです。皆さんのご検討をお祈り申し上げます!


C++,Java,C#,Visual Basic .NETの比較

 C++は,C言語という非OOP言語にクラスを定義する構文などを追加した言語です。Javaは,C++をベースに開発された言語です。C#もC++をベースとしており,構文がJavaによく似ています。Visual Basic .NETは,Visual Basic 6.0にC#と同等の機能を実現する構文を追加した言語です。

 これらのどれを使ってもOOPを実践できます。ただし,クラスの定義や継承など,同じことを表す場合でも,プログラミング言語によって構文が異なります。ここではこれら四つの言語について,MyBaseClassを継承して,publicなMySampleClassを定義する構文を比較してみましょう。MySampleClassはprivateな変数myValueとpublicな関数myFuncを持つとします。「public」や「private」は,可視性(見せる/隠す)を表すキーワードで,どのプログラミング言語でもほとんど同じです。

リストA●四つのOOP 言語で同じクラスを記述した例

 リストA[拡大表示]の(a)は,C++のコードです(このクラスの中身に意味はありません)。C++では「class」というキーワードを使ってクラスを定義します。コロン(:)が継承を表します。リストAの(a)と同じ機能のクラスをJava,C#,Visual Basic .NETで記述すると,それぞれ(b),(c),(d)のようになります。C++と同様にクラスを定義するキーワードはclassまたはClassですが,継承は,Javaでは「extends」キーワード(拡張する),C#ではコロン,Visual Basic .NETでは「Inherits」キーワード(継承する)で表します。クラスや関数のブロック(範囲)を,C++,Java,C#では「{」と「}」で囲んで表すのに対し,Visual Basic .NETではClass~End ClassやFunction~End Functionという構文で表します。

 皆さんは,どのOOP言語を選ぶべきか迷ってしまうことでしょう。どうぞ,自分の好みに合った構文のOOP言語を選んでください。一つのOOP言語を確実にマスターすれば,ほかの言語も容易に覚えられます。かく言う筆者が一生懸命勉強したOOP言語は,実はC++だけなのです。Java,C#,Visual Basic .NETは,C++と比較することによって覚えました。