第 4 回:Visio の便利な機能
〜 Visio によるオブジェクト指向設計入門 〜
4.1 はじめに
Visio には、UML の作図以外にも、様々なCASE ツールとしての機能が用意されています。本章では、その中でも既存のデータベースから、データベースの設計を行う機能や UML モデル図のクラス図を自動で出力する機能などシステム仕様書の作成を支援する機能について説明します。また、頻繁に行う一連の動作を短縮するための機能であるマクロについても説明します。
4.2 Visio とデータベース
Visio には、ソフトウェアエンジニアリングを支援する CASE ツールとしての機能が数多く用意されています。本節では、CASE ツールとしての機能の中でも、データベースのリバースエンジニアリング機能について説明します。
4.2.1 Visio のデータベースモデル図
(1) データベースモデル図
データベースモデル図は、ファイル設計図やデータベース設計図などデータベースをモデル化するためのテンプレートです。データベースモデル図では、主キーや外部キー、リレーションシップなども設定できます。そのため、データベースモデル図は、データ同士の繋がりをグラフィカルに表現でき、必要なデータを探索するためのコストを大幅に削減できます。データベースモデル図の例を図 1 に示します。

図 1 データベースモデル図の例
(2) データベースモデル図の記述方法
Visio のデータベースモデル図には、様々なマスタシェイプが用意されており、各マスタシェイプにプロパティを設定できます。データベースモデル図では、プロパティを設定することにより、リレーションシップや主キー、インデックスなど様々な情報をシェイプに付加できます。プロパティを設定するには、データベースプロパティウィンドウを使用します。データベースプロパティウィンドウの表示方法を図 2 に示します。

図 2 データベースプロパティウィンドウの表示方法
4.2.2 Visio のデータベースモデル図出力機能
Visio には、既存のデータベースからデータベースモデル図を自動で出力するリバースエンジニアリング機能が用意されています。本項では、リバースエンジニアリング機能について説明します。
(1) データベースモデル図出力機能の利点
従来、システム開発者が、データベースを利用するシステムをクライアントに納品する場合、データベース設計図等のシステム仕様書を作成するのには、多大な時間が必要でした。しかし、システム開発者は、Visio のリバースエンジニアリング機能を利用することにより、データベース設計図を短時間で容易に作成できます。データベースモデル図には、更新された新しいデータベースファイルを読み込むことにより、データベースモデル図を自動で更新するリフレッシュ機能が用意されています。そのため、対象のデータベースとデータベースモデル図とのデータの差異を解消することができます。
(2) データベースモデル図出力機能の使用方法
ここでは、データベースのリバースエンジニアリング機能について説明します。今回、リバースエンジニアリングに使用する DBMS としては、Microsoft 社 の Access を使用します。リバースエンジニアリングに使用するデータベースのテーブル名とカラム名を表 1 に示します。また、テーブル間のリレーションシップを図 3 に示します。
表 1 テーブル名とカラム名
| テーブル名 | カラム名 |
| BOOK_TABLE | BOOK_ID,BOOK_NAME,AUTHOR,PUBLISH |
| RENTAL_TABLE | RENTAL_ID,USER_ID,BOOK_ID,PREARRANGE_DATE,RENTAL_DATE,RETURN_DATE |
| USER_TABLE | USER_ID,USER_NAME,ADDRESS,PHONE_NUMBER |

図 3 テーブル間のリレーションシップ
データベースモデル図を自動生成する手順を次に示します。
まず、Visio を起動し、【データベース】→【データベースモデル図】テンプレートを選択しデータベースモデル図を表示します。次に、メニューから【データベース】→【リバースエンジニアリング】を選択し【リバースエンジニアリングウィザード】ダイアログボックスを表示します。【リバースエンジニアリングウィザード】ダイアログボックスを表示後、データソースを選択します。データベースモデル図にリバースエンジニアリングするデータソースが表示されていない場合は、【新規】をクリックし、【データソース新規作成】ダイアログボックスを使用します。データソースの新規作成方法を図 4 に示します。

