(57)【要約】【課題】ソースコードにクラス間の利用関係が記述されていない場合でも、クラス間の利用関係を示すクラス図を生成する。【解決手段】クラス間関連生成部１０４（依存入力部）は、インジェクション設定ファイル１０２（依存注入データ）を入力する。クラス構造抽出部１０３（ソース入力部）は、ソースコード１０１を入力する。クラス間関連生成部１０４（利用判定部）は、インジェクション設定ファイル１０２と、ソースコード１０１とに基づいて、クラスが利用する他のクラスを判定する。クラス図生成部１０５は、クラス間関連生成部１０４が判定した結果に基づいて、クラス図１０６を生成する。【選択図】図１
2011232957.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクト指向プログラミング言語により記述されたソースコードから、クラス図を生成するクラス図生成装置において、
データを処理する処理装置と、依存入力部と、ソース入力部と、利用判定部と、クラス図生成部とを有し、
上記依存入力部は、上記処理装置を用いて、クラスのソースコードに含まれる間接指定データと、上記クラスが利用する他のクラスとの対応を指定する依存注入データを入力し、
上記ソース入力部は、上記処理装置を用いて、上記間接指定データを用いてクラスが利用する他のクラスを指定したソースコードを入力し、
上記利用判定部は、上記依存入力部が入力した依存注入データと、上記ソース入力部が入力したソースコードとに基づいて、上記処理装置を用いて、上記クラスが利用する他のクラスを判定し、
上記クラス図生成部は、上記利用判定部が判定した結果に基づいて、上記処理装置を用いて、上記クラスの関係を示すクラス図を生成することを特徴とするクラス図生成装置。
【請求項２】
上記依存入力部が入力する依存注入データは、上記クラスのオブジェクトに対して上記クラスが利用する他のクラスのオブジェクトを通知する依存注入装置が使用する形式であることを特徴とする請求項１に記載のクラス図生成装置。
【請求項３】
上記ソース入力部が入力するソースコードは、上記クラスが利用する他のクラスのオブジェクトの通知を受け、通知されたオブジェクトを利用するコードを含むことを特徴とする請求項１または請求項２に記載のクラス図生成装置。
【請求項４】
コンピュータが実行することにより、上記コンピュータを請求項１乃至請求項３のいずれかに記載のクラス図生成装置として機能させることを特徴とするコンピュータプログラム。
【請求項５】
データを処理する処理装置を有するクラス図生成装置が、オブジェクト指向プログラミング言語により記述されたソースコードから、クラス図を生成するクラス図生成方法において、
上記処理装置が、クラスのソースコードに含まれる間接指定データと、上記クラスが利用する他のクラスとの対応を指定する依存注入データを入力し、
上記処理装置が、上記間接指定データを用いてクラスが利用する他のクラスを指定したソースコードを入力し、
入力した依存注入データと、入力したソースコードとに基づいて、上記処理装置が、上記クラスが利用する他のクラスを判定し、
判定した結果に基づいて、上記処理装置が、上記クラスの関係を示すクラス図を生成することを特徴とするクラス図生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、オブジェクト指向プログラミング言語により記述されたソースコードから、クラス図を生成するクラス図生成装置に関する。
【背景技術】
【０００２】
オブジェクト指向プログラミング言語で記述されたソースコードを解析し、ソースコードに記述されたクラスなどの構造やクラス間の関係を示すクラス図を生成する技術がある。
また、ウェブアプリケーション等の開発において、ＤＩ（Ｄｅｐｅｎｄｅｎｃｙ・Ｉｎｊｅｃｔｉｏｎ）コンテナが使用される場合がある。ＤＩコンテナは、コンポーネント（クラス）間の依存性を、外部の設定ファイルに基づいて、実行時に注入するプログラムである。これにより、コンポーネント（クラス）間の依存性をソースコード内部から排除することができる。例えば、あるクラスＡが他のクラスＢを利用する場合、Ａのソースコード内部ではＢそのものではなく、Ｂを抽象化したインタフェースＩを利用することを定義しておく。そして、外部の設定ファイルにて、Ａが、Ｉを実装したクラスとしてＢを利用するように設定する。ＤＩコンテナは、この設定ファイルを参照してＡにＢを利用させる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−２５１７６９号公報
【特許文献２】特開平１１−９５９９０号公報
【特許文献３】特開平９−１８５４９７号公報
【特許文献４】特開平７−３１９６７６号公報
【非特許文献】
【０００４】
【非特許文献１】ＳｐｒｉｎｇＳｏｕｒｃｅ．ｏｒｇ、ｈｔｔｐ：／／ｗｗｗ．ｓｐｒｉｎｇｓｏｕｒｃｅ．ｏｒｇ
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＤＩコンテナの使用を前提として記述されたソースコードからは、クラス間の依存性が排除されている。ソースコードを解析しても、クラス間の利用関係がわからないので、クラス間の利用関係を正しく示すクラス図を作成することができない。
この発明は、例えば上記のような課題を解決するためになされたものであり、ソースコードにクラス間の利用関係が記述されていない場合でも、クラス間の利用関係を示すクラス図を生成することを目的とする。
【課題を解決するための手段】
【０００６】
この発明にかかるクラス図生成装置は、オブジェクト指向プログラミング言語により記述されたソースコードから、クラス図を生成するクラス図生成装置において、
データを処理する処理装置と、依存入力部と、ソース入力部と、利用判定部と、クラス図生成部とを有し、
上記依存入力部は、上記処理装置を用いて、クラスのソースコードに含まれる間接指定データと、上記クラスが利用する他のクラスとの対応を指定する依存注入データを入力し、
上記ソース入力部は、上記処理装置を用いて、上記間接指定データを用いてクラスが利用する他のクラスを指定したソースコードを入力し、
上記利用判定部は、上記依存入力部が入力した依存注入データと、上記ソース入力部が入力したソースコードとに基づいて、上記処理装置を用いて、上記クラスが利用する他のクラスを判定し、
上記クラス図生成部は、上記利用判定部が判定した結果に基づいて、上記処理装置を用いて、上記クラスの関係を示すクラス図を生成することを特徴とする。
【発明の効果】
【０００７】
この発明にかかるクラス図生成装置によれば、利用判定部が、依存注入データとソースコードとに基づいて、上記クラスが利用する他のクラスを判定するので、ソースコードにクラス間の利用関係が記述されていない場合でも、クラス間の利用関係を示すクラス図を生成することができる。
【図面の簡単な説明】
【０００８】
【図１】実施の形態１におけるクラス図生成装置１００のシステム構成を示す図。
【図２】実施の形態１におけるクラス図生成装置１００が入力するソースコード１０１の一例を示す図。
【図３】実施の形態１におけるクラス図生成装置１００が入力するインジェクション設定ファイル１０２の一例を示す図。
【図４】実施の形態１におけるクラス図生成方法２００の処理の流れを示すフローチャート図。
【図５】実施の形態１におけるクラス間関連生成処理２０４の処理の流れを示すフローチャート図。
【図６】実施の形態１におけるクラス図生成部１０５が出力するクラス図１０６の例を示す図。
【図７】実施の形態２における開発システム８００の全体構成の一例を示すシステム構成図。
【図８】実施の形態２におけるクラス図生成装置１００の外観の一例を示す斜視図。
【図９】実施の形態２におけるクラス図生成装置１００のハードウェア資源の一例を示す図。
【図１０】実施の形態２におけるクラス図生成装置１００の機能ブロックの構成の一例を示すブロック構成図。
【図１１】実施の形態２におけるクラス図生成方法２００の処理の流れの一例を示すフローチャート図。
【図１２】実施の形態２におけるソースコード１０１の一例を示す図。
【図１３】実施の形態２におけるクラス解析データ７１０の一例を示す図。
【図１４】実施の形態２におけるメンバー解析データ７２０の一例を示す図。
【図１５】実施の形態２における引数解析データ７３０の一例を示す図。
【図１６】実施の形態２におけるソース解析処理Ｓ２２０の流れの一例を示すフローチャート図。
【図１７】実施の形態２における依存注入データ１０７の一例を示す図。
【図１８】実施の形態２における依存解析データ７４０の一例を示す図。
【図１９】実施の形態２における依存解析処理Ｓ２４０の流れの一例を示すフローチャート図。
【図２０】実施の形態２における利用解析データ７５０の一例を示す図。
【図２１】実施の形態２における利用判定処理Ｓ２５０の流れの一例を示すフローチャート図。
【図２２】実施の形態２におけるクラス図１０６の一例を示す図。
【図２３】実施の形態２におけるクラス図生成処理Ｓ２６０の流れの一例を示すフローチャート図。
【発明を実施するための形態】
【０００９】
実施の形態１．
実施の形態１について、図１〜図６を用いて説明する。
【００１０】
図１は、この実施の形態におけるクラス図生成装置１００のシステム構成を示す図である。
ソースコード１０１は、解析対象となる、オブジェクト指向プログラミング言語で記述されたソースコードである。
インジェクション設定ファイル１０２（依存注入データ）は、コンポーネント間の依存関係が記述されたインジェクション設定ファイルである。
クラス構造抽出部１０３（ソース入力部）は、ソースコード１０１からクラスの情報を読み取り、クラス図１０６を生成するために必要な基本情報を抽出する。
クラス間関連生成部１０４（依存入力部・利用判定部）は、インジェクション設定ファイル１０２からクラス間の関連を生成する。
クラス図生成部１０５は、クラス構造とクラス間関連から、クラス図１０６を生成する。
クラス図１０６は、クラス構造とクラス間関連を図式化したものである。
【００１１】
図２は、この実施の形態におけるクラス図生成装置１００が入力するソースコード１０１の一例を示す図である。
このソースコード１０１は、ＤＩコンテナの使用を前提としているため、ＯｒｄｅｒＬｏｇｉｃクラスはＩｔｅｍＤａｏクラスへの依存関係ではなく、ＩｔｅｍＤａｏクラスのインタフェースであるＩＩｔｅｍＤａｏインタフェースへの依存関係を持っている。
コード４０１は、ＯｒｄｅｒＬｏｇｉｃクラスの宣言である。コード４０１は、パッケージ名がｌｏｇｉｃ、クラス名がＯｒｄｅｒＬｏｇｉｃのクラスの宣言である。このクラスの完全修飾名は、ｌｏｇｉｃ．ＯｒｄｅｒＬｏｇｉｃとなる。このクラスは、ソースコード上ではＩＩｔｅｍＤａｏインタフェースを利用しているが、ＩｔｅｍＤａｏは利用していない。
コード４０２は、ＩＩｔｅｍＤａｏ型の属性（間接指定データ）の宣言である。コード４０２は、型名がＩＩｔｅｍＤａｏ、属性名がｉｔｅｍＤａｏの属性の宣言である。
コード４０３は、ｓｅｔＩｔｅｍＤａｏメソッドの宣言である。コード４０３は、メソッド名がｓｅｔＩｔｅｍＤａｏ、戻り値の型がｖｏｉｄ、引数を１つもつメソッドの宣言である。このメソッドは主に、ＤＩコンテナによって呼ばれ、実際に利用することになるクラスを属性に代入するために用いられる。
コード４０４は、ＩＩｔｅｍＤａｏインタフェースの宣言である。コード４０４は、パッケージ名がｄａｏ、インタフェース名がＩＩｔｅｍＤａｏのインタフェースの宣言である。このインタフェースの完全修飾名はｄａｏ．ＩＩｔｅｍＤａｏとなる。
コード４０５は、ＩｔｅｍＤａｏクラスの宣言である。コード４０５は、パッケージ名がｄａｏ、クラス名がＩｔｅｍＤａｏのクラスの宣言である。このクラスの完全修飾名はｄａｏ．ＩｔｅｍＤａｏとなる。このクラスは、ＩＩｔｅｍＤａｏインタフェースを実装している。
【００１２】
図３は、この実施の形態におけるクラス図生成装置１００が入力するインジェクション設定ファイル１０２の一例を示す図である。
このインジェクション設定ファイル１０２には、完全修飾名がｌｏｇｉｃ．ＯｒｄｅｒＬｏｇｉｃであるクラスのｉｔｅｍＤａｏという名前の属性は、完全修飾名がｄａｏ．ＩｔｅｍＤａｏであるクラスを利用することが記されている。
タグ５０１は、ｉｄ（アイディ）属性がＯｒｄｅｒＬｏｇｉｃのＢｅａｎ（ビーン）タグである。タグ５０１において、完全修飾名がｌｏｇｉｃ．ＯｒｄｅｒＬｏｇｉｃであるクラスのＢｅａｎが、ｉｄはＯｒｄｅｒＬｏｇｉｃで定義されており、ｐｒｏｐｅｒｔｙ（プロパティ）タグを１つ持っている。
タグ５０２は、ｎａｍｅ（ネーム）属性がｉｔｅｍＤａｏのｐｒｏｐｅｒｔｙタグである。タグ５０２において、ｎａｍｅ属性の内容は、このタグを持つＢｅａｎに対応するクラスが持つ属性名を表す。つまり、ＯｒｄｅｒＬｏｇｉｃクラスが持つ属性であるｉｔｅｍＤａｏを表す。ｒｅｆ（レフ）属性の内容は、このタグを持つＢｅａｎが依存するクラスに対応するＢｅａｎのｉｄを表す。つまり、ＯｒｄｅｒＬｏｇｉｃクラスはＢｅａｎのｉｄがＩｔｅｍＤａｏであるＩｔｅｍＤａｏクラスに依存する。
このｐｒｏｐｅｒｔｙタグ５０２は、Ｂｅａｎタグ５０１が表すＯｒｄｅｒＬｏｇｉｃクラスのｉｔｅｍＤａｏ属性が、ＩｔｅｍＤａｏクラスを利用することを表している。
タグ５０３は、ｉｄ属性がＩｔｅｍＤａｏのＢｅａｎタグである。タグ５０３において、完全修飾名がｄａｏ．ＩｔｅｍＤａｏであるクラスのＢｅａｎが、ｉｄはＩｔｅｍＤａｏで定義されている。
【００１３】
図４は、この実施の形態におけるクラス図生成方法２００の処理の流れを示すフローチャート図である。
クラス図生成方法２００は、クラス図生成装置１００のシステム全体の処理である。
ソースコード読込処理２０１において、クラス構造抽出部１０３は、利用者が指定した全てのソースコード１０１を読み込む。
クラス構造抽出処理２０２において、クラス構造抽出部１０３は、ソースコード読込処理２０１で読み込んだソースコード１０１を解析し、ソースコード１０１中に存在する全てのクラスのクラス構造を抽出する。クラス構造には、クラス名、属性名、属性型、メソッド名、メソッド型、メソッド引数名、メソッド引数型などが含まれる。
インジェクション設定ファイル読込処理２０３において、クラス間関連生成部１０４は、利用者が指定した全てのインジェクション設定ファイル１０２を読み込む。
クラス間関連生成処理２０４において、クラス間関連生成部１０４は、インジェクション設定ファイル読込処理２０３で読み込んだインジェクション設定ファイル１０２を解析し、クラス間の関連情報を生成する。処理の詳細は、後述する。
クラス図生成処理２０５において、クラス図生成部１０５は、クラス構造抽出処理２０２で抽出したクラス構造と、クラス間関連生成処理２０４で生成したクラス間関連とを合成することで、クラス図を生成する。
クラス図表示処理２０６において、クラス図生成部１０５は、クラス図生成処理２０５で生成したクラス図を、プリンタまたは画面などに表示する。
【００１４】
図５は、この実施の形態におけるクラス間関連生成処理２０４の処理の流れを示すフローチャート図である。
クラス間関連生成処理２０４は、クラス間の関連ではなく、Ｂｅａｎ間の関連が記述されたインジェクション設定ファイル１０２から、クラス間の関連を生成することが特徴である。
【００１５】
ビーン存在判定工程３０１において、クラス間関連生成部１０４は、未処理のＢｅａｎタグが存在するか判定する。クラス間関連生成部１０４は、インジェクション設定ファイル読込処理２０３で読み込んだインジェクション設定ファイル１０２に、まだ読み込んでいないＢｅａｎタグが存在するか否かを判定する。
存在する場合、クラス間関連生成部１０４は、ビーン属性取得工程３０２へ処理を移す。存在しない場合、クラス間関連生成部１０４は、プロパティ存在判定工程３０４へ処理を移す。
例えば、図３に示したインジェクション設定ファイルを読み込んだ場合、Ｂｅａｎタグが２つあるため、クラス間関連生成部１０４は、ビーン存在判定工程３０１で２回Ｙｅｓと判定した後、１回Ｎｏと判定する。
【００１６】
ビーン属性取得工程３０２において、クラス間関連生成部１０４は、Ｂｅａｎタグからｉｄ属性・ｃｌａｓｓ属性を取得する。クラス間関連生成部１０４は、まだ読み込んでいないＢｅａｎタグから１つを読み込み、ｉｄ属性とｃｌａｓｓ属性の内容を取得する。ｉｄ属性はＢｅａｎ固有の名称であり、インジェクション設定ファイルの中で重複しない。ｃｌａｓｓ属性はクラスの完全修飾名である。
例えば、図３に示したＢｅａｎタグ５０１のｉｄ属性の内容はＯｒｄｅｒＬｏｇｉｃであり、ｃｌａｓｓ属性の内容はｌｏｇｉｃ．ＯｒｄｅｒＬｏｇｉｃである。
【００１７】
ビーン関連生成工程３０３において、クラス間関連生成部１０４は、クラスとＢｅａｎの関連を生成する。クラス間関連生成部１０４は、読み込んだＢｅａｎタグの内容から、Ｂｅａｎとその実体であるクラスとの関連を生成する。取得した関連情報は、Ｂｅａｎのｉｄ属性の内容から実体であるクラスを取得でき、クラスからＢｅａｎを取得できる形式で保持する。
【００１８】
プロパティ存在判定工程３０４において、クラス間関連生成部１０４は、未処理のｐｒｏｐｅｒｔｙタグが存在するか判定する。クラス間関連生成部１０４は、インジェクション設定ファイル読込処理２０３で読み込んだインジェクション設定ファイル１０２に、まだ読み込んでいないｐｒｏｐｅｒｔｙタグが存在するか否かを判定する。存在する場合、クラス間関連生成部１０４は、プロパティ属性取得工程３０５へ処理を移す。存在しない場合、クラス間関連生成部１０４は、クラス間関連生成処理２０４を終了する。
例えば、図３に示したインジェクション設定ファイル１０２を読み込んだ場合、ｐｒｏｐｅｒｔｙタグは１つあるため、クラス間関連生成部１０４は、プロパティ存在判定工程３０４で、１回Ｙｅｓと判定した後、１回Ｎｏと判定する。
プロパティ属性取得工程３０５において、クラス間関連生成部１０４は、ｐｒｏｐｅｒｔｙタグからｎａｍｅ属性・ｒｅｆ属性を取得する。クラス間関連生成部１０４は、まだ読み込んでいないｐｒｏｐｅｒｔｙタグから１つを読み込み、ｎａｍｅ属性とｒｅｆ属性の内容を取得する。ｎａｍｅ属性は、ソースコードにおけるクラスの属性名を表している。ｒｅｆ属性は、他のＢｅａｎのｉｄである。
例えば、図３に示したｐｒｏｐｅｒｔｙタグ５０２のｎａｍｅ属性の内容はｉｔｅｍＤａｏであり、ｒｅｆ属性の内容はＩｔｅｍＤａｏであり、ＩｔｅｍＤａｏは他のＢｅａｎのｉｄとなっている。
【００１９】
クラス間関連生成工程３０６において、クラス間関連生成部１０４は、クラス間関連を生成する。クラス間関連生成部１０４は、読み込んだＢｅａｎタグ・ｐｒｏｐｅｒｔｙタグの内容からクラス間の関連情報を生成する。詳細な処理手順は、以下の通りである。
【００２０】
まず、関連元のクラスを取得するため、クラス間関連生成部１０４は、ｐｒｏｐｅｒｔｙタグを含むＢｅａｎタグのｃｌａｓｓ属性からクラスの完全修飾名を取得する。完全修飾名はソースコード中で一意であるため、関連元クラスを確定させることができる。
次に、関連先のクラスを取得するため、クラス間関連生成部１０４は、ｐｒｏｐｅｒｔｙタグのｒｅｆ属性の内容と同一のｉｄを持つＢｅａｎを取得する。クラス間関連生成部１０４は、さらに、取得したＢｅａｎのｃｌａｓｓ属性からクラスの完全修飾名を取得し、関連先クラスを確定できる。
【００２１】
以上のようにして、クラス間関連を生成する。
例えば、図３に示したｐｒｏｐｅｒｔｙタグ５０２からクラス間関連を生成する場合、関連元クラスの完全修飾名はｉｄがＯｒｄｅｒＬｏｇｉｃのＢｅａｎタグのｃｌａｓｓ属性からｌｏｇｉｃ．ＯｒｄｅｒＬｏｇｉｃとなり、関連先クラスの完全修飾名はｉｄがＩｔｅｍＤａｏのＢｅａｎタグのｃｌａｓｓ属性からｄａｏ．ＩｔｅｍＤａｏとなる。
【００２２】
図６は、この実施の形態におけるクラス図生成部１０５が出力するクラス図１０６の例を示す図である。
クラス図生成部１０５は、ソースコード１０１には現れていないＯｒｄｅｒＬｏｇｉｃクラスからＩｔｅｍＤａｏクラスへの依存関係を生成することが特徴である。
クラス６０１は、ソースコード４０１から生成されたＯｒｄｅｒＬｏｇｉｃクラスである。クラス図生成部１０５は、ソースコード４０１から抽出したクラス構造情報を元に、クラス名・属性・メソッド・ＩＩｔｅｍＤａｏインタフェースへの依存関係を生成する。
インタフェース６０２は、ソースコード４０４から生成されたＩＩｔｅｍＤａｏインタフェースである。
クラス６０３は、ソースコード４０５から生成されたＩｔｅｍＤａｏクラスである。クラス図生成部１０５は、ソースコード４０５から抽出したクラス構造情報を元に、クラス名・ＩＩｔｅｍＤａｏへの依存関係を生成する。
依存関係６０４は、ＯｒｄｅｒＬｏｇｉｃクラスからＩｔｅｍＤａｏクラスへの依存関係である。この依存関係はソースコード１０１には存在していないため、クラス図生成部１０５は、インジェクション設定ファイル１０２から抽出したクラス間関連情報を元に生成する。
【００２３】
以上のように、クラス図生成装置１００は、インジェクション設定ファイル１０２からＢｅａｎ間の関連を抽出し、Ｂｅａｎ間の関連をクラス間の関連に変換し、ソースコード１０１上には存在しないクラス間依存関係を描いたクラス図１０６を生成するので、依存性が排除されたソースコード１０１からでも正しい依存関係を持つクラス図を生成することができ、開発効率の向上と保守性の向上に貢献する。
【００２４】
以上説明したクラス図生成方法２００及びクラス図生成装置１００は、オブジェクト指向プログラミング言語で記述されたソースコード１０１と、コンポーネント間の依存関係が記述されたインジェクション設定ファイル１０２と、ソースコード１０１を解析するクラス構造抽出部１０３と、インジェクション設定ファイル１０２を解析するクラス間関連生成部１０４と、クラス構造とクラス間関連からクラス図１０６を生成するクラス図生成部１０５とを備える。
【００２５】
クラス図生成方法２００及びクラス図生成装置１００は、前記ソースコード１０１に関して、クラス間の依存関係が排除されているソースコード１０１を利用可能である。
【００２６】
クラス図生成方法２００及びクラス図生成装置１００は、前記インジェクション設定ファイル１０２に関して、Ｓｐｒｉｎｇ  Ｆｒａｍｅｗｏｒｋで利用されるＢｅａｎ間の依存関係が記述されたＳｐｒｉｎｇ設定ファイルを利用可能である。
【００２７】
クラス図生成方法２００及びクラス図生成装置１００は、前記クラス間関連生成部１０４に関して、Ｂｅａｎ間の依存関係からクラス間の関連を生成する。
【００２８】
このように、クラス図生成装置１００は、ソースコード１０１とインジェクション設定ファイル１０２からクラス図１０６を生成する。
入力にソースコード１０１とＢｅａｎ間の関連が記述されたインジェクション設定ファイル１０２を利用することにより、クラス間の依存関係が排除されたソースコード１０１からでも、インジェクション設定ファイル１０２に記述されたＢｅａｎ間の関連をクラス間の関連に変換することで、ソースコード１０１上には存在しないクラス間の関連が記述されたクラス図１０６を生成することができるため、開発効率の向上と保守性の向上に貢献する。
【００２９】
ソースコード１０１だけでなく、インジェクション設定ファイル１０２も解析してクラス構造を生成するため、ＤＩコンテナを用いてソースコード１０１内部からクラス間の依存性が排除されている場合でも、クラス構造を正しく生成できる。
また、インジェクション設定ファイル１０２を解析してクラス間の関連に変換するので、設計者がコンポーネント間の関連を入力する必要がない。
【００３０】
クラス図生成装置１００は、オブジェクト指向プログラミング言語により記述されたソースコード１０１から、クラス図１０６を生成する。
クラス図生成装置１００は、データを処理する処理装置と、依存入力部（クラス間関連生成部１０４）と、ソース入力部（クラス構造抽出部１０３）と、利用判定部（クラス間関連生成部１０４）と、クラス図生成部１０５とを有する。
上記依存入力部（１０４）は、上記処理装置を用いて、クラスのソースコード１０１に含まれる間接指定データ（属性）と、上記クラスが利用する他のクラスとの対応を指定する依存注入データ（インジェクション設定ファイル１０２）を入力する。
上記ソース入力部（１０３）は、上記処理装置を用いて、上記間接指定データを用いてクラスが利用する他のクラスを指定したソースコード１０１を入力する。
上記利用判定部（１０４）は、上記依存入力部（１０４）が入力した依存注入データと、上記ソース入力部（１０３）が入力したソースコードとに基づいて、上記処理装置を用いて、上記クラスが利用する他のクラスを判定する。
上記クラス図生成部１０５は、上記利用判定部（１０４）が判定した結果に基づいて、上記処理装置を用いて、上記クラスの関係を示すクラス図１０６を生成する。
【００３１】
利用判定部（１０４）が、依存注入データ（１０２）とソースコード１０１とに基づいて、上記クラスが利用する他のクラスを判定するので、ソースコード１０１にクラス間の利用関係が記述されていない場合でも、クラス間の利用関係を示すクラス図１０６を生成することができる。
【００３２】
上記依存入力部（１０４）が入力する依存注入データ（１０２）は、上記クラスのオブジェクトに対して上記クラスが利用する他のクラスのオブジェクトを通知する依存注入装置（ＤＩコンテナ）が使用する形式である。
【００３３】
依存注入データ（１０２）が、依存注入装置（ＤＩコンテナ）が使用する形式なので、新たなデータを作成する必要がなく、開発者の負荷を増やすことなく、クラス図１０６を生成することができる。
【００３４】
上記ソース入力部（１０３）が入力するソースコード１０１は、上記クラスが利用する他のクラスのオブジェクトの通知を受け、通知されたオブジェクトを利用するコード（４０３）を含む。
【００３５】
ソースコード１０１が依存注入装置（ＤＩコンテナ）の使用を前提として記述されているので、プログラムの開発効率が高くなる。
【００３６】
実施の形態２．
実施の形態２について、図７〜図２３を用いて説明する。
なお、実施の形態１と共通する部分については、同一の符号を付し、説明を省略する。
【００３７】
図７は、この実施の形態における開発システム８００の全体構成の一例を示すシステム構成図である。
開発システム８００は、コンパイラ装置８１０、実行装置８２０、依存注入装置８３０、クラス図生成装置１００を有する。
コンパイラ装置８１０は、ソースコード１０１を入力する。ソースコード１０１は、オブジェクト指向プログラミング言語で記述されたプログラムである。コンパイラ装置８１０は、ソースコード１０１をコンパイルして、実行形式・中間コード形式など実行装置８２０が実行できる形式のプログラムに変換する。
実行装置８２０は、コンパイラ装置８１０が変換したプログラムを実行する。
依存注入装置８３０は、例えばスプリングフレームワーク、シーサー２などのＤＩコンテナを実行する装置である。依存注入装置８３０は、依存注入データ１０７（インジェクション設定ファイル）を入力する。依存注入データ１０７は、クラスのソースコード１０１に含まれる間接指定データと、そのクラスが利用する他のクラスとの対応を指定するデータである。ソースコード１０１は、依存注入装置８３０の使用を前提として記述されている。ソースコード１０１では、クラスが利用する他のクラスを直接指定するのではなく、間接指定データによって間接的に指定している。実際にクラスが利用する他のクラスは、依存注入データ１０７によって指定される対応によって定まる。依存注入装置８３０は、依存注入データ１０７を解釈する。依存注入装置８３０は、解釈の結果に基づいて、実行装置８２０がそのクラスを実行する場合に、そのクラスが利用する他のクラスを実行装置８２０に知らせる。実行装置８２０は、依存注入装置８３０から知らされた他のクラスを利用して、そのクラスを実行する。
【００３８】
クラス図生成装置１００は、ソースコード１０１と依存注入データ１０７とを入力する。クラス図生成装置１００は、ソースコード１０１と依存注入データ１０７とに基づいて、クラス図を生成する。
【００３９】
図８は、この実施の形態におけるクラス図生成装置１００の外観の一例を示す斜視図である。
クラス図生成装置１００は、システムユニット９１０、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）やＬＣＤ（液晶）の表示画面を有する表示装置９０１、キーボード９０２（Ｋｅｙ・Ｂｏａｒｄ：Ｋ／Ｂ）、マウス９０３、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ・Ｄｉｓｋ・Ｄｒｉｖｅ）、コンパクトディスク装置９０５（ＣＤＤ）、プリンタ装置９０６、スキャナ装置９０７などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。
システムユニット９１０は、コンピュータであり、ファクシミリ機９３２、電話器９３１とケーブルで接続され、また、ローカルエリアネットワーク９４２（ＬＡＮ）、ゲートウェイ９４１を介してインターネット９４０に接続されている。
【００４０】
図９は、この実施の形態におけるクラス図生成装置１００のハードウェア資源の一例を示す図である。
クラス図生成装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ・Ｐｒｏｃｅｓｓｉｎｇ・Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３、ＲＡＭ９１４、通信装置９１５、表示装置９０１、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５、プリンタ装置９０６、スキャナ装置９０７、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカード読み書き装置などの記憶装置でもよい。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部の一例である。通信装置９１５、キーボード９０２、スキャナ装置９０７、ＦＤＤ９０４などは、入力部、入力装置の一例である。
また、通信装置９１５、表示装置９０１、プリンタ装置９０６などは、出力部、出力装置の一例である。
【００４１】
通信装置９１５は、ファクシミリ機９３２、電話器９３１、ＬＡＮ９４２等に接続されている。通信装置９１５は、ＬＡＮ９４２に限らず、インターネット９４０、ＩＳＤＮ等のＷＡＮ（ワイドエリアネットワーク）などに接続されていても構わない。インターネット９４０或いはＩＳＤＮ等のＷＡＮに接続されている場合、ゲートウェイ９４１は不用となる。
磁気ディスク装置９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。
【００４２】
上記プログラム群９２３には、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
ファイル群９２４には、以下に述べる実施の形態の説明において、「〜の判定結果」、「〜の計算結果」、「〜の処理結果」として説明する情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのＣＰＵの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
また、以下に述べる実施の形態の説明において説明するフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、ＲＡＭ９１４のメモリ、ＦＤＤ９０４のフレキシブルディスク、ＣＤＤ９０５のコンパクトディスク、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｋ）等の記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００４３】
また、以下に述べる実施の形態の説明において「〜部」として説明するものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。すなわち、プログラムは、以下に述べる「〜部」としてコンピュータを機能させるものである。あるいは、以下に述べる「〜部」の手順や方法をコンピュータに実行させるものである。
【００４４】
なお、実施の形態１で説明したクラス図生成装置１００も、この実施の形態におけるクラス図生成装置１００と同様、コンピュータにより実現するものであってもよい。
【００４５】
図１０は、この実施の形態におけるクラス図生成装置１００の機能ブロックの構成の一例を示すブロック構成図である。
クラス図生成装置１００は、ソース入力部１１１、依存入力部１１２、ソース解析部１２０、依存解析部１３０、利用判定部１４０、クラス図生成部１５０、クラス図出力部１６０を有する。
【００４６】
ソース入力部１１１は、ＣＰＵ９１１を用いて、ソースコード１０１を入力する。ソース入力部１１１は、磁気ディスク装置９２０を用いて、入力したソースコード１０１を記憶する。
依存入力部１１２は、ＣＰＵ９１１を用いて、依存注入データ１０７を入力する。依存入力部１１２は、磁気ディスク装置９２０を用いて、入力した依存注入データ１０７を記憶する。
【００４７】
ソース解析部１２０は、ＣＰＵ９１１を用いて、ソース入力部１１１が記憶したソースコード１０１を解析して、クラスのメンバーなどクラスの構造や、クラスの継承関係・利用関係などクラス間の関係などを取得する。ソース解析部１２０は、磁気ディスク装置９２０を用いて、取得した解析結果を表わすデータを記憶する。
【００４８】
依存解析部１３０は、ＣＰＵ９１１を用いて、依存入力部１１２が記憶した依存注入データ１０７を解析して、間接指定データと、クラスが実際に使用する他のクラスとの対応関係などを取得する。依存解析部１３０は、磁気ディスク装置９２０を用いて、取得した解析結果を表わすデータを記憶する。
【００４９】
利用判定部１４０は、依存解析部１３０が記憶した解析結果と、ソース解析部１２０が記憶した解析結果とに基づいて、ＣＰＵ９１１を用いて、クラスと、そのクラスが使用する他のクラスとの関係を判定する。利用判定部１４０は、磁気ディスク装置９２０を用いて、判定した結果を表わすデータを記憶する。
【００５０】
クラス図生成部１５０は、ソース解析部１２０が記憶した解析結果と、利用判定部１４０が記憶した判定結果とに基づいて、ＣＰＵ９１１を用いて、クラス図を生成する。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したクラス図を表わすデータを記憶する。
クラス図出力部１６０は、ＣＰＵ９１１を用いて、クラス図生成部１５０が記憶したクラス図を出力する。クラス図出力部１６０は、例えば、表示装置９０１を用いてクラス図を表示し、あるいは、プリンタ装置９０６を用いてクラス図を印刷する。
【００５１】
図１１は、この実施の形態におけるクラス図生成方法２００の処理の流れの一例を示すフローチャート図である。
クラス図生成方法２００において、クラス図生成装置１００は、クラス図を生成する。クラス図生成方法２００は、ソース解析処理Ｓ２２０、依存解析処理Ｓ２４０、利用判定処理Ｓ２５０、クラス図生成処理Ｓ２６０を有する。
【００５２】
ソース解析処理Ｓ２２０において、ソース解析部１２０は、ソースコード１０１を解析する。
依存解析処理Ｓ２４０において、依存解析部１３０は、依存注入データ１０７を解析する。
利用判定処理Ｓ２５０において、利用判定部１４０は、ソースコード１０１から排除されているクラス間の利用関係を判定する。
クラス図生成処理Ｓ２６０において、クラス図生成部１５０は、クラス図を生成する。
【００５３】
図１２は、この実施の形態におけるソースコード１０１の一例を示す図である。
例えば、ソース入力部１１１は、２つのソースコード１０１ａ，１０１ｂを入力する。ソースコード１０１ａ，１０１ｂは、Ｃ＃などのオブジェクト指向プログラミング言語により記述されている。
ソースコード１０１ａは、名前空間Ｎ１に属する３つのクラスＣ１１，Ｃ１２，Ｃ１３を宣言している。クラスＣ１１は、３つのメンバー変数ｆ１１，ｆ１２，ｆ１３と、１つのコンストラクタＣ１１と、１つのメソッドｍ１１とを有する。メンバー変数ｆ１１は、ｉｎｔ型である。メンバー変数ｆ１２は、クラスＣ１３のオブジェクト型である。したがって、クラスＣ１１は、クラスＣ１３に依存している。メンバー変数ｆ１３は、名前空間Ｎ２のインタフェースＩ２１型である。したがって、クラスＣ１１は、インタフェースＩ２１を実際に実装するクラスには依存しない。メソッドｍ１１は、１つの引数ｐ１を取る。メソッドｍ１１は、戻り値を返さない。メソッドｍ１１の引数ｐ１は、ｉｎｔ型である。クラスＣ１２は、クラスＣ１１のサブクラスである。
ソースコード１０１ｂは、名前空間Ｎ２に属する１つのインタフェースＩ２１と、１つのクラスＣ２１とを宣言している。クラスＣ２１は、インタフェースＩ２１を実装している。
【００５４】
図１３は、この実施の形態におけるクラス解析データ７１０の一例を示す図である。
クラス解析データ７１０は、ソース解析部１２０がソースコード１０１を解析した結果を表わすデータの一例である。ソース解析部１２０は、ソースコード１０１を解析した結果に基づいて、ＣＰＵ９１１を用いて、クラス解析データ７１０を生成する。ソース解析部１２０は、磁気ディスク装置９２０を用いて、生成したクラス解析データ７１０を記憶する。
クラス解析データ７１０は、複数のデータ組７１１ａ〜７１１ｅを有する。データ組７１１ａ〜７１１ｅは、それぞれ、クラス名７１２、継承クラス名７１３を有する。クラス名７１２は、ソースコード１０１で宣言されているクラスあるいはインタフェースの完全修飾名を表わす文字列データである。継承クラス名７１３は、そのクラスあるいはインタフェースが継承あるいは実装しているクラスあるいはインタフェースの完全修飾名を表わす文字列データである。
例えば、データ組７１１ｂは、名前空間Ｎ１のクラスＣ１２が、名前空間Ｎ１のクラスＣ１１を継承したクラスであることを意味する。また、データ組７１１ｃは、名前空間Ｎ１のクラスＣ１３が、他のクラスを継承したクラスではないことを意味する。
【００５５】
図１４は、この実施の形態におけるメンバー解析データ７２０の一例を示す図である。
メンバー解析データ７２０は、ソース解析部１２０がソースコード１０１を解析した結果を表わすデータの一例である。ソース解析部１２０は、ソースコード１０１を解析した結果に基づいて、ＣＰＵ９１１を用いて、メンバー解析データ７２０を生成する。ソース解析部１２０は、磁気ディスク装置９２０を用いて、生成したメンバー解析データ７２０を記憶する。
メンバー解析データ７２０は、複数のデータ組７２１ａ〜７２１ｆを有する。データ組７２１ａ〜７１１ｆは、それぞれ、メンバー名７２２、所属クラス名７２３、データ型７２４を有する。メンバー名７２２は、クラスのメンバー変数、プロパティ、コンストラクタ、メソッドなどクラスのメンバーの識別子を表わす文字列データである。所属クラス名７２３は、そのメンバーが所属するクラスの完全修飾名を表わす文字列データである。データ型７２４は、そのメンバーのデータ型を表わす文字列データである。
例えば、データ組７２１ａは、メンバーｆ１１が、名前空間Ｎ１のクラスＣ１１のメンバーであり、ｉｎｔ型であることを意味する。また、データ組７２１ｂは、メンバーｆ１２が、名前空間Ｎ１のクラスＣ１１のメンバーであり、名前空間Ｎ１のクラスＣ１３型であることを意味する。
【００５６】
図１５は、この実施の形態における引数解析データ７３０の一例を示す図である。
引数解析データ７３０は、ソース解析部１２０がソースコード１０１を解析した結果を表わすデータの一例である。ソース解析部１２０は、ソースコード１０１を解析した結果に基づいて、ＣＰＵ９１１を用いて、引数解析データ７３０を生成する。ソース解析部１２０は、磁気ディスク装置９２０を用いて、生成した引数解析データ７３０を記憶する。
引数解析データ７３０は、複数のデータ組７３１ａ〜７３１ｂを有する。データ組７３１ａ〜７３１ｂは、それぞれ、引数名７３２、メソッド名７３３、所属クラス名７３４、データ型７３５を有する。引数名７３２は、メソッドあるいはコンストラクタの引数の識別子を表わす文字列データである。メソッド名７３３は、その引数を取るメソッドあるいはコンストラクタの識別子を表わす文字列データである。所属クラス名７３４は、その引数を取るメソッドあるいはコンストラクタが所属するクラスの完全修飾名を表わす文字列データである。データ型７３５は、その引数のデータ型を表わす文字列データである。
例えば、データ組７３１ａは、引数ｐ１が、名前空間Ｎ１のクラスＣ１１のコンストラクタＣ１１の引数であり、名前空間Ｎ２のインタフェースＩ２１型であることを意味する。また、データ組７３１ｂは、引数ｐ１が、名前空間Ｎ１のクラスＣ１１のメソッドｍ１１の引数であり、ｉｎｔ型であることを意味する。
【００５７】
図１６は、この実施の形態におけるソース解析処理Ｓ２２０の流れの一例を示すフローチャート図である。
ソース解析処理Ｓ２２０において、ソース解析部１２０は、ソースコード１０１を解析し、クラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０などを生成する。ソース解析処理Ｓ２２０は、ソース入力工程Ｓ２２１、クラス宣言取得工程Ｓ２２２、継承取得工程Ｓ２２３、クラス解析生成工程Ｓ２２４、メンバー宣言取得工程Ｓ２２６、型取得工程Ｓ２２７、メンバー解析生成工程Ｓ２２８、引数宣言取得工程Ｓ２３１、型取得工程Ｓ２３２、引数解析生成工程Ｓ２３３を有する。ソース解析部１２０は、ＣＰＵ９１１を用いて、ソース入力工程Ｓ２２１から処理を開始する。
【００５８】
ソース入力工程Ｓ２２１において、ソース入力部１１１は、ＣＰＵ９１１を用いて、入力すべき１以上のソースコード１０１のなかから、未処理のソースコード１０１を１つ入力する。
入力すべきソースコード１０１がすべて処理済である場合、ソース入力部１１１は、ＣＰＵ９１１を用いて、ソース解析処理Ｓ２２０を終了する。
未処理のソースコード１０１がある場合、ソース入力部１１１は、ＣＰＵ９１１を用いて、そのソースコード１０１を入力し、クラス宣言取得工程Ｓ２２２へ処理を進める。
【００５９】
クラス宣言取得工程Ｓ２２２において、ソース解析部１２０は、ＣＰＵ９１１を用いて、ソース入力工程Ｓ２２１でソース入力部１１１が入力したソースコード１０１で宣言されたクラス（あるいはインタフェース）のなかから、未処理のクラス（あるいはインタフェース）を１つ選択する。
ソースコード１０１で宣言されたクラス（あるいはインタフェース）がすべて処理済である場合、ソース解析部１２０は、ソース入力工程Ｓ２２１に処理を戻し、次のソースコード１０１を入力する。
ソースコード１０１で宣言されたクラス（あるいはインタフェース）のなかに、未処理のクラス（あるいはインタフェース）がある場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、ソースコード１０１のなかから、そのクラス（あるいはインタフェース）を宣言する部分を取得する。ソース解析部１２０は、ＣＰＵ９１１を用いて、継承取得工程Ｓ２２３へ処理を進める。
【００６０】
継承取得工程Ｓ２２３において、ソース解析部１２０は、ＣＰＵ９１１を用いて、クラス宣言取得工程Ｓ２２２で取得したソースコード１０１の一部のなかから、その部分で宣言されているクラス（あるいはインタフェース）が継承（あるいは実装）している他のクラス（あるいはインタフェース）を表わす文字列データを取得し、そのクラスの完全修飾名を算出する。ソース解析部１２０は、ＣＰＵ９１１を用いて、クラス解析生成工程Ｓ２２４へ処理を進める。
【００６１】
クラス解析生成工程Ｓ２２４において、ソース解析部１２０は、ＣＰＵ９１１を用いて、データ組７１１を生成する。ソース解析部１２０が生成するデータ組７１１のクラス名７１２は、クラス宣言取得工程Ｓ２２２で選択したクラス（あるいはインタフェース）の完全修飾名である。ソース解析部１２０が生成するデータ組７１１の継承クラス名７１３は、継承取得工程Ｓ２２３で算出した完全修飾名である。ソース解析部１２０は、磁気ディスク装置９２０を用いて、生成したデータ組７１１を、クラス解析データ７１０の一部として記憶する。ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー宣言取得工程Ｓ２２６へ処理を進める。
【００６２】
メンバー宣言取得工程Ｓ２２６において、ソース解析部１２０は、ＣＰＵ９１１を用いて、クラス宣言取得工程Ｓ２２２で選択したクラス（あるいはインタフェース）のなかで宣言されたメンバーのなかから、未処理のメンバーを１つ選択する。
宣言されたメンバーがすべて処理済である場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、クラス宣言取得工程Ｓ２２２に処理を戻し、次のクラス（あるいはインタフェース）を選択する。
宣言されたメンバーのなかに、未処理のメンバーがある場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、クラス宣言取得工程Ｓ２２２で取得したソースコード１０１の一部のなかから、選択したメンバーを宣言する部分を取得し、型取得工程Ｓ２２７へ処理を進める。
【００６３】
型取得工程Ｓ２２７において、ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー宣言取得工程Ｓ２２６で取得したソースコード１０１の一部のなかから、その部分で宣言されているメンバーのデータ型を表わす文字列データを取得する。ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー解析生成工程Ｓ２２８へ処理を進める。
【００６４】
メンバー解析生成工程Ｓ２２８において、ソース解析部１２０は、ＣＰＵ９１１を用いて、データ組７２１を生成する。ソース解析部１２０が生成するデータ組７２１のメンバー名７２２は、メンバー宣言取得工程Ｓ２２６で選択したメンバーの識別子である。ソース解析部１２０が生成するデータ組７２１の所属クラス名７２３は、クラス宣言取得工程Ｓ２２２で選択したクラス（あるいはインタフェース）の完全修飾名である。ソース解析部１２０が生成するデータ組７２１のデータ型７２４は、型取得工程Ｓ２２７で取得した文字列データである。ソース解析部１２０は、磁気ディスク装置９２０を用いて、生成したデータ組７２１を、メンバー解析データ７２０の一部として記憶する。
ソース解析部１２０は、メンバー宣言取得工程Ｓ２２６で取得したソースコード１０１の一部に基づいて、ＣＰＵ９１１を用いて、その部分で宣言されたメンバーが、変数やプロパティのように引数を取らないメンバーであるか、メソッドやコンストラクタのように引数を取るメンバーであるかを判定する。
そのメンバーが引数を取らないメンバーである場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー宣言取得工程Ｓ２２６に処理を戻し、次のメンバーを選択する。
そのメンバーが引数を取るメンバーである場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、引数宣言取得工程Ｓ２３１へ処理を進める。
【００６５】
引数宣言取得工程Ｓ２３１において、ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー宣言取得工程Ｓ２２６で選択したメンバーのなかで宣言された引数のなかから、未処理の引数を１つ選択する。
宣言された引数がすべて処理済である場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー宣言取得工程Ｓ２２６に処理を戻し、次のメンバーを選択する。
宣言された引数のなかに、未処理の引数がある場合、ソース解析部１２０は、ＣＰＵ９１１を用いて、メンバー宣言取得工程Ｓ２２６で取得したソースコード１０１の一部のなかから、選択した引数を宣言する部分を取得し、型取得工程Ｓ２３２へ処理を進める。
【００６６】
型取得工程Ｓ２３２において、ソース解析部１２０は、ＣＰＵ９１１を用いて、引数宣言取得工程Ｓ２３１で取得したソースコード１０１の一部のなかから、その部分で宣言されている引数のデータ型を表わす文字列データを取得する。ソース解析部１２０は、ＣＰＵ９１１を用いて、引数解析生成工程Ｓ２３３へ処理を進める。
【００６７】
引数解析生成工程Ｓ２３３において、ソース解析部１２０は、ＣＰＵ９１１を用いて、データ組７３１を生成する。ソース解析部１２０が生成するデータ組７３１の引数名７３２は、引数宣言取得工程Ｓ２３１で選択した引数の識別子である。ソース解析部１２０が生成するデータ組７３１のメソッド名７３３は、メンバー宣言取得工程Ｓ２２６で選択したメンバーの識別子である。ソース解析部１２０が生成するデータ組７３１の所属クラス名７３４は、クラス宣言取得工程Ｓ２２２で選択したクラス（あるいはインタフェース）の完全修飾名である。ソース解析部１２０が生成するデータ組７３１のデータ型７３５は、型取得工程Ｓ２３２で取得した文字列データである。ソース解析部１２０は、磁気ディスク装置９２０を用いて、生成したデータ組７３１を、引数解析データ７３０の一部として記憶する。ソース解析部１２０は、ＣＰＵ９１１を用いて、引数宣言取得工程Ｓ２３１に処理を戻し、次の引数を選択する。
【００６８】
ソース解析部１２０は、例えば上記のようにして、ソースコード１０１を解析する。
例えば、ソース解析部１２０は、図１２に示した２つのソースコード１０１ａ，１０１ｂを解析して、図１３〜図１５に示したクラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０を生成する。
【００６９】
図１７は、この実施の形態における依存注入データ１０７の一例を示す図である。
依存注入データ１０７は、例えばスプリングフレームワークのビーン定義ファイルや、シーサー２のｄｉｃｏｎファイルのように、依存注入装置８３０が解釈可能な形式のデータである。依存注入データ１０７は、例えばＸＭＬ形式で記述されている。
この例における依存注入データ１０７は、名前空間Ｎ１のクラスＣ１１のインスタンスに対して、名前空間Ｎ２のクラスＣ２１のインスタンスを生成し、生成したインスタンスをコンストラクタの引数として渡すことを指定している。また、この例における依存注入データ１０７は、名前空間Ｎ３のクラスＣ３１のインスタンスに対して、名前空間Ｎ４のクラスＣ４１のインスタンスを生成し、生成したインスタンスを初期化メソッドｍ３１の引数として渡すことを指定している。
【００７０】
図１８は、この実施の形態における依存解析データ７４０の一例を示す図である。
依存解析データ７４０は、依存解析部１３０が依存注入データ１０７を解析した結果を表わすデータの一例である。依存解析部１３０は、依存注入データ１０７を解析した結果に基づいて、ＣＰＵ９１１を用いて、依存解析データ７４０を生成する。依存解析部１３０は、磁気ディスク装置９２０を用いて、生成した依存解析データ７４０を記憶する。
依存解析データ７４０は、複数のデータ組７４１ａ〜７４１ｂを有する。データ組７４１ａ〜７４１ｂは、それぞれ、注入方式７４２、注入先クラス名７４３、注入クラス名７４４を有する。注入方式７４２は、コンストラクタを使うか初期化メソッドを使うかなど依存性を注入する方式を表わす文字列データである。注入先クラス名７４３は、依存性を注入する注入先のクラスの完全修飾名を表わす文字列データである。注入クラス名７４４は、注入されるクラスの完全修飾名を表わす文字列データである。依存性の注入により、注入先クラス名７４３が表わすクラスは、注入クラス名７４４が表わすクラスを利用することになる。
例えば、データ組７４１ａは、名前空間Ｎ１のクラスＣ１１が、コンストラクタＣ１１を使って注入される名前空間Ｎ２のクラスＣ２１を利用することを意味している。また、データ組７４１ｂは、名前空間Ｎ３のクラスＣ３１が、初期化メソッドｍ３１を使って注入される名前空間Ｎ４のクラスＣ４１を利用することを意味している。
【００７１】
図１９は、この実施の形態における依存解析処理Ｓ２４０の流れの一例を示すフローチャート図である。
依存解析処理Ｓ２４０において、依存解析部１３０は、依存注入データ１０７を解析して、依存解析データ７４０を生成する。依存解析処理Ｓ２４０は、依存入力工程Ｓ２４１、注入先クラス取得工程Ｓ２４２、注入方式取得工程Ｓ２４３、注入クラス取得工程Ｓ２４４、依存解析生成工程Ｓ２４５を有する。依存解析部１３０は、ＣＰＵ９１１を用いて、依存入力工程Ｓ２４１から処理を開始する。
【００７２】
依存入力工程Ｓ２４１において、依存入力部１１２は、ＣＰＵ９１１を用いて、入力すべき１以上の依存注入データ１０７のなかから、未処理の依存注入データ１０７を１つ入力する。
入力すべき依存注入データ１０７がすべて処理済である場合、依存入力部１１２は、ＣＰＵ９１１を用いて、依存解析処理Ｓ２４０を終了する。
入力すべき依存注入データ１０７のなかに、未処理の依存注入データ１０７がある場合、依存入力部１１２は、ＣＰＵ９１１を用いて、その依存注入データ１０７を入力し、注入先クラス取得工程Ｓ２４２へ処理を進める。
【００７３】
注入先クラス取得工程Ｓ２４２において、依存解析部１３０は、ＣＰＵ９１１を用いて、依存入力工程Ｓ２４１で入力した依存注入データ１０７で依存性の注入先として指定されているクラスのなかから、未処理のクラスを１つ選択する。
依存性の注入先として指定されているクラスがすべて処理済である場合、依存解析部１３０は、ＣＰＵ９１１を用いて、ソース入力工程Ｓ２２１に処理を戻し、次の依存注入データ１０７を入力する。
依存性の注入先として指定されているクラスのなかに、未処理のクラスがある場合、依存解析部１３０は、ＣＰＵ９１１を用いて、依存入力工程Ｓ２４１で依存入力部１１２が入力した依存注入データ１０７のなかから、選択したクラスに対する依存性の注入を指定している部分を取得する。依存解析部１３０は、ＣＰＵ９１１を用いて、注入方式取得工程Ｓ２４３へ処理を進める。
【００７４】
注入方式取得工程Ｓ２４３において、依存解析部１３０は、ＣＰＵ９１１を用いて、注入先クラス取得工程Ｓ２４２で取得した依存注入データ１０７の一部で指定された依存性の注入方式のなかから、未処理の注入方式を１つ選択する。
そのクラスへの依存性の注入方式がすべて処理済である場合、依存解析部１３０は、ＣＰＵ９１１を用いて、注入先クラス取得工程Ｓ２４２に処理を戻し、次のクラスを選択する。
そのクラスへの依存性の注入方式のなかに、未処理の注入方式がある場合、依存解析部１３０は、ＣＰＵ９１１を用いて、注入先クラス取得工程Ｓ２４２で取得した依存注入データ１０７の一部に基づいて、選択した注入方式を表わす文字列データを取得する。依存解析部１３０は、ＣＰＵ９１１を用いて、注入クラス取得工程Ｓ２４４へ処理を進める。
【００７５】
注入クラス取得工程Ｓ２４４において、依存解析部１３０は、ＣＰＵ９１１を用いて、注入方式取得工程Ｓ２４３で選択した注入方式において注入されるクラスのなかから、未処理のクラスを１つ選択する。
その注入方式において注入されるクラスがすべて処理済である場合、依存解析部１３０は、ＣＰＵ９１１を用いて、注入方式取得工程Ｓ２４３に処理を戻し、次の注入方式を選択する。
その注入方式において注入されるクラスのなかに、未処理のクラスがある場合、依存解析部１３０は、ＣＰＵ９１１を用いて、注入先クラス取得工程Ｓ２４２で取得した依存注入データ１０７の一部から、選択したクラスを表わす文字列データを取得し、取得した文字列データからそのクラスの完全修飾名を表わす文字列データを算出する。依存解析部１３０は、ＣＰＵ９１１を用いて、依存解析生成工程Ｓ２４５へ処理を進める。
【００７６】
依存解析生成工程Ｓ２４５において、依存解析部１３０は、ＣＰＵ９１１を用いて、データ組７４１を生成する。依存解析部１３０が生成するデータ組７４１の注入方式７４２は、注入方式取得工程Ｓ２４３で取得した文字列データである。依存解析部１３０が生成するデータ組７４１の注入先クラス名７４３は、注入先クラス取得工程Ｓ２４２で選択したクラスの完全修飾名である。依存解析部１３０が生成するデータ組７４１の注入クラス名７４４は、注入クラス取得工程Ｓ２４４で算出した完全修飾名である。依存解析部１３０は、磁気ディスク装置９２０を用いて、生成したデータ組７４１を、依存解析データ７４０の一部として記憶する。依存解析部１３０は、ＣＰＵ９１１を用いて、注入クラス取得工程Ｓ２４４に処理を戻し、次の注入されるクラスを選択する。
【００７７】
依存解析部１３０は、例えばこのようにして、依存注入データ１０７を解析する。
例えば、依存解析部１３０は、図１７に示した依存注入データ１０７を解析して、図１８に示した依存解析データ７４０を生成する。
【００７８】
図２０は、この実施の形態における利用解析データ７５０の一例を示す図である。
利用解析データ７５０は、利用判定部１４０が判定した結果を表わすデータの一例である。利用判定部１４０は、ＣＰＵ９１１を用いて、ソース解析部１２０が生成したクラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０や、依存解析部１３０が生成した依存解析データ７４０などに基づいて、利用解析データ７５０を生成する。利用判定部１４０は、磁気ディスク装置９２０を用いて、生成した利用解析データ７５０を記憶する。
利用解析データ７５０は、複数のデータ組７５１ａを有する。データ組７５１ａは、それぞれ、利用クラス名７５２、提供クラス名７５３を有する。利用クラス名７５２は、注入された依存性に基づいて、他のクラスを利用するクラスの完全修飾名を表わす文字列データである。提供クラス名７５３は、注入された依存性に基づいて、他のクラスに利用されるクラスの完全修飾名を表わす文字列データである。
例えば、データ組７５１ａは、名前空間Ｎ１のクラスＣ１１が、名前空間Ｎ２のクラスＣ２１を利用することを意味する。
【００７９】
図２１は、この実施の形態における利用判定処理Ｓ２５０の流れの一例を示すフローチャート図である。
利用判定処理Ｓ２５０において、利用判定部１４０は、ソース解析部１２０が生成したクラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０と、依存解析部１３０が生成した依存解析データ７４０とに基づいて、依存注入データ１０７で指定された依存性のうち、実際に、ソースコード１０１で記述されたクラスに注入できる依存性を判定し、利用解析データ７５０を生成する。利用判定処理Ｓ２５０は、依存解析取得工程Ｓ２５１、注入先判定工程Ｓ２５２、注入方式判定工程Ｓ２５３、注入クラス判定工程Ｓ２５４、継承判定工程Ｓ２５５、利用解析生成工程Ｓ２５６を有する。利用判定部１４０は、依存解析取得工程Ｓ２５１から処理を開始する。
【００８０】
依存解析取得工程Ｓ２５１において、利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析処理Ｓ２４０で依存解析部１３０が生成した依存解析データ７４０のなかから、未処理のデータ組７４１を１つ選択する。
データ組７４１がすべて処理済である場合、利用判定部１４０は、ＣＰＵ９１１を用いて、利用判定処理Ｓ２５０を終了する。
依存解析データ７４０のなかに、未処理のデータ組７４１がある場合、利用判定部１４０は、ＣＰＵ９１１を用いて、そのデータ組７４１を取得する。利用判定部１４０は、ＣＰＵ９１１を用いて、注入先判定工程Ｓ２５２へ処理を進める。
【００８１】
注入先判定工程Ｓ２５２において、利用判定部１４０は、依存解析取得工程Ｓ２５１で取得したデータ組７４１によって指定された注入先のクラスが、ソースコード１０１で宣言されているかをチェックする。利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析取得工程Ｓ２５１で取得したデータ組７４１に基づいて、メンバー解析データ７２０を検索する。利用判定部１４０は、ＣＰＵ９１１を用いて、メンバー解析データ７２０のなかから、所属クラス名７２３が注入先クラス名７４３に一致し、メンバー名７２２が注入方式７４２に一致するデータ組７２１を探す。
所属クラス名７２３が注入先クラス名７４３に一致し、メンバー名７２２が注入方式７４２に一致するデータ組７２１が見つからなかった場合、利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析取得工程Ｓ２５１に処理を戻し、次のデータ組７４１を選択する。
所属クラス名７２３が注入先クラス名７４３に一致し、メンバー名７２２が注入方式７４２に一致するデータ組７２１が見つかった場合、利用判定部１４０は、ＣＰＵ９１１を用いて、注入方式判定工程Ｓ２５３へ処理を進める。
【００８２】
注入方式判定工程Ｓ２５３において、利用判定部１４０は、依存解析取得工程Ｓ２５１で取得したデータ組７４１によって指定された注入方式により、注入されるクラスが、ソースコード１０１でどのようなデータ型として宣言されているかを判定する。利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析取得工程Ｓ２５１で取得したデータ組７４１に基づいて、引数解析データ７３０を検索する。利用判定部１４０は、ＣＰＵ９１１を用いて、引数解析データ７３０のなかから、所属クラス名７３４が注入先クラス名７４３に一致し、メソッド名７３３が注入方式７４２に一致するデータ組７３１を探す。
所属クラス名７３４が注入先クラス名７４３に一致し、メソッド名７３３が注入方式７４２に一致するデータ組７３１が見つからなかった場合、利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析取得工程Ｓ２５１に処理を戻し、次のデータ組７４１を選択する。
所属クラス名７３４が注入先クラス名７４３に一致し、メソッド名７３３が注入方式７４２に一致するデータ組７３１が見つかった場合、利用判定部１４０は、ＣＰＵ９１１を用いて、見つけたデータ組７３１からデータ型７３５を取得する。利用判定部１４０は、ＣＰＵ９１１を用いて、注入クラス判定工程Ｓ２５４へ処理を進める。
【００８３】
注入クラス判定工程Ｓ２５４において、利用判定部１４０は、依存解析取得工程Ｓ２５１で取得したデータ組７４１によって指定された注入されるクラスの型が、注入先のクラスが受け取る型と一致するかを判定する。利用判定部１４０は、ＣＰＵ９１１を用いて、クラス解析データ７１０を検索する。利用判定部１４０は、ＣＰＵ９１１を用いて、クラス解析データ７１０のなかから、クラス名７１２が、依存解析取得工程Ｓ２５１で取得したデータ組７４１の注入クラス名７４４（あるいは、後述する継承判定工程Ｓ２５５で取得した継承クラス名７１３）に一致するデータ組７１１を探す。
クラス名７１２が注入クラス名７４４（あるいは継承クラス名７１３）に一致するデータ組７１１が見つからなかった場合、利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析取得工程Ｓ２５１に処理を戻し、次のデータ組７４１を選択する。
クラス名７１２が注入クラス名７４４（あるいは継承クラス名７１３）に一致するデータ組７１１が見つかった場合、利用判定部１４０は、ＣＰＵ９１１を用いて、継承判定工程Ｓ２５５へ処理を進める。
【００８４】
継承判定工程Ｓ２５５において、利用判定部１４０は、ＣＰＵ９１１を用いて、注入クラス判定工程Ｓ２５４で見つけたデータ組７１１から、継承クラス名７１３を取得する。利用判定部１４０は、ＣＰＵ９１１を用いて、取得した継承クラス名７１３と、注入方式判定工程Ｓ２５３で取得したデータ型７３５とが一致するか否かを判定する。
継承クラス名７１３とデータ型７３５とが一致しない場合、利用判定部１４０は、ＣＰＵ９１１を用いて、注入クラス判定工程Ｓ２５４に処理を戻し、クラス解析データ７１０を更に検索する。
継承クラス名７１３とデータ型７３５とが一致した場合、利用判定部１４０は、ＣＰＵ９１１を用いて、利用解析生成工程Ｓ２５６へ処理を進める。
【００８５】
利用解析生成工程Ｓ２５６において、利用判定部１４０は、ＣＰＵ９１１を用いて、データ組７５１を生成する。利用判定部１４０が生成するデータ組７５１の利用クラス名７５２は、依存解析取得工程Ｓ２５１で選択したデータ組７４１の注入先クラス名７４３である。利用判定部１４０が生成するデータ組７５１の提供クラス名７５３は、依存解析取得工程Ｓ２５１で選択したデータ組７４１の注入クラス名７４４である。利用判定部１４０は、磁気ディスク装置９２０を用いて、生成したデータ組７５１を、利用解析データ７５０の一部として記憶する。利用判定部１４０は、ＣＰＵ９１１を用いて、依存解析取得工程Ｓ２５１に処理を戻し、次のデータ組７４１を選択する。
【００８６】
利用判定部１４０は、例えばこのようにして、クラスの利用関係を判定する。
例えば、利用判定部１４０は、図１３〜図１５に示したクラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０と、図１８に示した依存解析データ７４０とに基づいて、図２０に示した利用解析データ７５０を生成する。
ここで、図１８に示した依存解析データ７４０に含まれるデータ組７４１のうち、データ組７４１ａは、注入先判定工程Ｓ２５２〜継承判定工程Ｓ２５５のチェックを通るので、利用判定部１４０は、データ組７４１ａに対応するデータ組７５１ａを生成する。これに対し、データ組７４１ｂは、注入先クラス名７４３が表わす名前空間Ｎ３のクラスＣ３１が、ソースコード１０１ａ，１０１ｂで宣言されているクラスではないので、注入先判定工程Ｓ２５２のチェックを通らない。このため、利用判定部１４０は、データ組７４１ｂに対応するデータ組７５１を生成しない。
【００８７】
図２２は、この実施の形態におけるクラス図１０６の一例を示す図である。
クラス図１０６は、例えば、複数のクラス図形７６１ａ〜７６１ｅ、１以上の関係図形７６３ａ〜７６３ｅを有する。
【００８８】
クラス図形７６１ａ〜７６１ｅは、それぞれ、１つのクラスに対応する。クラス図形７６１ａ〜７６１ｅは、対応するクラスの名称やメンバーなどを表わす。クラス図形７６１ａ〜７６１ｅは、例えば、メンバー図形７６２ａ〜７６２ｅを有する。メンバー図形７６２ａ〜７６２ｅは、それぞれ、１つのメンバーに対応する。メンバー図形７６２ａ〜７６２ｅは、対応するメンバーの名称、データ型、引数などを表わす。
例えば、クラス図形７６１ａは、名前空間Ｎ１のクラスＣ１１を表わしている。クラス図形７６１ａは、名前空間Ｎ１のクラスＣ１１が、３つのメンバー変数ｆ１１，ｆ１２，ｆ１３と、１つのメソッドｍ１１を有することを表わしている。メンバー図形７６２ａは、メンバー変数ｆ１１がｉｎｔ型であることを表している。メンバー図形７６２ｅは、メソッドｍ１１がｖｏｉｄ型であり、１つの引数ｐ１を取り、引数ｐ１が名前空間Ｎ２のインタフェースＩ２１型であることを表している。
【００８９】
関係図形７６３ａ〜７６３ｅは、それぞれ、２つのクラスの間の関係を表わす。
例えば、関係図形７６３ａは、名前空間Ｎ１のクラスＣ１２が、名前空間Ｎ１のクラスＣ１１から派生したクラスであることを表わしている。関係図形７６３ｂは、名前空間Ｎ２のクラスＣ２１が、名前空間Ｎ２のインタフェースＩ２１を実装したクラスであることを表わしている。関係図形７６３ｄは、名前空間Ｎ１のクラスＣ１１と名前空間Ｎ２のインタフェースＩ２１とは、名前空間Ｎ１のクラスＣ１１のインスタンスから名前空間Ｎ２のインタフェースＩ２１を実装したインスタンスを誘導できるという関連があることを表わしている。関係図形７６３ｅは、名前空間Ｎ１のクラスＣ１１が名前空間Ｎ２のクラスＣ２１に依存しているという関係があることを表わしている。
【００９０】
図２３は、この実施の形態におけるクラス図生成処理Ｓ２６０の流れの一例を示すフローチャート図である。
クラス図生成処理Ｓ２６０において、クラス図生成部１５０は、ソース解析部１２０が生成したクラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０と、利用判定部１４０が生成した利用解析データ７５０とに基づいて、クラス図１０６を生成する。クラス図生成処理Ｓ２６０は、クラス解析取得工程Ｓ２６１、クラス関係生成工程Ｓ２６２、利用解析検索工程Ｓ２６３、クラス関係生成工程Ｓ２６４、メンバー解析検索工程Ｓ２６６、クラス関係生成工程Ｓ２６７、引数解析検索工程Ｓ２６８、クラス関係生成工程Ｓ２６９、メンバー図形生成工程Ｓ２７１、クラス図形生成工程Ｓ２７２、クラス図形配置工程Ｓ２７４、クラス関係取得工程Ｓ２７５、関係図形配置工程Ｓ２７６、クラス図出力工程Ｓ２７９を有する。クラス図生成部１５０は、クラス解析取得工程Ｓ２６１から処理を開始する。
【００９１】
クラス解析取得工程Ｓ２６１において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、ソース解析処理Ｓ２２０でソース解析部１２０が生成したクラス解析データ７１０から、未処理のデータ組７１１を１つ選択する。
データ組７１１がすべて処理済である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス図形配置工程Ｓ２７４へ処理を進める。
クラス解析データ７１０のなかに、未処理のデータ組７１１がある場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、そのデータ組７１１を取得する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６２へ処理を進める。
【００９２】
クラス関係生成工程Ｓ２６２において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス解析取得工程Ｓ２６１で取得したデータ組７１１から、クラス名７１２と、継承クラス名７１３とを取得する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス名７１２が表わすクラス（あるいはインタフェース）と、継承クラス名７１３が表わすクラス（あるいはインタフェース）との間に、継承関係があることを表わすデータ（クラス関係データ）を生成する。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したクラス関係データを記憶する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、利用解析検索工程Ｓ２６３へ処理を進める。
【００９３】
利用解析検索工程Ｓ２６３において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、利用解析データ７５０を検索して、利用クラス名７５２が、クラス関係生成工程Ｓ２６２で取得したクラス名７１２と一致するデータ組７５１を探す。
利用クラス名７５２がクラス名７１２と一致するデータ組７５１が見つかった場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、見つかったデータ組７５１のなかから、未処理のデータ組７５１を１つ選択する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６４へ処理を進める。
利用クラス名７５２がクラス名７１２と一致するデータ組７５１が見つからなかった場合や、見つかったデータ組７５１がすべて処理済である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、メンバー解析検索工程Ｓ２６６へ処理を進める。
【００９４】
クラス関係生成工程Ｓ２６４において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、利用解析検索工程Ｓ２６３で選択したデータ組７５１から、提供クラス名７５３を取得する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６２で取得したクラス名７１２が表わすクラス（あるいはインタフェース）と、取得した提供クラス名７５３が表わすクラス（あるいはインタフェース）との間に、依存関係があることを表わすクラス関係データを生成する。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したクラス関係データを記憶する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、利用解析検索工程Ｓ２６３に処理を戻し、次のデータ組７５１を取得する。
【００９５】
メンバー解析検索工程Ｓ２６６において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、ソース解析処理Ｓ２２０でソース解析部１２０が生成したメンバー解析データ７２０を検索して、所属クラス名７２３が、クラス関係生成工程Ｓ２６２で取得したクラス名７１２と一致するデータ組７２１を探す。
所属クラス名７２３がクラス名７１２と一致するデータ組７２１が見つかった場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、見つかったデータ組７２１のなかから、未処理のデータ組７２１を１つ選択する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６７へ処理を進める。
所属クラス名７２３がクラス名７１２と一致するデータ組７２１が見つからなかった場合や、見つかったデータ組７２１がすべて処理済である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス図形生成工程Ｓ２７２へ処理を進める。
【００９６】
クラス関係生成工程Ｓ２６７において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、メンバー解析検索工程Ｓ２６６で選択したデータ組７２１から、データ型７２４を取得する。取得したデータ型７２４がクラス型（あるいはインタフェース型）である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６２で取得したクラス名７１２が表わすクラス（あるいはインタフェース）と、取得したデータ型７２４が表わすクラス（あるいはインタフェース）との間に、関連があることを表わすクラス関係データを生成する。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したクラス関係データを記憶する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、引数解析検索工程Ｓ２６８へ処理を進める。
【００９７】
引数解析検索工程Ｓ２６８において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、メンバー解析検索工程Ｓ２６６で選択したデータ組７２１から、メンバー名７２２を取得する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、ソース解析処理Ｓ２２０でソース解析部１２０が生成した引数解析データ７３０を検索して、所属クラス名７３４が、クラス関係生成工程Ｓ２６２で取得したクラス名７１２に一致し、メソッド名７３３が、取得したメンバー名７２２と一致するデータ組７３１を探す。
所属クラス名７３４がクラス名７１２に一致し、メソッド名７３３がメンバー名７２２に一致するデータ組７３１が見つかった場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、見つかったデータ組７３１のなかから、未処理のデータ組７３１を１つ選択する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６９へ処理を進める。
所属クラス名７３４がクラス名７１２に一致し、メソッド名７３３がメンバー名７２２に一致するデータ組７３１が見つからなかった場合や、見つかったデータ組７３１がすべて処理済である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、メンバー図形生成工程Ｓ２７１へ処理を進める。
【００９８】
クラス関係生成工程Ｓ２６９において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、引数解析検索工程Ｓ２６８で選択したデータ組７３１から、データ型７３５を取得する。取得したデータ型７３５がクラス型（あるいはインタフェース型）である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係生成工程Ｓ２６２で取得したクラス名７１２が表わすクラス（あるいはインタフェース）と、取得したデータ型７３５が表わすクラス（あるいはインタフェース）との間に、関連があることを表わすクラス関係データを生成する。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したクラス関係データを記憶する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、引数解析検索工程Ｓ２６８に処理を戻し、次のデータ組７３１を選択する。
【００９９】
メンバー図形生成工程Ｓ２７１において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、メンバー解析検索工程Ｓ２６６で選択したデータ組７２１が表わすメンバーについて、メンバー図形７６２を生成する。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したメンバー図形７６２を記憶する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、メンバー解析検索工程Ｓ２６６に処理を戻し、次のデータ組７２１を選択する。
【０１００】
クラス図形生成工程Ｓ２７２において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス解析取得工程Ｓ２６１で選択したデータ組７１１が表わすクラス（あるいはインタフェース）について、クラス図形７６１を生成する。クラス図生成部１５０が生成するクラス図形７６１は、例えば、メンバー図形生成工程Ｓ２７１で生成したメンバー図形７６２を含む。クラス図生成部１５０は、磁気ディスク装置９２０を用いて、生成したクラス図形７６１を記憶する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス解析取得工程Ｓ２６１に処理を戻し、次のデータ組７１１を選択する。
【０１０１】
クラス図形配置工程Ｓ２７４において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス図形生成工程Ｓ２７２で生成したクラス図形７６１の配置を決定する。クラス図生成部１５０は、例えば、記憶したクラス関係データに基づいて、関係の深いクラスを近くに配置し、関係の浅いクラスを遠くに配置する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、決定した位置にクラス図形７６１を配置したクラス図１０６を生成する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係取得工程Ｓ２７５へ処理を進める。
【０１０２】
クラス関係取得工程Ｓ２７５において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、記憶したクラス関係データのなかから、未処理のクラス関係データを１つ選択する。
記憶したクラス関係データがすべて処理済である場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス図出力工程Ｓ２７９へ処理を進める。
記憶したクラス関係データのなかに、未処理のクラス関係データがある場合、クラス図生成部１５０は、ＣＰＵ９１１を用いて、選択したクラス関係データを取得する。クラス図生成部１５０は、ＣＰＵ９１１を用いて、関係図形配置工程Ｓ２７６へ処理を進める。
【０１０３】
関係図形配置工程Ｓ２７６において、クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係取得工程Ｓ２７５で取得したクラス関係データと、クラス図形配置工程Ｓ２７４で決定したクラス図形７６１の配置とに基づいて、クラス図形配置工程Ｓ２７４で生成したクラス図１０６に、関係図形７６３を描き加える。クラス図生成部１５０は、ＣＰＵ９１１を用いて、クラス関係取得工程Ｓ２７５に処理を戻し、次のクラス関係データを選択する。
【０１０４】
クラス図出力工程Ｓ２７９において、クラス図出力部１６０は、ＣＰＵ９１１を用いて、クラス図生成部１５０が生成したクラス図１０６を出力する。
【０１０５】
クラス図生成部１５０は、例えばこのようにして、クラス図１０６を生成する。
例えば、クラス図生成部１５０は、図１３〜図１５に示したクラス解析データ７１０、メンバー解析データ７２０、引数解析データ７３０と、図２０に示した利用解析データ７５０とに基づいて、図２２に示したクラス図１０６を生成する。
【０１０６】
この例において、クラス図形７６１ａが表わす名前空間Ｎ１のクラスＣ１１と、クラス図形７６１ｅが表わす名前空間Ｎ２のクラスＣ２１との間の依存関係は、ソースコード１０１ａ，１０１ｂではなく、依存注入データ１０７に記述された実行時に注入される関係である。
クラス図生成装置１００は、ソースコード１０１に基づくだけでなく、依存注入データ１０７にも基づいて、クラス図１０６を生成するので、関係図形７６３ｅのように、実行時に注入される依存関係を示す図形を含むクラス図１０６を生成することができる。
【０１０７】
クラス図生成装置１００は、コンピュータが実行することにより、上記コンピュータをクラス図生成装置１００として機能させるコンピュータプログラムにより、実現することができる。
【０１０８】
これにより、利用判定部１４０が、依存注入データ１０７とソースコード１０１とに基づいて、上記クラスが利用する他のクラスを判定し、ソースコード１０１にクラス間の利用関係が記述されていない場合でも、クラス間の利用関係を示すクラス図１０６を生成することができるクラス図生成装置１００を実現することができる。
【０１０９】
クラス図生成装置１００が、オブジェクト指向プログラミング言語により記述されたソースコード１０１から、クラス図１０６を生成するクラス図生成方法は、以下の工程を有する。
上記処理装置（ＣＰＵ９１１）が、クラスのソースコード１０１に含まれる間接指定データと、上記クラスが利用する他のクラスとの対応を指定する依存注入データ１０７を入力する。
上記処理装置（９１１）が、上記間接指定データを用いてクラスが利用する他のクラスを指定したソースコード１０１を入力する。
入力した依存注入データ１０７と、入力したソースコード１０１とに基づいて、上記処理装置（９１１）が、上記クラスが利用する他のクラスを判定する。
判定した結果に基づいて、上記処理装置（９１１）が、上記クラスの関係を示すクラス図１０６を生成する。
【０１１０】
処理装置（９１１）が、依存注入データ１０７とソースコード１０１とに基づいて、上記クラスが利用する他のクラスを判定するので、ソースコード１０１にクラス間の利用関係が記述されていない場合でも、クラス間の利用関係を示すクラス図１０６を生成することができる。
【符号の説明】
【０１１１】
１００  クラス図生成装置、１０１  ソースコード、１０２  インジェクション設定ファイル、１０３  クラス構造抽出部、１０４  クラス間関連生成部、１０５  クラス図生成部、１０６  クラス図、１０７  依存注入データ、１１１  ソース入力部、１１２  依存入力部、１２０  ソース解析部、１３０  依存解析部、１４０  利用判定部、１５０  クラス図生成部、１６０  クラス図出力部、２００  クラス図生成方法、２０１  ソースコード読込処理、２０２  クラス構造抽出処理、２０３  インジェクション設定ファイル読込処理、２０４  クラス間関連生成処理、２０５  クラス図生成処理、２０６  クラス図表示処理、３０１  ビーン存在判定工程、３０２  ビーン属性取得工程、３０３  ビーン関連生成工程、３０４  プロパティ存在判定工程、３０５  プロパティ属性取得工程、３０６  クラス間関連生成工程、４０１〜４０５  コード、５０１〜５０３  タグ、６０１，６０３  クラス、６０２  インタフェース、６０４  依存関係、７１０  クラス解析データ、７１１  データ組、７１２  クラス名、７１３  継承クラス名、７２０  メンバー解析データ、７２１  データ組、７２２  メンバー名、７２３  所属クラス名、７２４  データ型、７３０  引数解析データ、７３１  データ組、７３２  引数名、７３３  メソッド名、７３４  所属クラス名、７３５  データ型、７４０  依存解析データ、７４１  データ組、７４２  注入方式、７４３  注入先クラス名、７４４  注入クラス名、７５０  利用解析データ、７５１  データ組、７５２  利用クラス名、７５３  提供クラス名、７６１  クラス図形、７６２  メンバー図形、７６３  関係図形、８００  開発システム、８１０  コンパイラ装置、８２０  実行装置、８３０  依存注入装置、９０１  表示装置、９０２  キーボード、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ装置、９０７  スキャナ装置、９１０  システムユニット、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信装置、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群、９３１  電話器、９３２  ファクシミリ機、９４０  インターネット、９４１  ゲートウェイ、９４２  ＬＡＮ。
【図１】
2011232957.tif 000003
【図２】
2011232957.tif 000004
【図３】
2011232957.tif 000005
【図４】
2011232957.tif 000006
【図５】
2011232957.tif 000007
【図６】
2011232957.tif 000008
【図７】
2011232957.tif 000009
【図８】
2011232957.tif 000010
【図９】
2011232957.tif 000011
【図１０】
2011232957.tif 000012
【図１１】
2011232957.tif 000013
【図１２】
2011232957.tif 000014
【図１３】
2011232957.tif 000015
【図１４】
2011232957.tif 000016
【図１５】
2011232957.tif 000017
【図１６】
2011232957.tif 000018
【図１７】
2011232957.tif 000019
【図１８】
2011232957.tif 000020
【図１９】
2011232957.tif 000021
【図２０】
2011232957.tif 000022
【図２１】
2011232957.tif 000023
【図２２】
2011232957.tif 000024
【図２３】
2011232957.tif 000025