(57)【要約】【課題】  仕様書などが不完全の場合も、動的設計情報を自動的に生成することができる動的設計情報生成装置およびプログラムを提供する。【解決手段】  読み込んだプログラムの構造をプログラム解析部２１で解析し、この結果をプログラム構造データとして保存するとともに、このプログラム構造データを実行順序データ生成コード付加部２２で参照しながらメソッドの前後に実行順序データ生成コードを付加し、この実行順序データ生成コードを付加したプログラムをプログラム実行部２３によりユーザが入力するイベントデータにしたがって実行して実行順序データを生成し、この実行順序データを元に設計情報生成部２４で動的設計情報を生成する。【選択図】      図１
2008310679.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの構造を解析するプログラム解析手段と、
前記プログラム解析手段で解析されたプログラムを参照して該プログラムの実行順序情報を生成するための情報を付加する情報付加手段と、
前記情報を付加されたプログラムを所定の実行条件にしたがって実行するプログラム実行手段と、
前記プログラム実行手段のプログラム実行により得られた前記プログラムの実行順序情報から動的な設計情報を生成する設計情報生成手段と、
を具備したことを特徴とする動的設計情報生成装置。
【請求項２】
前記プログラム解析手段で解析されたプログラム構造としてクラス情報及びメソッド情報を記憶するプログラム構造記憶手段を有することを特徴とする請求項１記載の動的設計情報生成装置。
【請求項３】
前記プログラム実行手段でのプログラムの実行条件としてイベント情報を記憶したイベント情報記憶手段を有することを特徴とする請求項１記載の動的設計情報生成装置。
【請求項４】
前記プログラム実行手段でのプログラム実行により得られた前記プログラムの実行順序情報を記憶する実行順序情報記憶手段を有することを特徴とする請求項１記載の動的設計情報生成装置。
【請求項５】
前記設計情報生成手段の動的な設計情報の生成条件を記憶する生成条件記憶手段を有し、
前記設計情報生成手段は、前記生成条件記憶手段を参照して前記動的な設計情報の生成を制限することを特徴とする請求項１記載の動的設計情報生成装置。
【請求項６】
前記設計情報生成手段で生成された動的な設計情報を表示する表示手段を有することを特徴とする請求項１記載の動的設計情報生成装置。
【請求項７】
前記情報付加手段は、前記プログラムの実行順序情報を生成するための情報として前記メソッド情報の前後にログ出力コードを付加することを特徴とする請求項２記載の動的設計情報生成装置。
【請求項８】
動的設計情報生成装置を制御するコンピュータプログラムであって、
プログラムの構造を解析する第１のステップと、
前記第１のステップで解析されたプログラムを参照して該プログラムの実行順序情報を生成するための情報を付加する第２のステップと、
所定の実行条件にしたがって前記情報を付加されたプログラムを実行する第３のステップと、
前記第３のステップのプログラム実行により得られる前記プログラムの実行順序情報から動的な設計情報を生成する第４のステップと、
を具備したことを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動的設計情報を自動的に生成する動的設計情報生成装置およびプログラムに関するものである。
【背景技術】
【０００２】
一般に、プログラムを保守していく上において、仕様書や設計書が不完全の場合が多々有り、このためプログラムの元となるソースコードから設計情報を生成して可視化することが必要になることがある。
【０００３】
ところで、ソースコードから生成する設計情報には、プログラムの構造を表す静的設計情報と、プログラムの振る舞いを表す動的なものとして局所的な動的設計情報と大局的な動的設計情報がある。ここで、静的設計情報は、クラス(モジュール)の関連、例えばＵＭＬのクラス図などを表し、局所的な動的設計情報は、メソッド(関数)内の処理の流れ、例えばフローチャート図などを表し、大局的な動的設計情報は、メソッド(関数)間をまたがった呼出し、例えばＵＭＬのシーケンス図などを表している。
【０００４】
従来、ソースコードから上記の設計情報を生成する方法として、ツールを利用して自動生成することが考えられている。ところが、ツールを利用して自動生成できるのは、静的設計情報と局所的な動的設計情報についてであり、プログラムの保守などにおいて、仕様書や設計書が不完全の場合でも大局的な動的設計情報を自動生成するものはなかった。ここでの従来のツールは、ソースコードの静的解析を行うものを意味している。
【０００５】
具体例として、特許文献１には、プログラムデータより各モジュールごとの流れ図を自動生成することが開示されている。また、特許文献２には、被テストプログラムの基本設計において、期待しない分岐を行っているモジュールを特定し、バグ票を自動作成することが開示されている。
【特許文献１】特開平１１−８５４８４号公報
【特許文献２】特開２００４−３４１６８９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、特許文献１は、プログラムデータより各モジュールごとの流れ図を生成するもので、局所的な動的設計情報を自動生成するのに止まり、大局的な動的設計情報を自動生成するものでない。また、特許文献２は、被テストプログラムの完成された仕様書を必要とし、この仕様書に基づいて設計情報を自動生成するものであり、このため仕様書が不完全の状態にある状況では、設計情報を自動的に生成するようなことができない。
【０００７】
このように、従来では、大局的な動的設計情報を自動生成することや、仕様書や設計書などが不完全の場合にも大局的な動的設計情報を自動生成することができず、このため、大局的な動的設計情報については、実際にプログラムを実行し、デバッガを使って人手で処理の順序を追いながら大局的な動的設計情報を把握する方法しかなく、この作業に多大な手間とコストがかかっていた。
【０００８】
本発明は上記事情に鑑みてなされたもので、仕様書などが不完全の場合も、動的設計情報を自動的に生成することができる動的設計情報生成装置およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明にかかる動的設計情報生成装置は、
プログラムの構造を解析するプログラム解析手段と、
前記プログラム解析手段で解析されたプログラムを参照して該プログラムの実行順序情報を生成するための情報を付加する情報付加手段と、
前記情報を付加されたプログラムを所定の実行条件にしたがって実行するプログラム実行手段と、
前記プログラム実行手段のプログラム実行により得られた前記プログラムの実行順序情報から動的な設計情報を生成する設計情報生成手段と、
を具備したことを特徴としている。
【００１０】
本発明にかかるコンピュータプログラムは、
動的設計情報生成装置を制御するコンピュータプログラムであって、
プログラムの構造を解析する第１のステップと、
前記第１のステップで解析されたプログラムを参照して該プログラムの実行順序情報を生成するための情報を付加する第２のステップと、
所定の実行条件にしたがって前記情報を付加されたプログラムを実行する第３のステップと、
前記第３のステップのプログラム実行により得られる前記プログラムの実行順序情報から動的な設計情報を生成する第４のステップと、
を具備したことを特徴としている。
【発明の効果】
【００１１】
本発明によれば、仕様書などが不完全の場合も動的設計情報を自動的に生成することができる動的設計情報生成装置およびプログラムを提供できる。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施の形態を図面に従い説明する。
【００１３】
なお、以下の説明では、明示的な指定なしに動的設計情報と記述した場合、大局的な動的設計情報のことを意味する。また、プログラム言語によっては、クラスをモジュール、メソッドを関数と呼ぶ事があるが、以下の説明ではプログラムを構成する機能的なまとまりをクラス、定められた処理の実行単位をメソッドと呼ぶことにする。
【００１４】
図１は、本発明の第１の実施の形態にかかる動的設計情報生成装置の概略構成を示している。図において、１はインタフェースで、このインタフェース１は、ユーザが本発明装置への入出力を行うためのマウス、キーボードなどからなっている。
【００１５】
インタフェース１には、動的設計情報生成装置本体（以下、装置本体）２が接続されている。この装置本体２は、プログラム解析部２１（プログラム解析手段）、実行順序データ生成コード付加部２２（情報付加手段）、プログラム実行部２３（プログラム実行手段）、設計情報生成部２４（設計情報生成手段）を有している。
【００１６】
プログラム解析部２１には、プログラム構造データ部３が接続され、実行順序データ生成コード付加部２２には、プログラム構造データ部３が接続され、プログラム実行部２３には、イベントデータ部４及び実行順序データ部５が接続され、設計情報生成部２４には、プログラム構造データ部３、実行順序データ部５及び表示設定データ部６が接続されている。
【００１７】
プログラム解析部２１は、インタフェース１を介して入力されるプログラム(ソースコード)の構造を解析する。実行順序データ生成コード付加部２２は、プログラム構造データ部３のプログラム構造データ３０１を参照してメソッドの前後に実行順序データを生成するための実行順序データ生成コード（情報）を付加する。この実行順序データ生成コードについては後述する。プログラム実行部２３は、イベントデータ部４のイベントデータ４０１（実行条件）にしたがって実行順序データ生成コードを付加したプログラムを実行し、これにより得られた実行順序データを実行順序データ部５に保存する。設計情報生成部２４は、プログラム構造データ部３、実行順序データ部５及び表示設定データ部６のそれぞれ後述するプログラム構造データ３０１、実行順序データ５０１及び表示設定データ６０１を参照して動的設計情報（ＵＭＬのシーケンス図など）を生成する。
【００１８】
プログラム構造データ部３（プログラム構造記憶手段）は、プログラム解析部２１で解析されるプログラムに定義されているクラスとメソッドの各情報をプログラム構造データ３０１として蓄積する。イベントデータ部４（イベント情報記憶手段）は、プログラムを実行させるために必要なイベント情報をイベントデータ４０１（イベント情報）として記憶する。実行順序データ部５（実行順序情報記憶手段）は、メソッドの呼出し順序の情報を実行順序データ５０１（実行順序情報）として記憶する。表示設定データ部６（生成条件記憶手段）は、動的設計情報を生成する条件を表示設定データ６０１として記憶する。
【００１９】
これらプログラム構造データ部３、イベントデータ部４、実行順序データ部５及び表示設定データ部６のそれぞれのプログラム構造データ３０１、イベントデータ４０１、実行順序データ５０１及び表示設定データ６０１についての詳細は後述する。
【００２０】
インタフェース１には、表示手段としての表示部７が接続されている。この表示部７は、設計情報生成部２４で生成された動的設計情報（ＵＭＬのシーケンス図など）を表示する。
【００２１】
図２は、プログラム構造データ３０１、イベントデータ４０１、実行順序データ５０１及び表示設定データ６０１のそれぞれのデータ構造を示している。
【００２２】
プログラム構造データ３０１は、クラス情報３０１ａとメソッド情報３０１ｂを有している。ここで、クラス情報３０１ａは、プログラム中に定義されているクラスを表している。このクラス情報３０１ａは、クラス情報を一意に認識する「クラスＩＤ」、クラス名の衝突を回避するための概念で、Ｊａｖａ（登録商標）などのプログラム言語ではパッケージ名に相当する「名前空間」、クラスの名前を示す「クラス名」からなっている。また、メソッド情報３０１ｂは、プログラム中に定義されているメソッドを表している。このメソッド情報３０１ｂは、メソッド情報を一意に認識する「メソッドＩＤ」、メソッドの名前を示す「メソッド名」、メソッドが定義されているクラスを示すもので、クラス情報３０１ａの「クラスＩＤ」と関連づけるための「所属クラスＩＤ」からなっている。
【００２３】
イベントデータ４０１は、イベント情報４０１ａとパラメータ情報４０１ｂを有している。ここで、イベント情報４０１ａは、プログラムを実行する時のイベントを表している。このイベント情報４０１ａは、イベント情報を一意に認識する「イベントＩＤ」、イベントの名前を示す「イベント名」、イベントを起こすための起点となるメソッドのＩＤを示すもので、メソッド情報３０１ｂのメソッドＩＤと関連づけるための「トリガーメソッドＩＤ」からなっている。また、パラメータ情報４０１ｂは、イベントを起こすためにプログラムに渡されるパラメータを表している。このパラメータ情報４０１ｂは、パラメータ情報を一意に認識する「パラメータＩＤ」、パラメータの名前を示す「パラメータ名」、パラメータの型を示す「型」、メソッドに渡すパラメータの値を示す「値」、パラメータが使われるイベントのＩＤを示すもので、イベント情報４０１ａのイベントＩＤと関連づけるための「イベントＩＤ」からなっている。
【００２４】
実行順序データ５０１は、実行順序情報５０１ａを有している。ここで、実行順序情報５０１ａは、プログラムを実行した時のメソッドの呼出し順序を表している。この実行順序情報５０１ａは、実行順序情報を一意に識別する「実行順序ＩＤ」、どのイベントから生成されたかを識別するためのＩＤを示すもので、イベント情報４０１ａのイベントＩＤと関連づけるための「イベントＩＤ」、メソッドを呼出している側のクラスを示すもので、クラス情報３０１ａのクラスＩＤと関連づけるための「送信元クラスＩＤ」、呼出し元のメソッドを示すもので、メソッド情報３０１ｂのメソッドＩＤと関連づけるための「呼出し元メソッドＩＤ」、メソッドを呼出されている側のクラスを示すもので、クラス情報３０１ａのクラスＩＤと関連づけるための「送信先クラスＩＤ」、呼出されたメソッドを示すもので、メソッド情報３０１ｂのメソッドＩＤと関連づけるための「呼出しメソッドＩＤ」、メソッドの開始と終了を区別するフラグを示すもので、開始＝Ｓ、終了＝Ｅで表される「タイプ」、メソッドの呼出し順序を示すもので、１からの連番がつけられる「順序」、メソッド呼出しの階層を示すもので、メソッド開始の度にカウントアップし、メソッド終了の度にカウントダウンする「階層」からなっている。
【００２５】
表示設定データ６０１は、除外クラス情報６０１ａ、除外メソッド情報６０１ｂ、閾値情報６０１ｃを有している。ここで、除外クラス情報６０１ａは、動的設計情報を生成しないクラスを表すもので、ここで指定したクラスが送信元である場合、動的設計情報を生成しない。この除外クラス情報６０１ａは、動的設計情報を生成しないクラスのＩＤを示すもので、クラス情報３０１ａのクラスＩＤと関連づけるための「除外クラスＩＤ」からなっている。除外メソッド情報６０１ｂは、動的設計情報を生成しないメソッドを表すもので、ここで指定したメソッドが呼出し元メソッドである場合、動的設計情報を生成しない。この除外メソッド情報６０１ｂは、動的設計情報を生成しないメソッドのＩＤを示すもので、メソッド情報３０１ｂのメソッドＩＤと関連づけるための「除外メソッドＩＤ」からなっている。閾値情報６０１ｃは、動的設計情報を生成しない条件を表すものである。この閾値情報６０１ｃは、閾値情報を一意に識別するための「閾値ＩＤ」、実行順序データ５０１のうち、動的設計情報を生成しない条件とする項目を示す「項目名」、動的設計情報を生成しない基準値を示す「閾値」からなっている。
【００２６】
なお、図２に示すプログラム構造データ３０１のクラス情報３０１ａとメソッド情報３０１ｂを結ぶライン、プログラム構造データ３０１のクラス情報３０１ａと実行順序データ５０１の実行順序情報５０１ａ、表示設定データ６０１の除外クラス情報６０１ａをそれぞれ結ぶライン、プログラム構造データ３０１のメソッド情報３０１ｂとイベントデータ４０１のイベント情報４０１ａ、実行順序データ５０１の実行順序情報５０１ａ、表示設定データ６０１の除外メソッド情報６０１ｂをそれぞれ結ぶライン、イベントデータ４０１のイベント情報４０１ａとパラメータ情報４０１ｂを結ぶライン、実行順序データ５０１の実行順序情報５０１ａと表示設定データ６０１の閾値情報６０１ｃ結ぶラインは、それぞれ情報処理の際のデータの関連付けを表すものである。また、これらライン上の「１」は、一方の情報から他方の情報を見たとき、例えば、メソッド情報３０１ｂからクラス情報３０１ａを見たとき１つのデータが該当し、「＊」は、逆の場合で、他方の情報から一方の情報を見たとき複数のデータが該当することを示している。さらに、各情報中に付された「ＰＫ」（Primary Key）は、それぞれの情報を一意に識別するために必要な識別子、「ＦＫ」（Foreign Key）は、外部で定義されている識別子である。
【００２７】
次に、このような構成に基づく本実施の形態の作用を説明する。
【００２８】
図３は、本装置全体の基本的な動作仕様を示すフローチャートである。
【００２９】
まず、ステップ３０１で、対象となるプログラム（ソースコード）を、インタフェース１を介してプログラム解析部２１が読み込む。プログラム解析部２１は、ステップ３０２で、ステップＳ３０１で読み込んだプログラムの構造を解析し、この解析結果をプログラム構造データ部３に保存する。プログラム構造データ部３には、プログラムで定義されているクラス情報３０１ａとメソッド情報３０１ｂからなるプログラム構造データ３０１が記述される。表１及び表２は、プログラム構造データ３０１のクラス情報３０１ａ及びメソッド情報３０１ｂのそれぞれの具体例を示している。
【表１】
2008310679.tif 000003
【００３０】
【表２】
2008310679.tif 000004
【００３１】
この場合、表１のクラス情報３０１ａには、ClassＡ、ClassＢ、ClassＣの３つのクラスが定義されている。また、メソッド情報３０１ｂには、ClassＡに対しmethodＡ()、methodＢ()の２つのメソッドが、ClassＢに対しmethodＢ()のメソッドが、ClassＣに対しmethodＣ()のメソッドがそれぞれ定義されている。
【００３２】
次に、ステップ３０３に進み、実行順序データ生成コード付加部２２において、読み込んだプログラムの解析結果から得られたプログラム構造データ３０１を参照して、メソッドの前後に実行順序データを生成するための実行順序データ生成コードを付加する。
【００３３】
図４は、実行順序データ生成コード付加部２２での動作の概念を示している。この場合、プログラム中のメソッドｍ（図示例ではmethodＡ()）の本来の処理部分Ａの前後に、メソッドの開始と終了を表すログ出力コードを付加する。ここでは、ログ出力コードとして、メソッドの開始の場合はタイプＳ、終了の場合はタイプＥを付加する。
【００３４】
このような実行順序生成コードを付加する具体的方法として、アスペクトを利用した付加方法が用いられる。アスペクト技術とは、クラス間を横断した関心事をアスペクトと呼ばれる単位でまとめて記述しておき、後からコンパイラなどのツールで結合する技術である。このアスペクトを利用すると、クラス、メソッドに散らばるログ出力コードをまとめて定義できる。また、元のプログラムに手を加えずに機能を追加できる。さらに、アスペクトを実装する言語としては、例えば、AspectJなどがある。このAspectJを利用する場合、プログラム構造データ３０１を参照して、クラス情報３０１ａの名前空間、クラス名、メソッド情報３０１ｂのメソッド名を指定すれば、指定されたメソッドの前後に任意のコードを追加でき、実行順序生成コードの付加を実現できる。AspectJ以外のアスペクト実装言語を利用する場合は、必要に応じてプログラム構造データ３０１を拡張することもできる。
【００３５】
次に、ステップ３０４に進み、ユーザによってインタフェース１を介して、プログラムを実行させるために必要なイベントデータ４０１が入力されると、装置本体２は、この入力されたイベントデータ４０１をイベントデータ部４に保存する。この場合、イベントデータ４０１の入力は、一度に複数のイベントデータを入力することも可能である。
【００３６】
表３及び表４は、ユーザにより入力されたイベントデータ４０１（イベントデータ部４に保存されている）のイベント情報４０１ａとパラメータ情報４０１ｂのそれぞれの具体例を示している。
【表３】
2008310679.tif 000005
【００３７】
【表４】
2008310679.tif 000006
【００３８】
この場合、表３のイベント情報４０１ａは、イベントＩＤ「Ｅ０００１」のイベント名「従業員検索」と、イベントＩＤ「Ｅ０００２」のイベント名「従業員新規登録」の２つのイベントが入力されていて、それぞれプログラム構造データ３０１のメソッド情報３０１ｂの「メソッドＩＤ」と関連づけられたトリガーメソッドＩＤ「ｍ０００１」「ｍ００２０」から各イベントが実行されることを表している。また、表４のパラメータ情報４０１ｂは、パラメータＩＤ「ＰＡＲ００１」のパラメータ名「従業員番号」と、パラメータＩＤ「ＰＡＲ００２」のパラメータ名「従業員名」のパラメータが入力されていて、それぞれイベント情報４０１ａの「イベントＩＤ」と関連づけられたイベントＩＤ「Ｅ０００１」「Ｅ０００２」から、対応するパラメータ名の値をメソッドに渡す。例えば、表３に示すイベント情報４０１ａのイベントＩＤ「Ｅ０００１」のイベント名「従業員検索」を実行するには、表４に示すパラメータ情報４０１ｂのイベントＩＤ「Ｅ０００１」から、対応するパラメータ名「従業員番号」の値「９９９９」をパラメータとしてメソッドに渡すようになる。
【００３９】
次に、ステップ３０５に進み、ユーザによって、入力されたイベントデータ４０１の中から、実行するイベントが選択される。次に、ステップ３０６に進み、プログラム実行部２３において、上述の選択されたイベントにしたがって、実行順序データ生成コードが付加されたプログラムを実行し、その結果得られる実行順序データ５０１を実行順序データ部５に保存する。
【００４０】
この場合、例えば、表３に示すイベント情報４０１ａのイベントＩＤ「Ｅ０００１」のイベント名「従業員検索」を実行する場合、図５に示すようなメソッドの呼出し関係があったとすると、表５に示す実行順序データ５０１が生成される。図５では、メソッドの呼出し関係として、まず、図示（イ）でClassＡのmethodＡ()が呼出され（メソッド開始）、次いで、図示（ロ）でClassＡのmethodＡ()よりClassＢのmethodＢ()が呼出され（メソッド開始）、その後、図示（ハ）（ニ）でClassＢのmethodＢ()、ClassＡのmethodＡ()が順にメソッド終了となる例を示している。このようなメソッドの呼出し関係に対し実行順序データ５０１は、まず、実行順序「ｐ０００１」で、送信先クラスＩＤ「Ａ０００１」（ClassＡ）、呼出しメソッドＩＤ「ｍ０００１」（methodＡ()）、メソッド開始のタイプ「Ｓ」、順序「１」、階層「１」が生成され、次いで、実行順序「ｐ０００２」で、送信元クラスＩＤ「Ａ０００１」（ClassＡ）、呼出し元メソッドＩＤ「ｍ０００１」（methodＡ()）、送信先クラスＩＤ「Ａ０００２」（ClassＢ）、呼出しメソッドＩＤ「ｍ０００３」（methodＢ()）、メソッド開始のタイプ「Ｓ」、順序「２」、階層「２」が生成され、以下、実行順序「ｐ０００３」以降について、図５に示すメソッドの呼出し関係に基づいて表５に示す結果が得られる。ここで、表中の「−」は、呼出し元（あるいは呼出先）がプログラム実行部２３であることを示している。
【表５】
2008310679.tif 000007
【００４１】
一方、図６（ａ）に示すような自己呼出しが存在するメソッドの呼出し関係がある場合は、表６に示す実行順序データ５０１が生成される。図６（ａ）では、メソッドの呼出し関係として、まず、図示（ホ）でClassＡのmethodＡ()が呼び出され（メソッド開始）、次いで、図示（ヘ）でClassＡのmethodＡ()よりClassＡのmethodＢ()が呼び出され（メソッド開始）、その後、図示（ト）（チ）でClassＡのmethodＢ()、ClassＡのmethodＡ()が順にメソッド終了となる例を示している。このようなメソッドの呼出し関係に対し実行順序データ５０１は、まず、実行順序「ｐ００２０」で、送信先クラスＩＤ「Ａ０００１」（ClassＡ）、呼出しメソッドＩＤ「ｍ０００１」（methodＡ()）、メソッド開始のタイプ「Ｓ」、順序「１」、階層「１」が生成され、次いで、実行順序「ｐ００２１」で、送信元クラスＩＤ「Ａ０００１」（ClassＡ）、呼出し元メソッドＩＤ「ｍ０００１」（methodＡ()）、送信先クラスＩＤ「Ａ０００１」（ClassＡ）、呼出しメソッドＩＤ「ｍ０００２」（methodＢ()）、メソッド開始のタイプ「Ｓ」、順序「２」、階層「２」が生成され、実行順序「ｐ００２２」で、送信元クラスＩＤ「Ａ０００１」（ClassＡ）、呼出し元メソッドＩＤ「ｍ０００２」（methodＢ()）、送信先クラスＩＤ「Ａ０００１」（ClassＡ）、呼出しメソッドＩＤ「ｍ０００１」（methodＡ()）、メソッド終了でタイプ「Ｅ」、順序「３」、階層「１」が生成され、以下、実行順序「ｐ００２３」以降について、図６（ａ）に示すメソッドの呼出し関係に基づいて表６に示す結果が得られる。この場合、図６（ａ）の（ヘ）に示す部分が自己呼び出しで、表６の実行順序「ｐ００２１」と「ｐ００２２」で送信元クラスＩＤと送信先クラスＩＤが同じになっている。また、図６（ａ）の（ト）に示す部分は、自己呼出しの終了である。
【００４２】
なお、図６（ａ）は、ＵＭＬのシーケンス図に似せているが、関数の呼出順序を示すための図であり、ＵＭＬの表記に完全に準拠しているわけでない。
【表６】
2008310679.tif 000008
【００４３】
次に、ステップ３０７に進み、設計情報生成部２４において、ステップ３０６で得られた実行順序データ５０１とともに、表示設定データ部６に保存された表示設定データ６０１を参照して動的設計情報（シーケンス図）を生成し、この生成した動的設計情報をインタフェース１を介して表示部７に表示する。
【００４４】
そして、ステップ３０８に進み、他のイベント（例えば、表３に示すイベントＩＤ「Ｅ０００２」のイベント名「従業員新規登録」）を実行する場合は、ステップ３０５に戻って上述したと同様な動作を再実行する。ここでの他のイベントを実行するか否かは、ユーザが決定する。
【００４５】
図７は、上述したステップ３０７での動作を説明するための動的設計情報（シーケンス図）の具体的な生成例を示している。
【００４６】
まず、表５に示す実行順序データ５０１を用いて動的設計情報を生成する場合を説明する。この場合、ステップ７０１で、表５に示す実行順序ＩＤ「ｐ０００１」のデータを取り出す。次に、ステップ７０２で、表示設定データ部６の表示設定データ６０１を読み込み、動的設計情報の生成に制限を受けるかを判定する。制限を受ける場合は、ステップ７０３に進んで制限の種類に応じた処理を行う。このステップ７０３での動作の詳細は、後述する。
【００４７】
動的設計情報の生成に制限を受けない場合は、ステップ７０４に進み、取り出した実行順序データの送信元クラスＩＤ、送信先クラスＩＤに記述されたクラスが、既にシーケンス図上に書かれているかを判定する。実行順序ＩＤ「ｐ０００１」では、いずれのクラスもシーケンス図上に書かれていないので、ステップ７０５で不足クラスを追加する。この場合、図５に示すようにプログラム実行部２３に対して「ClassＡ」を図上に記述する。
【００４８】
次に、ステップ７０６に進み、取り出した実行順序データの送信元クラスＩＤと送信先クラスＩＤが同じであるかを判定する。実行順序ＩＤ「ｐ０００１」では、ＮＯなので、ステップ７０７に進み、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ０００１」については、プログラム実行部２３と「ClassＡ」の間にメッセージ線を引く（図５の（イ）参照）。
【００４９】
次に、ステップ７０８で、実行順序データのタイプがＥであるかを判定する。実行順序ＩＤ「ｐ０００１」では、タイプ「Ｓ」なので、ステップ７０９に進み、プログラム実行部２３と「ClassＡ」の間のメッセージ線を実線にし、呼出しメソッド名（methodＡ（））を追記する。
【００５０】
次に、ステップ７１０に進み、未処理の実行順序データがあるかを判定し、未処理のデータがある場合は、ステップ７１１で次のデータを取り出す。
【００５１】
この場合、表５に示す実行順序ＩＤ「ｐ０００２」のデータを取り出し、ステップ７０２以降の動作を再実行する。この実行順序ＩＤ「ｐ０００２」のデータに関しては、ステップ７０２でＮＯと判断され、ステップ７０４に進み、シーケンス図上に書かれていない不足クラスを追加する。この場合、図５に示す「ClassＢ」を図上に記述する。そして、ステップ７０６でＮＯと判断され、ステップ７０７に進んで、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ０００２」については、「ClassＡ」と「ClassＢ」の間にメッセージ線を引く（図５の（ロ）参照）。
【００５２】
次に、ステップ７０８に進んで実行順序データのタイプがＥであるかを判定されるが、ここではＮ０と判断され、ステップ７０９で「ClassＡ」と「ClassＢ」の間のメッセージ線を実線にし、呼出しメソッド名（methodＢ()）を追記する。
【００５３】
次に、表５に示す実行順序ＩＤ「ｐ０００３」のデータを取り出し、ステップ７０２以降の動作を再実行する。この実行順序ＩＤ「ｐ０００３」のデータに関しては、ステップ７０２でＮＯ、ステップ７０４でＹＥＳ、さらにステップ７０６でＮＯと判断され、ステップ７０７に進んで、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ０００３」については、「ClassＢ」と「ClassＡ」の間にメッセージ線を引く（図５の（ハ）参照）。
【００５４】
次に、ステップ７０８で、実行順序データのタイプがＥであるかを判定する。実行順序ＩＤ「ｐ０００３」では、タイプ「Ｅ」なので、ステップ７１２に進む。ステップ７１２では、「ClassＢ」と「ClassＡ」の間のメッセージ線を、戻り線を表す点線にする。
【００５５】
次に、表５に示す実行順序ＩＤ「ｐ０００４」のデータを取り出し、ステップ７０２以降の動作を再実行する。この実行順序ＩＤ「ｐ０００４」のデータに関しては、ステップ７０２でＮＯ、ステップ７０４でＹＥＳ、さらにステップ７０６でＮＯと判断され、ステップ７０７に進んで、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ０００４」については、「ClassＡ」とプログラム実行部２３との間にメッセージ線を引く（図５の（ニ）参照）。次に、ステップ７０８で、実行順序データのタイプがＥであるかを判定するが、実行順序ＩＤ「ｐ０００４」は、タイプ「Ｅ」なので、ステップ７１２に進み、「ClassＡ」とプログラム実行部２３の間のメッセージ線を、戻り線を表す点線にする。そして、ステップ７１０に進み、未処理の実行順序データがあるかを判定するが、表５では、次の実行順序ＩＤがないので、ＮＯと判断され処理を終了する。
【００５６】
このようにして表５に示す実行順序データ５０１より図５に示すシーケンス図が動的設計情報として生成される。そして、この生成された動的設計情報は、インタフェース１を介して表示部７に表示される。
【００５７】
一方、表６に示す実行順序データ５０１を用いて動的設計情報を生成する場合は、まず、ステップ７０１で、表６に示す実行順序ＩＤ「ｐ００２０」のデータを取り出す。この実行順序ＩＤ「ｐ００２０」のデータについては、上述した表５に示す実行順序ＩＤ「ｐ０００１」のデータの場合と同様な処理が実行され、ステップ７０７で、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ００２０」については、プログラム実行部２３と「ClassＡ」の間にメッセージ線を引く（図６（ａ）の（ホ）参照）。次に、ステップ７０８で、実行順序データのタイプがＥであるかを判定するが、実行順序ＩＤ「ｐ００２０」では、タイプ「Ｓ」なので、ステップ７０９に進み、プログラム実行部２３と「ClassＡ」の間のメッセージ線を実線にし、呼出しメソッド名（methodＡ()）を追記する。
【００５８】
次に、表６に示す実行順序ＩＤ「ｐ００２１」のデータを取り出し、ステップ７０２以降の動作を再実行する。この実行順序ＩＤ「ｐ００２１」のデータに関しては、ステップ７０２でＮＯ、ステップ７０４でＹＥＳと判断され、ステップ７０６に進む。ステップ７０６では、取り出した実行順序データの送信元クラスＩＤと送信先クラスＩＤが同じであるかを判定する。実行順序ＩＤ「ｐ００２１」では、送信元クラスＩＤと送信先クラスＩＤが同じでＹＥＳなので、ステップ７１３に進む。ステップ７１３では、実行順序データのタイプがＥであるかを判定されるが、実行順序ＩＤ「ｐ００２１」は、タイプ「Ｓ」なので、Ｎ０と判断され、ステップ７０７に進んで、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ００２１」については、「ClassＡ」から「ClassＡ」の間にメッセージ線を引く（図５の（ヘ）参照）。次に、ステップ７０８に進んで実行順序データのタイプがＥであるかを判定されるが、ここではＮ０と判断され、ステップ７０９で、「ClassＡ」から「ClassＡ」の間のメッセージ線を実線にし、呼出しメソッド名（methodＢ()）を追記する。
【００５９】
次に、表６に示す実行順序ＩＤ「ｐ００２２」のデータを取り出し、ステップ７０２以降の動作を再実行する。この実行順序ＩＤ「ｐ００２２」のデータに関しては、ステップ７０２でＮＯ、ステップ７０４でＹＥＳ、さらにステップ７０６でＹＥＳと判断され、ステップ７１３に進んで実行順序データのタイプがＥであるかを判定されるが、実行順序ＩＤ「ｐ００２２」は、タイプ「Ｅ」なので、ＹＥＳと判断される。この場合は、メッセージ線を表示することなく（図５の一点鎖線（ト）部分）、ステップ７１０に進む。
【００６０】
次に、表６に示す実行順序ＩＤ「ｐ００２３」のデータを取り出し、ステップ７０２以降の動作を再実行する。この実行順序ＩＤ「ｐ００２３」のデータに関しては、ステップ７０２でＮＯ、ステップ７０４でＹＥＳ、さらにステップ７０６でＮＯと判断され、ステップ７０７に進んで、送信元クラスから送信先クラスにメッセージ線を引く。実行順序ＩＤ「ｐ００２３」については、「ClassＡ」とプログラム実行部２３との間にメッセージ線を引く（図５の（チ）参照）。次に、ステップ７０８で、実行順序データのタイプがＥであるかを判定するが、実行順序ＩＤ「ｐ００２３」は、タイプ「Ｅ」なので、ステップ７１２に進み、「ClassＡ」とプログラム実行部２３の間のメッセージ線を、戻り線を表す点線にする。そして、ステップ７１０に進み、未処理の実行順序データがあるかを判定するが、表６では、次の実行順序ＩＤがないので、ＮＯと判断され処理を終了する。
【００６１】
このようにして表６に示す実行順序データ５０１より図６（ｂ）に示すようなシーケンス図が動的設計情報として生成される。図６（ｂ）に示すシーケンス図は、図６（ａ）に示すシーケンス図から（ト）部分のないものである。この生成された動的設計情報は、インタフェース１を介して表示部７に表示される。
【００６２】
次に、上述した図７に示すフローチャートにおいて、ステップ７０３での動作について説明する。このステップ７０３では、表示設定データ６０１を読み込み、動的設計情報の生成に制限を受けるか判断し、制限を受ける場合、制限の種類に応じた処理を行う。
【００６３】
この場合、表示設定データ６０１は、例えば、表７に示す閾値情報６０１ｃ、表８に示す除外クラス情報６０１ａ、表９に示す除外メソッド情報６０１ｂを有している。表７に示す閾値情報６０１ｃは、閾値ＩＤ「Ｔ００１」で項目名「階層」、閾値「３０」を設定し、階層が３０より深い呼出しメッセージの動的設計情報を生成しない場合を示している。また、表８に示す除外クラス情報６０１ａは、除外クラスＩＤ「Ｘ０００１」「Ｘ０００２」「Ｘ０００３」を設定し、表９に示す除外メソッド情報６０１ｂは、除外メソッドＩＤ「ｍ９００１」「ｍ９００２」を設定しており、これら設定された除外クラス、除外メソッドを送信元、送信先に含む実行順序データについて動的設計情報を生成しないようにしている。
【表７】
2008310679.tif 000009
【００６４】
【表８】
2008310679.tif 000010
【００６５】
【表９】
2008310679.tif 000011
【００６６】
このような表示設定データ６０１の設定に対し、例えば、表１０に示すような除外クラス情報を含む実行順序データ５０１を用いて動的設計情報を生成する場合の動作例を説明する。
【表１０】
2008310679.tif 000012
【００６７】
この場合、表１０に示す実行順序データ５０１は、実行順序ＩＤ「ｐ００３０」の送信元クラスＩＤと実行順序ＩＤ「ｐ００３８」の送信先クラスＩＤにそれぞれ除外クラスが含まれている。ここでの除外クラスＩＤは、表８に示す「Ｘ０００１」である。
【００６８】
このような実行順序データ５０１の実行順序ＩＤ「ｐ００３０」のデータに除外クラスＩＤ「Ｘ０００１」が含まれる場合、これ以降の動的設計情報を生成しないようにする。この場合、実行順序ＩＤ「ｐ００３０」のデータの送信元クラスＩＤに除外クラスＩＤを発見すると、（ａ）まず、送信元クラスＩＤ「Ｘ０００１」−呼出し元メソッドＩＤ「ｍ００３０」、送信先クラスＩＤ「Ａ０００１」−呼出しメソッドＩＤ「ｍ０００１」の組合せを記録する。（ｂ）次に、（ａ）で記録した送信元クラスＩＤ「Ｘ０００１」−呼出し元メソッドＩＤ「ｍ００３０」と送信先クラスＩＤ「Ａ０００１」−呼出しメソッドＩＤ「ｍ０００１」を入れ替えるとともにタイプが「Ｅ」の実行順序ＩＤを検索する。この場合、実行順序データ５０１は、順序で昇順にソートされているとする。これにより、（ａ）の呼出しの戻りメッセージに相当する実行順序データ、つまり実行順序ＩＤ「ｐ００３８」のデータを発見できる。そして、これら（ａ）（ｂ）で発見された実行順序データ、つまり実行順序ＩＤ「ｐ００３０」〜実行順序ＩＤ「ｐ００３８」の間のデータから動的設計情報のシーケンス図を生成しないようにする。
【００６９】
表９に示す除外メソッドについても、同様の処理を行う。ただし、上述した（ａ）の動作条件は、除外メソッドＩＤを呼出しメソッドＩＤに発見した場合となる。
【００７０】
したがって、このようにすれば、読み込んだプログラムの構造をプログラム解析部２１で解析し、この結果をプログラム構造データとして保存するとともに、このプログラム構造データを実行順序データ生成コード付加部２２で参照しながらメソッドの前後に実行順序データ生成コードを付加し、この実行順序データ生成コードを付加したプログラムをプログラム実行部２３によりユーザが入力するイベントデータにしたがって実行して実行順序データを生成し、この実行順序データを元に設計情報生成部２４で動的設計情報を生成し、この動的設計情報を表示部７に表示するようにした。これにより、プログラムの保守などの際に、仕様書や設計書が不完全の場合でも、動的設計情報を自動的に生成し、これを可視化することができるようになり、従来の実際にプログラムを実行し、デバッガを使って人手で処理の順序を追いながら動的設計情報を把握していた方法と比べ、プログラムの保守コストを大幅に低減することができる。
【００７１】
また、設計情報生成部２４では、表示設定データ６０１に基づいて、動的設計情報の生成に制限を受けるか判断し、制限を受ける場合、制限の種類に応じた処理を行うようにして必要としない動的設計情報の生成を積極的に制限するようにしているので、一度に把握できる情報量に限界があるユーザにとっても、着目している部分の動的設計情報のみを生成することでプログラムの理解を容易にすることができる。また、無駄な処理を無くすことにより、動的設計情報の自動生成を効率よく行うこともできる。
【００７２】
（変形例）
上述した実施の形態では、実行順序生成コードを付加する具体的方法として、アスペクトを利用した付加方法について述べたが、プログラムのソースコードに直接実行順序生成コードを付加するようにもできる。この場合、プログラム構造データ３０１の表２で説明したメソッド情報３０１ｂを拡張し、表１１に示すように各メソッドＩＤ「ｍ０００１」「ｍ０００２」…に対しファイル名、開始行、終了行を追加する。これにより、どのファイルについて何行目にログ出力コードを追加すればよいかが簡単に分かるようになる。ところが、同一ファイルについて上段から順にログ出力コードを追加していくと、行数がずれてしまう。そこで、同一ファイル内の最下段に定義されたメソッドから順にログ出力コードを追加していくようにする。このときの動作仕様を図８に示している。
【表１１】
2008310679.tif 000013
【００７３】
図８は、ログ出力コードを付加する場合の動作仕様のフローチャートを示している。この場合、ステップ８０１で、表８に示すメソッド情報３０１ｂについて同一ファイル名でグループ化する。次に、ステップ８０２で、グループ内のメソッドを開始行で降順にソートする。次に、ステップ８０３で、ソート後のメソッドの一番目を取り出し、ステップ８０４で、この取り出したメソッドの終了行にログ出力コード（タイプＥ）を追加し、続けてステップ８０５で、取り出したメソッドの開始行にログ出力コード（タイプＳ）を追加する。そして、ステップ８０６で、未処理のメソッドがあると判断すると、ステップ８０７で、次のメソッドを取り出し、ステップ８０４に戻って、上述した動作を再実行する。その後、ステップ８０６で、未処理のメソッドが無いと判断すると処理を終了する。
【００７４】
なお、本発明は、上記実施の形態に限定されるものでなく、実施段階では、その要旨を変更しない範囲で種々変形することが可能である。例えば、上述した実施の形態では、生成した動的設計情報を表示部７に表示するようにしたが、表示部７での表示とともに不図示のファイルなどの出力手段に保存してもよいし、又はこのファイルのみに保存してもよい。
【００７５】
さらに、上記実施の形態には、種々の段階の発明が含まれており、開示されている複数の構成要件における適宜な組み合わせにより種々の発明が抽出できる。例えば、実施の形態に示されている全構成要件から幾つかの構成要件が削除されても、発明が解決しようとする課題の欄で述べた課題を解決でき、発明の効果の欄で述べられている効果が得られる場合には、この構成要件が削除された構成が発明として抽出できる。
【図面の簡単な説明】
【００７６】
【図１】本発明の第１の実施の形態にかかる動的設計情報生成装置の概略構成を示す図。
【図２】第１の実施の形態に適用されるプログラム構造データ、イベントデータ、実行順序データ及び表示設定データのデータ構造を示す図。
【図３】第１の実施の形態の具体的な動作仕様を示すフローチャート。
【図４】第１の実施の形態の実行順序生成データ付加の概念を説明する図。
【図５】第１の実施の形態で生成された動的設計情報のシーケンス図を示す図。
【図６】第１の実施の形態で生成された他の動的設計情報のシーケンス図を示す図。
【図７】第１の実施の形態の動的設計情報の生成例を示すフローチャート。
【図８】本発明の変形例のログ出力コードを直接追加する場合の動作仕様を示すフローチャート。
【符号の説明】
【００７７】
１…インタフェース、２…動的設計情報生成装置本体
２１…プログラム解析部、２２…実行順序データ生成コード付加部
２３…プログラム実行部、２４…設計情報生成部
３…プログラム構造データ部、３０１…プログラム構造データ
３０１ａ…クラス情報、３０１ｂ…メソッド情報
４…イベントデータ部、４０１…イベントデータ
４０１ａ…イベント情報、４０１ｂ…パラメータ情報
５…実行順序データ部、５０１…実行順序データ
５０１ａ…実行順序情報、６…表示設定データ部
６０１…表示設定データ、６０１ａ…除外クラス情報
６０１ｂ…除外メソッド情報、６０１ｃ…閾値情報
７…表示部
【図１】
2008310679.tif 000014
【図２】
2008310679.tif 000015
【図３】
2008310679.tif 000016
【図４】
2008310679.tif 000017
【図５】
2008310679.tif 000018
【図６】
2008310679.tif 000019
【図７】
2008310679.tif 000020
【図８】
2008310679.tif 000021