図 4 データソースの追加方法
【リバースエンジニアリングウィザード】ダイアログボックス上で、新しく追加したデータソースである「Library Database Files」を選択します。その後、【リバースエンジニアリングウィザード】ダイアログボックスの指示に従って、実行することにより、データベースモデル図が自動で作成できます。出力後のデータベースモデル図は、図 1 を参照してください。
4.3 Visio によるマクロ
Visio には、マクロ機能が用意されています。マクロとは、特定の作業を行うために必要な一連の作業を一つのコマンドにまとめたものです。マクロを作成し、実行することにより、一連の作業を自動的に処理することができます。そのため、頻繁に行う作業をマクロで定義することにより、作業の効率化を図ることができます。本節では、Visio のマクロの作成から実行までの手順を説明します。
4.3.1 Sub プロシージャの作成
マクロは、 VBA (Visual Basic for Application) を使用し記述します。本節では、サンプルとして、選択したアクターにユースケースを接続するマクロ (SampleMacro) を作成します。マクロを作成するには、 VBE (Visual Basic Editor) を起動する必要があります。起動方法は、メニューから【ツール】→【マクロ】→【Visual Basic エディタ】を選択します。次に、プログラムを記述するためのプロシージャを作成します。まず、プロシージャを記述するための標準モジュールを挿入します。挿入方法は、メニューから【挿入】→【標準モジュール】を選択します。次に、メニューから【挿入】→【プロシージャ】を選択することにより、【プロシージャの追加】ダイアログボックスが表示されます。【プロシージャの追加】ダイアログボックスを図 5 に示します。

図 5 【プロシージャの追加】ダイアログボックス
上記の操作により、Sub プロシージャが追加できます。
4.3.2 サンプルプログラムの作成
選択したアクターにユースケースを接続するマクロのソースコードを次に示します。
'定数の宣言
Private Const XLOCATION As Integer = 4.5 'ユースケースの設置位置を設定
Private Const YLOCATION As Integer = 5.5 'ユースケースの設置位置を設定
Public Sub SampleMacro()
'変数の宣言
Dim shpActor As Visio.Shape 'アクターシェイプオブジェクト
Dim shpUsecase As Visio.Shape 'ユースケースシェイプオブジェクト
Dim shpRelation As Visio.Shape '通信シェイプオブジェクト
Dim mstObj As Visio.Master 'マスターオブジェクト
Dim docObj As Document 'ドキュメントオブジェクト
'シェイプが選択されている場合
If ActiveWindow.Selection.Count <> 0 Then
'選択シェイプがアクターの場合
If InStr(ActiveWindow.Selection.Item(1).Name, "アクター") <> 0 Then
Set shpActor = ActiveWindow.Selection.Item(1) 'アクターを設定
Else
MsgBox "アクターを選択してください", , "アクターを選択してください"
Exit Sub
End If
Else
MsgBox "図形を選択してください", , "図形を選択してください"
Exit Sub
End If
'ステンシルオブジェクトの取得
Set docObj = Visio.Documents.OpenEx("UML ユース ケース.vss", visOpenDocked)
'ユースケースを記述
Set mstObj = docObj.Masters("ユース ケース") 'マスタシェイプの取得
Set shpUsecase = Visio.ActivePage.Drop(mstObj, XLOCATION, YLOCATION) '図面に配置
'通信を記述
Set mstObj = docObj.Masters("通信") 'マスタシェイプの取得
Set shpRelation = Visio.ActivePage.Drop(mstObj, 1, 1) '図面に配置
'アクターの座標がユースケースより小さい場合
If shpActor.Cells("PinX") < shpUsecase.Cells("PinX") Then
'ドロップした通信の始点・終点を接続したいシェイプの指定位置に接続
shpRelation.Cells("BeginX").GlueTo shpActor.Cells("AlignRight") '接続位置を設定
shpRelation.Cells("EndX").GlueTo shpUsecase.Cells("AlignLeft") '接続位置を設定
Else
'ドロップした通信の始点・終点を接続したいシェイプの指定位置に接続
shpRelation.Cells("BeginX").GlueTo shpActor.Cells("AlignLeft") '接続位置を設定
shpRelation.Cells("EndX").GlueTo shpUsecase.Cells("AlignRight") '接続位置を設定
End If
End Sub
ソースコードについての詳しい説明は、「MSDN online Library」もしくは、Microsoft Visio ヘルプを参照ください。
4.3.3 実行結果
SampleMacro を実行します。SampleMacro を実行することにより、図面に新規ユースケースを配置し、選択したアクターと自動的に関連づけます。SampleMacro の実行方法と実行結果を図 6 に示します。

図 6 SampleMacro の実行方法と実行結果
4.4 Visual Studioのリバース エンジニアリング機能
本節では、Visual C# を使用して構築したサンプルプログラムを使用して、リバースエンジニアリング機能について説明します。
4.4.1 リバースエンジニアリング機能とは
Visual Studio .NET は、Visio と組み合わせることにより、Visual C++、Visual Basic、Visual C# のソースコードから、UML のクラス図を自動で生成するリバースエンジニアリング機能を使用することができます。リバースエンジニアリング機能を使用することにより、システム開発者は、システム仕様書を作成するコストを軽減できるため、開発効率の大幅な向上に繋がります。また、複雑なシステムのソースコードをモデル化することにより、システムの構成やクラス間の関係をグラフィカルに把握できます。
4.4.2 リバースエンジニアリング機能の使用方法
本項では、「仕事を設定する」、「現在進行中の仕事名を出力する」と「仕事を終了する」という、3 つの機能をもつ簡単なロボットのサンプルプログラムを用いてリバースエンジニアリングを実行します。
(1) クラスの追加
本サンプルプログラムは、「フォーム」、「ロボット」、「仕事」の 3 つのクラスで構成されています。クラスを追加するには、まず、メニューから【表示】→【ソリューションエクスプローラ】を選択し、ソリューション エクスプローラを起動します。次に、クラスを追加するプロジェクト名を選択し、【右クリック】→【追加】→【クラスの追加】を選択し、【新しい項目の追加】ダイアログボックスを起動します。【新しい項目の追加】ダイアログボックスを図 7 に示します。

図 7 【新しい項目の追加】ダイアログボックス
上記の操作により Robot.cs ファイルがプロジェクトに追加されました。同様にして、Task.cs ファイルを追加します。
(2) Windows フォームの作成
サンプルプログラムには、Label コントロール×2、TextBox コントロールと Button コントロール×3 を使用します。Label コントロールは、各項目の情報の説明のために使用します。TextBox コントロールは、仕事名を入力するために使用します。Button コントロールは、仕事の設定や仕事の終了などを実行するために使用します。Windows フォームの作成例とコントロールのオブジェクト名を図 8 に示します。

図 8 Windows フォーム
(3) コードの記述
サンプルプログラムに使用する Form1 クラス、Robot クラスとTask クラスにコードを記述します。Form1 クラスに追加するソースコードを次に示します。
まず、プライベート属性のデータとして、Robot オブジェクトを作成します。本サンプルプログラムのソースコード例を次に示します。
public class Form1 : System.Windows.Forms.Form
{
−−− (中略) −−−
private Robot robotTarou = new Robot(); //ロボットオブジェクトの作成
次に、【setTaskButton】がクリックされた場合の処理を作成します。本サンプルプログラムのソースコード例を次に示します。
private void setTaskButton_Click(object sender, System.EventArgs e)
{
//テキストボックス記述の有無の判定
if(workNameBox.Text!="")
{
robotTarou.setTask(workNameBox.Text); //setTaskメソッドの呼び出し
workNameBox.Text = ""; //workNameBoxのテキストを空にする
workStateLabel.Text = "仕事中"; //workStateLabelを仕事中に変更
}
else
{
MessageBox.Show("仕事名を入力してください"); //エラーメッセージ出力
}
}
そして、【sayTaskButton】がクリックされた場合の処理を作成します。本サンプルプログラムのソースコード例を次に示します。
private void sayTaskButton_Click(object sender, System.EventArgs e)
{
robotTarou.sayTaskName(); //sayTaskNameメソッド呼び出し
}
最後に、【doTaskButton】がクリックされた場合の処理を作成します。本サンプルプログラムのソースコード例を次に示します。
private void doTaskButton_Click(object sender, System.EventArgs e)
{
workStateLabel.Text = robotTarou.doTask(); //戻り値をLabel名に設定
}
Robot クラスに追加するソースコードを次に示します。
まず、ユーザインタフェースを構築するために、Form 名前空間を参照する必要があります。Form 名前空間を参照する方法を次に示します。
| using System.Windows.Forms; |
次に、Robot クラスにデータとメソッドを追加します。本サンプルプログラムのソースコード例を次に示します。
public class Robot
{
//属性を設定
private string sRobotName; //ロボットの名前
private Task task; //ロボットの持つ仕事
//コンストラクタ
public Robot()
{
sRobotName = "robotTarou"; //ロボットの名前
task = new Task(); //オブジェクトの生成
}
//仕事を実行
public string doTask()
{
//仕事の状況を取得
if(task.notifyFinished() == true)
{
//ラベルを変更
return "休憩中"; //戻り値
}
//ラベルを変更
return "仕事中"; //戻り値
}
//仕事を設定
public void setTask(string TaskName)
{
task.setTaskName(TaskName); //仕事名を設定
}
//仕事名を出力
public void sayTaskName()
{
//ローカル変数を宣言
string sSayTask; //出力文字列を格納
//出力文字列を判定
if(task.bFinishFlag == true)
{
sSayTask = "ただいま抱えている仕事はありません.";
}
else
{
sSayTask = "ただいま抱えている仕事は,"
+ task.getTaskName() +"です.";
}
//仕事名を出力
MessageBox.Show(sSayTask);
}
}
Task クラスに追加するソースコードを次に示します。
まず、Robot クラスと同様に Form 名前空間を参照します。次に、Task クラスにデータとメソッドを追加します。本サンプルプログラムのソースコード例を次に示します。
public class Task
{
//属性を設定
public bool bFinishFlag = true; //仕事の状況を判別
private string sTaskName; //仕事名を格納
//仕事名を取得
public string getTaskName()
{
return sTaskName; //戻り値
}
//仕事名を設定
public void setTaskName(string TaskName)
{
sTaskName = TaskName; //仕事名を設定
bFinishFlag = false; //仕事中にフラグを設定
}
//仕事の状況を出力
public bool notifyFinished()
{
//仕事の状況を判別
if(bFinishFlag == false)
{
//メッセージボックスの戻り値がOKの場合
if(MessageBox.Show(sTaskName
+ " の仕事を終了してもよろしいですか?","",
MessageBoxButtons.OKCancel) == DialogResult.OK)
{
bFinishFlag = true; //仕事を終了
}
}
else
{
MessageBox.Show("ただいま抱えている仕事はありません");
}
return bFinishFlag; //戻り値
}
}
(4) リバースエンジニアリング機能の使用方法
本章で作成したサンプルプログラムのリバースエンジニアリングを行います。リバースエンジニアリング機能は、メニューから【プロジェクト】→【Visio UML】→【Reverse Engineer】を選択し、ファイルを作成します。リバースエンジニアリング機能を使用して作成されたファイルでは、モデルエクスプローラ上にプロパティを設定したシェイプが出力されます。出力されたシェイプを利用するには、モデルエクスプローラ上からシェイプを図面ウィンドウにドラッグ & ドロップする必要があります。出力されたシェイプをドラッグ & ドロップした例を図 9 に示します。

図 9 作成した UML モデル図のクラス図
図 9 のように、Visual Studio .NET のリバースエンジニアリング機能を利用することにより、容易に UML モデル図のクラス図を作成できます。そのため、システム仕様書を作成するためのコストを大幅に削減できます。
4.5 まとめ
本章では、既存のデータベースからデータベースモデル図を出力する機能や既存のシステムのソースコードから UML モデル図のクラス図を自動で出力する機能などシステム仕様書の作成を支援する機能について説明しました。また、一連の作業を行う機能であるマクロについて説明しました。
本章で説明した通り、Visio には、システム仕様書の作成を支援する機能やシステムの構成を把握するための機能など CASE ツールとしての機能が豊富に用意されています。従来、システム仕様書の作成には、多大なコストが必要でした。しかし、Visio と Visual Studio .NET をシステム開発プロジェクトに導入することにより、コストを大幅に削減できます。また、自動で UML モデル図のクラス図を作成できるため、記述ミスなどのヒューマンエラーを回避できます。
著者紹介
田中 成典 (たなか しげのり)
| 1986年 | 関西大学工学部土木工学科卒業 |
| 1988年 | 関西大学大学院工学研究科 土木工学専攻博士課程前期課程修了 |
| 1996年 | 博士 (工学) 授与,関西大学 |
| 1997年 | 関西大学総合情報学部助教授 (現在に至る) |
| 主な著書: | やさしいCのはじめかた,オーム社,1993年 |
| | 建設技術者のための知識情報処理の実践,関西大学出版部,1999年 |
| | DirectX8,工学社,2001年 |
| | ステップアップXML,工学社,2002年 |
| | Linuxアプリケーション入門,森北出版,2002年 ほか |
中山 浩太郎 (なかやま こうたろう)
| 2001年3月 | 関西大学総合情報学部卒業 |
| 2001年4月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
| 2002年4月 | 同志社女子大学非常勤講師 (現在に至る) |
| 主な著書: | Web工房シリーズ Perlの達人,森北出版,1999年 |
| | DirectX8,工学社,2001年 |
| | Linuxアプリケーション入門,森北出版,2002年 ほか |
石井 健一 (いしい けんいち)
| 1999年4月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 主な著書: | ステップアップXML活用法,工学社,2002年 |
野中 一希 (のなか かずき)
| 1999年4月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 2002年1月 | 株式会社関西総合情報研究所入社 (現在に至る) |
中村 健二 (なかむら けんじ)
| 2000年4月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 2002年4月 | 株式会社関西総合情報研究所入社 (現在に至る) |
|