(57)【要約】【課題】構造が複雑化したソースコードには本来あるべきソフトウェア構造が含まれないため、ソースコードから問題のある依存関係を明示的に全てリストアップするのは困難である。【解決手段】ソフトウェア構造分析装置は、ソフトウェア構成要素の構成要素情報を取得する構成要素情報取得部１０１と、ソフトウェア構成要素の間の依存関係情報を取得する依存関係情報取得部１０２と、ソフトウェアの論理的構成要素の位置関係を保持する配置情報を取得する配置情報取得部１０３と、論理的構成要素とソフトウェア構成要素の対応関係である対応関係情報を取得する対応関係情報取得部１０４と、構成要素情報と依存関係情報と配置情報と対応関係情報から問題のある依存関係を特定する依存関係検査部１０５と、依存関係検査部１０５が特定した、問題のある依存関係の検査結果を出力する結果出力部１０６とを備える。【選択図】図１
2011170697.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェア構成要素の情報である構成要素情報を取得する構成要素情報取得部と、
前記ソフトウェア構成要素の間の依存関係である依存関係情報を取得する依存関係情報取得部と、
前記ソフトウェア構成要素を１つまたは複数まとめた論理的構成要素の位置関係を示す配置情報を取得する配置情報取得部と、
前記配置情報に含まれる前記論理的構成要素と前記ソフトウェア構成要素の対応関係である対応関係情報を取得する対応関係情報取得部と、
前記構成要素情報と前記依存関係情報と前記配置情報と前記対応関係情報から問題のある依存関係を特定する依存関係検査部と、
前記依存関係検査部が特定した問題のある依存関係の検査結果を出力する結果出力部と
を備えるソフトウェア構造分析装置。
【請求項２】
請求項１に記載のソフトウェア構造分析装置において、
前記構成要素情報に含まれる前記ソフトウェア構成要素のディレクトリ構成またはファイル構成、および前記論理的構成要素を含む前記配置情報を用いて、前記ソフトウェア構成要素と前記論理的構成要素の対応関係を表す対応関係情報を作成する、ソフトウェア構造分析装置。
【請求項３】
請求項２に記載のソフトウェア構造分析装置において、
前記ソフトウェア構成要素と前記論理的構成要素の対応関係を表す対応関係情報を作成する時に、いずれかの論理的構成要素に対応付けられたソフトウェア構成要素に包含されるソフトウェア構成要素が、別の論理的構成要素に対応付けられていないかどうかを判定する、ソフトウェア構造分析装置。
【請求項４】
請求項２に記載のソフトウェア構造分析装置において、
前記ソフトウェア構成要素と前記論理的構成要素の対応関係を表す対応関係情報を作成する時に、全ての論理的構成要素に対してソフトウェア構成要素を対応付けられているかどうかを判定する、ソフトウェア構造分析装置。
【請求項５】
請求項１〜４のいずれか１項に記載のソフトウェア構造分析装置において、
前記配置情報取得部が、前記論理的構成要素間の関係を幾何学的な位置関係で表したデータを、前記配置情報として取得する、ソフトウェア構造分析装置。
【請求項６】
請求項１〜５のいずれか１項に記載のソフトウェア構造分析装置において、
前記依存関係検査部は、前記依存関係情報で示される前記ソフトウェア構成要素の間の依存関係と、前記対応関係情報で示される前記論理的構成要素と前記ソフトウェア構成要素の対応関係から、前記論理的構成要素間の依存関係を算出し、当該論理的構成要素間の依存関係と、前記配置情報で示される前記論理的構成要素の位置関係とに基づいて問題のある依存関係を特定する、請求項１に記載のソフトウェア構造分析装置。
【請求項７】
請求項６に記載のソフトウェア構造分析装置において、
前記依存関係検査部が、前記論理的構成要素間の依存関係および前記配置情報で示される前記論理的構成要素の位置関係から、前記論理的構成要素間の各依存関係の方向を計算し、当該各依存関係の方向を基に問題のある依存関係を特定する、ソフトウェア構造分析装置。
【請求項８】
請求項７に記載のソフトウェア構造分析装置において、
前記依存関係検査部が、前記依存関係情報の方向から、前記配置情報が意味するソフトウェアの構造において問題のない依存関係情報の方向である依存関係方向情報を判断し、当該依存関係が示す方向情報と、前記論理的構成要素間の各依存関係とを比較することにより、問題のある依存関係を特定する、ソフトウェア構造分析装置。
【請求項９】
請求項８に記載のソフトウェア構造分析装置において、
前記依存関係検査部が、前記論理的構成要素間の各依存関係のうち、前記依存関係方向情報の示す方向に対して逆向きの依存関係を、問題のある依存関係と判定する、ソフトウェア構造分析装置。
【請求項１０】
請求項１〜９のいずれか1項に記載のソフトウェア構造分析装置において、
前記依存関係検査部が、前記配置情報から、依存元の論理的構成要素と依存先の論理的構成要素の距離を計算し、当該距離を用いて、問題のある依存関係を特定する、ソフトウェア構造分析装置。
【請求項１１】
請求項７に記載のソフトウェア構造分析装置において、
前記依存関係検査部が、前記依存関係方向情報の示す方向に対して逆向きである前記論理的構成要素間の依存関係のうち、前記配置情報における依存元の論理的構成要素と依存先の論理的構成要素の間の距離が、あらかじめ保持しているまたは外部から与えられる閾値を越える依存関係を、問題のある依存関係と判定する、ソフトウェア構造分析装置。
【請求項１２】
請求項１〜１１のいずれか１項に記載のソフトウェア構造分析装置において、
前記配置情報は、更新可能であり、
前記配置情報が更新された場合に、前記問題のある依存関係の特定および出力を実行することを特徴とするソフトウェア構造分析装置。
【請求項１３】
ソフトウェア構成要素の情報である構成要素情報を取得する構成要素情報取得処理と、
前記ソフトウェア構成要素の間の依存関係である依存関係情報を取得する依存関係情報取得処理と、
前記ソフトウェア構成要素を１つまたは複数まとめた論理的構成要素の位置関係を示す配置情報を取得する配置情報取得処理と、
前記配置情報に含まれる前記論理的構成要素と前記ソフトウェア構成要素の対応関係である対応関係情報を取得する対応関係情報取得処理と、
前記構成要素情報と前記依存関係情報と前記配置情報と前記対応関係情報から問題のある依存関係を特定する依存関係検査処理と、
前記依存関係検査処理が特定した問題のある依存関係の検査結果を出力する結果出力処理と
をコンピュータに実行させるソフトウェア構造分析プログラム。
【請求項１４】
コンピュータが実行するソフトウェア構造分析方法であって、
ソフトウェア構成要素の情報である構成要素情報を取得する構成要素情報取得工程と、
前記ソフトウェア構成要素の間の依存関係である依存関係情報を取得する依存関係情報取得工程と、
前記ソフトウェア構成要素を１つまたは複数まとめた論理的構成要素の位置関係を示す配置情報を取得する配置情報取得工程と、
前記配置情報に含まれる前記論理的構成要素と前記ソフトウェア構成要素の対応関係である対応関係情報を取得する対応関係情報取得工程と、
前記構成要素情報と前記依存関係情報と前記配置情報と前記対応関係情報から問題のある依存関係を特定する依存関係検査工程と、
前記依存関係検査工程で特定された問題のある依存関係の検査結果を出力する結果出力工程と
を含むソフトウェア構造分析方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア開発において、ソフトウェア構造の分析を支援するソフトウェア構造分析装置に関するものである。
【背景技術】
【０００２】
現在の組込みソフトウェア開発では、過去の成果物に対して追加・変更を行う差分開発が主流となっている。差分開発では、ソースコードの大部分が過去の成果物となるので、新規開発量を抑えることができ、開発の効率化が期待できる。しかし差分開発が繰り返された場合、ファイルや関数、変数などのソフトウェアの構成要素とそれらの関係であるソフトウェア構造の複雑化が引き起こされる。ソフトウェア構造の複雑化は、「ソフトウェアの全体構造が把握できない」「追加・変更によって多くの箇所が影響を受ける」「変更によってどの部分が影響を受けるのか特定できない」などの問題を引き起こし、開発の効率化を妨げる原因となる。複雑化したソフトウェア構造の現状を明らかにして、ソフトウェア構造の問題箇所を特定することができれば、その箇所を改善することで、機能の追加・変更が容易なソフトウェア構造にリファクタリングすることができる。
【０００３】
ソフトウェア構造の例としては、例えば図２の模式図に示すファイル間の依存関係がある。図２に含まれる図のうち、図２０１などの矩形はファイルを意味し、矢印２０２などの矢印はファイル間の依存関係を意味する。依存関係の例としては、例えば関数の呼び出し関係、関数による変数からの値の読み取り関係、関数による変数への値の書き込み関係、ファイルのインクルード関係などがある。
【０００４】
ソフトウェア構造の問題箇所を特定するための従来技術としては、例えば特許文献１に示される情報提供装置があった。
【０００５】
特許文献１に記載の技術は、プログラムに含まれる参照元の関数、参照先の関数のそれぞれが属するモジュールの関係が、記憶されているモデル情報に適合するか否かを検査し、適合しない場合は関連する関数を特定することにより、ユーザが作成したプログラムがソフトウェアのアーキテクチャに合っているか否かを判断し、どの関数を修正すればよいかを特定する情報を提供するものである。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開2008-102831号公報
【非特許文献】
【０００７】
【非特許文献１】T.J.PARR and R.W.QUONG, "ANTLR: A Predicated-LL(k) Parser Generator", Software-Practice & Experience, vol. 25, Issue 7, pp.789-810, 1995.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
差分開発が繰り返された結果、ファイルや関数、変数などのソフトウェアの構成要素とそれらの関係であるソフトウェア構造の複雑化が引き起こされる。その複雑化したソフトウェア構造を明らかにして問題箇所を特定するためには、現状の複雑化したソフトウェア構造と、当初の設計者が意図したソフトウェア構造との違いを明らかにする必要がある。しかしながら現状の複雑化したソフトウェア構造を示す文書、図面などが実際の開発では作成されていないのが普通であり、差分開発で修正されたソースコードにしか残っていない。したがって現状の複雑化したソフトウェア構造は、ソースコードから読み取る必要がある。
【０００９】
特許文献１に記載の従来技術では、設計者が意図したソフトウェア構造であるソフトウェアのアーキテクチャにおいて許可されない依存関係を特定するために、許可される依存関係のリストを予め作成する必要がある。しかしながら、実際のソフト開発においてソフトウェアのアーキテクチャは、依存関係一つ一つのリストを作成できるほど明文化されていない。そのため、許可される依存関係全てをリストアップすることは困難である。
通常、当初の設計者が意図したソフトウェア構造は詳細に明文化されていないことが多い。例えば全体の構造の概略をブロックの配置よって表現したソフトウェア構造図などあるだけで、現状のソースコードと直接対応づけられるような詳細な構造を記述したものがないことが通常の開発においては多い。すなわち、構造が複雑化したソースコードには、本来あるべきソフトウェア構造の情報が含まれないため、ソースコードから問題のある依存関係を明示的に全てリストアップするのは困難である。
【００１０】
したがって、現状の複雑化したソフトウェア構造の問題箇所を特定するためには、ソフトウェア構造図などの概略で書かれた情報を用いて、設計者が意図したソフトウェア構造と、現状の複雑化したソースコードの違いを明らかにする必要がある。
【００１１】
本願に開示の発明は、前記従来技術の課題を解決するため、ソフトウェアのアーキテクチャが表現されている構成要素の配置の情報を用いて、ソースコードが持つ依存関係のうち、配置の情報が表す依存関係と違いのある依存関係を問題のある依存関係として特定するソフトウェア構造分析装置を提供する。
【課題を解決するための手段】
【００１２】
上記従来の課題を解決するため、本願に開示するソフトウェア構造分析装置は、ソフトウェア構成要素の情報である構成要素情報を取得する構成要素情報取得部と、前記ソフトウェア構成要素の間の依存関係である依存関係情報を取得する依存関係情報取得部と、前記ソフトウェア構成要素を１つまたは複数まとめた論理的構成要素の位置関係を示す配置情報を取得する配置情報取得部と、前記配置情報に含まれる前記論理的構成要素と前記ソフトウェア構成要素の対応関係である対応関係情報を取得する対応関係情報取得部と、前記構成要素情報と前記依存関係情報と前記配置情報と前記対応関係情報から問題のある依存関係を特定する依存関係検査部と、前記依存関係検査部が特定した、問題のある依存関係の検査結果を出力する結果出力部とを備えることを特徴とする。
【発明の効果】
【００１３】
以上の特徴により、本発明は、全体の構造の概略を記述したソフトウェア構造図の配置情報を用いることにより、構造が複雑化したソースコードから、当初の設計者の意図と反したソフトウェア構造の問題のある依存関係を特定することができる。
【図面の簡単な説明】
【００１４】
【図１】本発明であるソフトウェア構造分析装置の構造を表す概略図である。
【図２】ファイル間の依存関係を表した、ソフトウェアの構造の模式図である。
【図３】本発明であるソフトウェア構造分析装置による、問題のある依存関係を特定する処理の流れを示す図である。
【図４】構成要素情報取得部が取得する、構成要素情報の一例を示す図である。
【図５】図４に示す構成要素情報で与えられる構成要素の包含関係を表した模式図である。
【図６】依存関係情報取得部が取得する、依存関係情報の一例を示す図である。
【図７】ソフトウェアの構造を表すソフトウェア構造図の一例を示す図である。
【図８】配置情報取得部が取得する、配置情報の一例を示す図である。
【図９】対応関係取得部が取得または作成する、対応関係情報の一例を示す図である。
【図１０】対応関係情報を作成するための装置利用者の操作例を表す模式図である。
【図１１】対応関係情報取得部が、構成要素とその構成要素が包含する構成要素が異なるブロックに対応付けられていないかを検査する処理の流れを示す図である。
【図１２】対応関係情報取得部が、全てのブロックについて対応関係情報を指定し終えたかをチェックする処理の流れを示す図である。
【図１３】本発明で提案する装置が、依存関係情報と配置情報を対応付け、ブロック間依存関係情報を作成する処理の流れを示す図である。
【図１４】取得した構成要素のIDから対応するブロックを特定する処理の流れを示す図である。
【図１５】図１３乃至図１４の処理によって作成される、ブロック間依存関係情報の一例を示す図である。
【図１６】依存関係検査部が、依存関係方向情報を判断する処理の流れを示す図である。
【図１７】依存関係検査部が、各ブロック間依存関係情報レコードの上下方向の情報を判定する処理の流れを示す図である。
【図１８】依存関係検査部が、各ブロック間依存関係情報レコードの左右方向の情報を判定する処理の流れを示す図である。
【図１９】依存関係検査部が作成する、依存関係の方向の情報を追加した、ブロック間依存関係情報の一例を示す図である。
【図２０】依存関係検査部が、依存関係方向情報と逆向きの依存関係を、問題のある依存関係として特定する処理の流れを示す図である。
【図２１】依存関係方向情報に対して逆向きの依存関係の一例を説明するための説明図である。
【図２２】図１９に示すブロック間依存関係情報に、依存関係方向に対して逆向きの依存関係かどうかの検査結果を追加した、検査結果付きブロック間依存関係情報の一例を示す図である。
【図２３】図２２に示す検査結果を基に結果出力部が出力する、問題のある依存関係の検査結果の一例を示す図である。
【図２４】全てのブロックの大きさが等しい構造図における、範囲許容値S0と、依存元のブロックの中心と依存先のブロックの中心の、依存関係方向情報とは逆の方向の距離Sの関係を示す模式図である。
【図２５】依存関係検査部が、依存関係方向情報と逆向きの依存関係のうち、依存関係方向情報と同じ方向の距離Sが範囲許容値S0以上である依存関係を、問題のある依存関係として特定する処理の流れを示す図である。
【図２６】距離許容値L0の初期値を配置情報の入力となる構造図の横幅の2/3とした場合の、L0と依存元のブロックと依存先のブロックの中心間の距離Lの関係を示す模式図である。
【図２７】依存関係検査部による、離れた論理的構成要素間の依存関係を特定する処理の流れを示す図である。
【図２８】離れた論理的構成要素間の依存関係の一例を説明するための説明図である。
【図２９】図１９に示すブロック間依存関係情報に、離れた論理的構成要素間の依存関係かどうかの検査結果を追加した、検査結果付きブロック間依存関係情報の一例を示す図である。
【図３０】図２９に示す検査結果を基に結果出力部が出力する、問題のある依存関係の検査結果の一例を示す図である。
【図３１】依存関係検査部による、依存関係方向情報に対して逆向きの依存関係と離れた論理的構成要素間の依存関係を特定する処理の流れを示す図である。
【図３２】図１９に示すブロック間依存関係情報に、依存関係方向情報に対して逆向きの依存関係または離れた論理的構成要素間の依存関係かどうかの検査結果を追加した、検査結果付きブロック間依存関係情報の一例を示す図である。
【図３３】図３２に示す検査結果を基に結果出力部が出力する、問題のある依存関係の検査結果の一例を示す図である。
【図３４】結果出力部が出力した問題のある依存関係の検査結果に対して、装置利用者が配置情報を変更する操作を表した模式図である。
【図３５】変更された配置情報の一例を示す図である。
【図３６】変更された配置情報から検査対象のブロック間依存関係を特定する処理の流れを示す図である。
【図３７】変更された配置情報に対して問題のある依存関係を検査した結果の一例を示す図である。
【図３８】結果出力部が出力する、配置情報の変更後の問題のある依存関係の検査結果の一例を示す図である。
【発明を実施するための形態】
【００１５】
以下本発明の実施の形態について、図面を参照しながら説明する。
【００１６】
（実施の形態１）
［ソフトウェア構造分析装置の構成例］
まず、本発明の第一の実施の形態におけるソフトウェア構造分析装置の構成を説明する。図１は、本発明の第一の実施の形態におけるソフトウェア構造分析装置の構成例を示すブロック図である。図１に示すように、本発明であるソフトウェア構造分析装置は、ソフトウェアの構成要素情報を取得する構成要素情報取得部１０１と、ソフトウェア構成要素の間の依存関係情報を取得する依存関係情報取得部１０２と、ソフトウェア構成要素を１つまたは複数まとめた論理的構成要素の位置関係を示す配置情報を取得する配置情報取得部１０３と、前記配置情報が保持する論理的構成要素と前記構成要素情報が保持するソフトウェア構成要素を対応付けた情報である対応関係情報を取得する対応関係情報取得部１０４と、前記構成要素情報と前記依存関係情報と前記配置情報と前記対応関係情報から問題のある依存関係を特定する依存関係検査部１０５と、前記依存関係検査部１０５から取得した問題のある依存関係の検査結果を出力する結果出力部１０６から構成される。
【００１７】
構成要素情報取得部１０１は、ソフトウェア構成要素の情報である構成要素情報を取得して、ソフトウェア構造分析装置のメモリに記録する等して、使用可能な状態にする。ソフトウェア構成要素は、分析対象となるソフトウェアに含まれるコンピュータへの命令や扱うデータを定義する情報（プログラムに関する情報）を、開発上意味のある要素に分類したものである。構成要素情報は、ソフトウェア構成要素が互いに識別可能な形式で記録されたデータとすることができる。ソフトウェア構成要素の分類方法や、構成要素情報のデータ形式は、特に限定されない。ソフトウェア構成要素の決め方として、例えば、ソフトウェア構成要素群が階層構造を有するように各ソフトウェア構成要素を決めることができる。すなわち、少なくとも１つのソフトウェア構成要素が、他の１つまたは複数のソフトウェア構成要素を包含していてもよい。具体的には、分析対象となるソフトウェアのソースコードのファイル、またはソフトウェアの実行ファイルを生成する過程に生成される中間ファイルのそれぞれを、ソフトウェアの構成要素とすることができる。さらに、ファイルを格納するディレクトリ、ファイルに含まれるデータで定義される、関数、変数、マクロ、クラス、型あるいはそれらの名前などをソフトウェア構成要素とすることができる。構成要素情報は、例えば、分析対象のソフトウェアのソースコードや中間ファイルから、既存の構文解析技術を用いて、生成することができる。構成要素情報取得部１０１は、例えば、生成された構成要素情報を、記録媒体から読み込みこんでもよいし、ソースファイルや中間ファイルから構成要素情報を生成してもよい。
【００１８】
依存関係情報取得部１０２は、構成要素情報取得部１０１が取得した構成要素情報で示されるソフトフェア構成要素間の依存関係を示す依存関係情報を取得し、ソフトウェア構造分析装置で使用可能な状態にする。例えば、２つのソフトウェア構成要素のうち、一方のソフトウェア構成要素により実現される処理またはデータの変化によって、他方のソフトウェア構成要素による処理またはデータが影響を受ける場合に、それら２つのソフトウェア構成要素は依存関係を有するものとすることができる。依存関係の例としては、例えば、関数の呼び出し関係、関数（またはメソッド）による変数（またはメンバ）からの値の読み取り関係、関数による変数への値の書き込み関係、ファイルのインクルード関係等が挙げられる。依存関係は、例えば、依存先および依存元を特定するデータで表される。依存関係を示すデータは、例えば、ソフトウェアのソースコード、またはソフトウェアの実行ファイル等を作成する過程で作成される中間ファイルから生成することができる。
【００１９】
配置情報取得部１０３は、論理的構成要素の位置関係を示す配置情報を取得し、ソフトウェア構造分析装置で使用可能な状態にする。論理的構成要素は、構成要素情報で示されるソフトウェア構成要素を、１つまたは複数まとめたものである。例えば、ソフトウェアの制御によりコンピュータが実現する機能を分類したブロック（例えば、モジュール）を論理的構成要素とすることができる。配置情報は、論理的構成要素間の関係を、幾何学的な位置関係により表したデータとすることができる。配置情報は、例えば、ソフトウェア開発者が設計したソフトウェア構造を示すデータから得ることができる。
【００２０】
具体的には、配置情報取得部１０３は、論理的構成要素を表すブロックを配置したソフトウェア構造図を配置情報として取得してもよい。あるいは、配置情報取得部１０３は、論理的構成要素の位置関係を表す表、または表を作成可能な形式の情報を配置情報として取得してもよい。これらの例のように、ソフトウェアのアーキテクチャを表現するデータを、論理的構成要素の配置の情報とすることができる。
【００２１】
対応関係情報取得部１０４は、配置情報が示す論理的構成要素と、構成要素情報が示すソフトウェア構成要素とを対応付けるデータである対応関係情報を取得する。上述のとおり、論理的構成要素には、１つまたは複数のソフトウェア構成要素が含まれる。論理的構成要素にどのソフトウェア構成要素が含まれるかは、例えば、装置利用者の入力に基づいて決定することもできるし、さらに、ソフトウェアの構成要素情報や、依存関係情報等に基づいて自動的に算出することもできる。例えば、構成要素情報にソフトウェア構成要素のディレクトリ構成またはファイル構成が含まれる場合、ディレクトリ構成またはファイル構成と、配置情報を用いて、ソフトウェア構成要素と論理的構成要素の対応関係を決定することができる。
【００２２】
また、少なくとも１つソフトウェア構成要素が、下位の他のソフトウェア構成要素を包含するような包含関係を有する場合、構成要素情報は、包含関係を示す情報を含んでもよい。この場合、対応関係情報取得部１０４は、装置利用者の入力または予め記録された対応関係を示すデータにより、あるソフトウェア構成要素と論理的構成要素との対応関係が決定すると、このソフトウェア構成要素に包含される他のソフトウェア構成要素も自動的に当該論理的構成要素に対応付けてもよい。これにより、構成要素情報の包含関係に基づいて、論理的構成要素に対応するソフトウェア構成要素を自動的に検索し、決定することができる。あるいは、対応関係情報取得部１０４は、ある１つの論理的構成要素に対応するソフトウェア構成要素に包含される他のソフトウェア構成要素が、当該論理的構成要素とは別の論理的構成要素に対応付けられていないか判定することもできる。これにより、ソフトウェア構成要素と、それに包含されるソフトウェア構成要素は、同じ論理的構成要素に対応するように調整することができる。
【００２３】
依存関係検査部１０５は、上記の構成要素情報、依存関係情報、配置情報および対応関係情報を用いて問題のある依存関係を特定する。例えば、前記依存関係検査部１０５は、前記依存関係情報で示されるソフトウェア構成要素の間の依存関係と、対応関係情報で示される論理的構成要素とソフトウェア構成要素の対応関係から、論理的構成要素間の依存関係を算出してもよい。算出された当該論理的構成要素間の依存関係と、配置情報で示される論理的構成要素の位置関係とに基づいて問題のある依存関係を特定することができる。
【００２４】
例えば、依存関係検査部１０５は、ソースコードを基にして得られる構成要素間の依存関係を、対応関係情報を用いて、論理的構成要素間の依存関係に対応付けることができる。論理的構成要素間の依存関係のうち、配置情報で示される論理的構成要素の位置関係と異なる依存関係を、問題ある依存関係として特定することができる。これにより、ソースコードが持つ依存関係のうち、配置情報が表す依存関係と違いのある依存関係を問題のある依存関係として特定することができる。
【００２５】
本実施形態では、一例として、各論理的構成要素の位置を、座標データを用いて表される場合について説明する。依存関係検査部１０５は、各論理的構成要素の座標データを基に、論理的構成要素間の依存関係の方向を算出し、算出した方向に基づいて依存関係の問題の有無を判定する。なお、各論理的構成要素間の依存関係は、ソフトウェア構成要素間の依存関係および、ソフトウェア構成要素と論理的構成要素との対応関係に基づいて決定することができる。なお、本実施形態では、依存関係の方向に基づいて問題の有無を判定しているが、判定方法はこれに限られない。例えば、依存関係を有する論理的構成要素間の距離、または、距離と方向に基づいて問題の有無を判定することができる。
【００２６】
結果出力部１０６は、依存関係検査部１０５が特定した問題のある依存関係の検査結果を出力する。例えば、ソフトウェア構造分析装置に接続された表示装置に、論理的構成要素の位置関係および依存関係を示した図を表示し、さらに、問題のある依存関係を視認可能な状態で表示することができる。
【００２７】
ソフトウェア構造分析装置は、ＣＰＵおよびメモリを含むコンピュータにより実現することができる。構成要素情報取得部１０１、依存関係情報取得部１０２、配置情報取得部１０３、対応関係情報取得部１０４、依存関係検査部１０５および結果出力部１０６の各部の機能は、コンピュータのＣＰＵが所定のプログラムに従って動作することにより実現することができる。また、これら各部の機能をコンピュータで実現するためのプログラムまたはそれを記録した記録媒体も本発明の一実施態様である。
【００２８】
［ソフトウェア構造分析装置の動作例］
以下に図３の処理のステップに従って、図１の各構成要素の処理を説明する。
【００２９】
［構成要素情報取得（ステップ３０１）］
まず、構成要素情報取得部１０１は、図４に示すようなソフトウェア構成要素の情報である構成要素情報を取得する（ステップ３０１）。ソフトウェア構成要素は、ソフトウェアのソースコード、ソースファイル、ソースディレクトリ、またはソフトウェアの実行ファイルを作成する過程で作成される中間ファイルから得ることができ、例えばディレクトリ、ファイル、関数、変数、マクロ、クラス、型、およびそれらの名前などである。ソフトウェア構成要素情報は、非特許文献１に記載する構文解析技術等を使って、自動的に取得することができる。
【００３０】
構成要素情報は、各ソフトウェア構成要素一つ一つの情報である構成要素情報レコード４０１によって構成される。各構成要素情報レコードは、構成要素情報取得部が各ソフトウェア構成要素に割り当てたID情報４０２、ソフトウェア構成要素の名前情報４０３、ソフトウェア構成要素の種類の情報４０４、そのソフトウェア構成要素の親となるソフトウェア構成要素の情報４０５を持つ。情報４０５が、ソフトウェア構成要素間の包含関係を示すデータの一例である。
【００３１】
本実施形態において、ソフトウェア構成要素の親とは、構成要素情報レコードに対応するソフトウェア構成要素を包含するソフトウェア構成要素を意味する。例えば、構成要素情報レコードに対応するソフトウェア構成要素がクラスに含まれない関数や外部変数の場合は、その親はファイルとなる。また、構成要素情報レコードに対応するソフトウェア構成要素がクラスのメンバ変数やメンバ関数ならば、その親はそれらのメンバを持つクラスが該当する。また、構成要素情報レコードに対応するソフトウェア構成要素がファイルまたはディレクトリで、それらを包含するディレクトリが構成要素情報に含まれる場合、そのディレクトリが親となる。構成要素情報レコードに対応するファイルまたはディレクトリを包含するディレクトリが、構成要素情報に含まれない場合は、構成要素情報レコードに対応するファイルまたはディレクトリの親は存在しないものと判断する。親となるソフトウェア構成要素が存在しない場合は、それを意味する情報として「−」を与える。
【００３２】
図４の４０５に記述されるソフトウェア構成要素の包含関係は、図５に示すような、ツリー構造で表すこともできる。図５に示す図のうち、５０１と同じ形を持つ図はディレクトリを、５０２と同じ形を持つ図はファイルを、５０３と同じ形を持つ図は関数、変数、マクロ、型などの、ソースファイルに定義される関数または変数を意味する。線５０４はソフトウェア構成要素間の包含関係を意味しており、線の左端に接続するソフトウェア構成要素が、線の右端に接続するソフトウェア構成要素を包含することを意味する。
【００３３】
前記構成要素情報および前記包含関係は、静的解析ツール等の既存のツールを使って、ソフトウェアのソースコード、ソースファイル、ソースディレクトリ、またはソフトウェアの実行ファイルを作成する過程で作成される中間ファイルから、自動的に取得することができる。
【００３４】
［依存関係情報取得（ステップ３０２）］
次に、依存関係情報取得部１０２が、図６に示すようなソフトウェア構成要素間の依存関係である依存関係情報を入力として取得する（ステップ３０２）。依存関係情報は、各依存関係ひとつひとつの情報である依存関係情報レコード６０１によって構成される。各依存関係情報レコードは、各依存関係に割り当てられたID情報６０２、依存元のソフトウェア構成要素のID情報６０３、依存先のソフトウェア構成要素のID情報６０４、依存関係の種類の情報６０５を持つ。
【００３５】
依存関係情報は、非特許文献１に記載する技術を使って、例えば、ソフトウェアのソースコード、ソースファイル、ソースディレクトリ、またはソフトウェアの実行ファイルを作成する過程で作成される中間ファイルから得られる。
【００３６】
［配置情報取得（ステップ３０３）］
次に、配置情報取得部１０３は、論理的構成要素を保持する配置情報を取得する（ステップ３０３）。配置情報は、例えば、ソフトウェアの構造を表すソフトウェア構造図として、論理的構成要素は、例えば、ソフトウェア構造図上のブロック形の図として与えられる。
【００３７】
配置情報の例としては、例えば図７に示すソフトウェア構造図がある。図７は、アプリケーションAPPL、ミドルウェアMW、二つのドライバDRV1、DRV2、ライブラリLIBの五つのブロックから構成されるソフトウェアの構造を表した図である。図７のソフトウェア構造図の各ブロックは論理的構成要素を表し、ブロック７０１がアプリケーションAPPLを、ブロック７０２がミドルウェアMWを、ブロック７０３がドライバDRV1を、ブロック７０４がドライバDRV2を、ブロック７０５がライブラリLIB表す。
【００３８】
配置情報は、その配置情報から得られるソフトウェア構造図の大きさ、ソフトウェア構造図において論理的構成要素を表す各ブロック大きさ、図面における論理的構成要素を表す図の位置関係で構成される。論理的構成要素の位置関係としては、例えば、各論理的構成要素を表す図の中心座標がある。また、論理的構成要素は、ソフトウェア構成要素の一つ、または複数をまとめたものである。
【００３９】
配置情報取得部１０３が取得する配置情報は、例えば図８（A）（B）に示す情報を持つ。図８（A）は配置情報の大きさを示し、図８（B）は、各論理的構成要素を表すブロックの大きさと、配置情報内の中心座標である。図８（A）に示す配置情報の大きさの情報は、図の高さの値８０１と横幅の値８０２からなる。図８（B）に示すブロック配置情報は、各ブロックのブロック配置情報である配置情報レコード８０３によって構成される。各配置情報レコード８０３は、各ブロックに割り当てられたID情報８０４、各ブロックの名前情報８０５、各ブロックの大きさの情報８０６、各ブロックの中心の座標情報８０７を持つ。各ブロックの大きさの情報８０６は、ブロックの高さの値８０８と横幅の値８０９を持つ。ブロックの中心の座標情報８０７は、中心のx座標の値８１０とy座標の値８１１を持つ。
【００４０】
なお、配置情報は、図７に示すようなソフトウェア構造図の電子データや、XMIなどのソフトウェア構造図を作成可能なテキストから自動的に取得される。また、装置利用者は、紙面上などに表示されたソフトウェア構造図を基に、GUI上でソフトウェア構造図にブロックを追加する配置情報を入力することもできる。
【００４１】
また、装置利用者は、配置情報取得部１０３を通して、配置情報の中に含まれていない新たな論理的構成要素を、配置情報に追加することができる。
【００４２】
［対応関係情報取得（ステップ３０４）］
次に、対応関係情報取得部１０４は、前記論理的構成要素と前記ソフトウェア構成要素との対応関係を表す対応関係情報を取得する（ステップ３０４）。対応関係情報は、例えば図９に示す構造で与えられる。図９は、図４、図８に示す事例における対応関係情報の例である。対応関係情報は、各ブロックに関する対応関係の情報である対応関係情報レコード９０１によって構成される。対応関係情報レコード９０１は、ブロックのID（８０４）の番号９０２と、そのブロックに対応する構成要素のID（４０２）のリスト９０３と、ブロックに対応する構成要素に包含される構成要素のID（４０２）のリスト９０４から構成される。
【００４３】
また、対応関係情報取得部１０４は、構成要素情報取得部１０２が取得した構成要素情報と、配置情報取得部１０３が取得した配置情報に対して、例えば図１０に示すように、マウス等のポインティングデバイスを使って、対応関係情報取得部が提示する構成要素の包含関係のツリー構造から構成要素を一つ選択して、対応関係情報取得部が提示する構造図上の対応するブロックにドラッグするなどの形で、対応関係情報を作成することができる。一般的に、ファイルやディレクトリは、複数の構成要素を意味のあるまとまりとするために使用される。そのため、ある構成要素をブロックに対応付けた場合、その構成要素に包含される構成要素も同じ構成要素に対応付けられるべきである。このことから、対応関係情報取得部は、ある構成要素がいずれかのブロックに対応付けられた場合、その構成要素に包含される構成要素は、ブロックに割り当てられた構成要素に包含される構成要素として、対応関係情報に自動的に登録される。
【００４４】
包含される構成要素が既にあるブロックに対応付けられている時に、親となる構成要素に自身と異なるブロックが対応付けられた場合、包含される構成要素は全て親の構成要素のブロックに対応付けられる。また、この方法を効率的に適用するために、対応関係情報取得部１０４は、初期状態で親となる構成要素を持たない構成要素の一覧を表示することができる。
【００４５】
ここで、対応関係情報を作成する装置利用者の操作手順の例を説明する。まず装置利用者は、いずれかのブロックに対応するソフトウェア構成要素が表示されているかどうかを確認する。もし表示されていれば、マウス等のポインティングデバイス等を使ってそのソフトウェア構成要素を選択して構造図上の対応するブロックにドラッグし、対応関係を指定する。次に、ブロックに対応するソフトウェア構成要素が表示されていない場合、装置利用者は、現在表示されているソフトウェア構成要素に、包含されているソフトウェア構成要素を表示したい構成要素があるかを判断する。次に、装置利用者は、包含されているソフトウェア構成要素を表示したい構成要素が存在する場合、そのソフトウェア構成要素を選択し、選択したソフトウェア構成要素に包含される構成要素の一覧を表示する。その後、新たに表示されたソフトウェア構成要素について、対応関係を指定していないブロックとの対応関係を検討する。対応するソフトウェア構成要素が表示されておらず、表示されているソフトウェア構成要素の中に、包含されている構成要素を表示したい構成要素が表示されていない場合は、現在表示中のソフトウェア構成要素を包含する親の構成要素と、そのソフトウェア構成要素と同じ親に包含されるソフトウェア構成要素の一覧を表示する。その後、新たに表示されたソフトウェア構成要素について、ブロックとの対応関係、または包含されているソフトウェア構成要素を表示したいソフトウェア構成要素があるかどうかを検討する。以上の操作を、全てのブロックに対応関係を指定し終えるまで繰り返す。
【００４６】
なお、ブロックとの対応関係を指定できる構成要素はディレクトリに限らず、ファイル、関数、変数などについても対応関係を指定できる。また、一つのブロックに対して、複数の構成要素を対応づけることができる。本実施形態では、一つの構成要素に対して複数のブロックを対応付けることはできないものとする。
【００４７】
以上のように、構成要素とブロックの対応関係情報を、ディレクトリ、ファイルの情報から検査、自動検査することにより、利用者は、全ての構成要素とブロックの対応関係を入力せずに、ディレクトリのトップから数階層のディレクトリを指定するだけで、全ての対応づけを設定することが可能となる。
【００４８】
なお、対応関係情報取得部１０４は、対応関係の指定において、以下のように装置利用者の補助を行うことも可能である。
【００４９】
対応関係情報取得部は、図１１に示す流れのように、装置利用者によってあるブロックに対応付けられた構成要素と包含関係がある構成要素が、異なるブロックに対応付けられていないかどうかを自動的にチェックすることができる。まず、装置利用者が対応関係を指定したブロックBと構成要素Eを特定する（ステップ１１０１）。次に、構成要素Eを包含する構成要素が存在するかどうかを確認する（ステップ１１０２）。構成要素Eを包含する構成要素が存在する場合は、その構成要素をE'とする（ステップ１１０３）。次に、構成要素E'がいずれかのブロックに対応付けられているかどうかを確認する（ステップ１１０４）。もし構成要素E'がどのブロックにも対応付けられていない場合は、いずれかのブロックに対応する構成要素に包含される構成要素に構成要素E'が含まれるかどうかを確認する（ステップ１１０５）。構成要素E'がいずれかのブロックに対応付けられているか、いずれかのブロックに対応する構成要素に包含される構成要素に含まれている場合は、そのブロックをB'とする（ステップ１１０６）。次に、ブロックBとブロックB'と比較する（ステップ１１０７）。ブロックBとブロックB'が異なった場合は、包含関係がある構成要素が異なるブロックに対応付けられていることになるので、装置利用者にエラーを通知し、処理を終了する（ステップ１１０９）。ブロックBとブロックB'が一致する場合は、ブロックB'をBに、E'をEに置き換えて、親の構成要素について、ステップ１３０１から検査を行う（ステップ１１１０）。構成要素E'がどの構成要素にも包含されていない場合は、問題なしと判断し、処理を終了する（ステップ１１０８）。この検査は、装置利用者が対応関係を指定する度に実行することができる。また、全ての対応関係を指定し終えた後、全てのブロックに対して検査を行うこともできる。また、装置利用者の任意のタイミングで検査を行うこともできる。
【００５０】
また、対応関係情報取得部は、図１２に示す流れのように、全てのブロックに対応関係情報を指定し終えたかどうかを自動的にチェックすることができる。まず装置は、未検査のブロックを選択する（ステップ１２０１）。次に、選択したブロックについて、対応する構成要素が割り当てられているかどうか検査する（ステップ１２０２）。ブロックに構成要素が対応付けられていた場合は、全てのブロックを検査済みか確認する。未検査のブロックが残っていれば、ステップ１２０１に戻り、未検査のブロックの検査を行う（ステップ１２０３）。ブロックに構成要素が対応付けられていない場合は、装置利用者にエラーを通知して、処理を終了する（ステップ１２０４）。全てのブロックについて検査が完了していれば、処理を終了する（ステップ１２０５）。
【００５１】
［依存関係と論理的構成要素を関連付け（ステップ３０５）］
次に、依存関係検査部１０５は、取得した依存関係情報と配置情報と、作成した対応関係情報から、問題のある依存関係を特定するために、依存関係情報の各依存関係と配置情報に含まれる各論理的構成要素との関連付けを行う（ステップ３０５）。本実施形態におけるソフトウェア構造分析装置が、依存関係情報と配置情報を対応付け、ブロック間依存関係情報を作成する処理の流れを図１３に示す。まず、依存関係情報の各依存関係情報レコードのうち、未処理のレコードを選択する（ステップ１３０１）。次に、選択中の依存関係情報レコードから、依存元の構成要素のIDを取得する（ステップ１３０２）。次に、取得した依存元の構成要素のIDから、依存元の構成要素に対応するブロックを特定する（ステップ１３０３）。次に、選択中の依存関係情報レコードから、依存先の構成要素のIDを取得する（ステップ１３０４）。次に、取得した依存先の構成要素のIDから、依存先の構成要素に対応するブロックを特定する（ステップ１３０５）。次に、ステップ１３０３で特定した依存元のブロックとステップ１３０５で特定した依存先のブロックが異なるブロックかどうか、判定する（ステップ１３０６）。依存元のブロックと依存先のブロックが異なるならば、ステップ１３０３で特定した依存元のブロックから、ステップ１３０５で特定した依存先のブロックに対して、ブロック間依存関係を作成する（ステップ１３０７）。以上の処理を、全ての依存関係情報レコードを処理するまで繰り返す。
【００５２】
ここで、ステップ１３０３およびステップ１３０５において、取得した構成要素のIDから対応するブロックを特定する処理の流れを図１４に示す。まず、取得した構成要素のIDに関して、取得した構成要素に対応するブロックかどうかを確認していない対応関係情報レコードを一つ選択する（ステップ１４０１）。次に、取得した構成要素のIDが、選択した対応関係情報レコードの、対応する構成要素のIDの中に含まれているかどうかを確認する（ステップ１４０２）。含まれていない場合は、取得した構成要素のIDが、選択した対応関係情報レコードの、対応する構成要素に包含される構成要素のIDの中に含まれるかどうかを確認する（ステップ１４０３）。そこにも含まれていない場合は、他の未確認の対応関係情報レコードについて同様の処理を行う。全ての対応関係情報レコードを確認しても対応するブロックが見つからない場合は、配置情報に新たなブロックを追加し（ステップ１４０５）、装置利用者に、追加したブロックへの対応関係を指定させる（ステップ１４０６）。その後、新たに指定された対応関係情報を基に、追加されたブロックが取得した構成要素に対応するブロックかどうかを確認する。ステップ１４０２またはステップ１４０３において、取得した構成要素のIDが含まれていた場合は、選択した対応関係情報レコードに対応するブロックのIDを取得し、ブロックを特定する（ステップ１４０７）。
【００５３】
図４乃至図８に示す事例に対して図１３乃至図１４に示す流れの処理を行うことで、図１５に示すブロック間依存関係情報が作成される。ブロック間依存関係情報は、各依存関係のブロックとの対応関係であるブロック間依存関係レコード１５０１から構成される。ブロック間依存関係レコード１５０１は、ブロック間依存関係レコードのIDの情報１５０２と、依存関係のIDの情報１５０３、依存関係の依存元となるブロックのIDの情報１５０４、依存関係の依存先となるブロックのIDの情報１５０５から構成される。
【００５４】
［依存関係方向情報作成］
次に、依存関係検査部１０５は、作成したブロック間依存関係情報から、ソフトウェアのアーキテクチャが想定している依存関係の方向、つまり取得した配置情報において問題のない依存関係の方向である依存関係方向情報を作成する。作成される依存関係方向情報は、「上から下」、「下から上」、「右から左」、「左から右」のいずれかになる。依存関係の方向は、例えば、配置情報で示されるブロック間の位置関係において、依存関係を有するブロック間を結ぶ線の方向によって決定される。ブロック間の依存関係も、位置関係と同様に、幾何学的に表すことができる。
【００５５】
ここで、依存関係方向情報を作成する処理の例を、図１６乃至図１８を用いて説明する。依存関係方向情報を作成する処理の流れを、図１６に示す。まず依存関係検査部１０５は、各ブロック間依存関係情報の上下方向を判定する（ステップ１６０１）。次に、各ブロック間依存関係情報の上下方向の判定結果から、下向きのブロック間依存関係情報が、ブロック間依存関係方向情報全体の2/3以上かどうかを判定する（ステップ１６０２）。もし2/3以上であれば、依存関係方向情報を「上から下」と判断し（ステップ１６０３）、処理を終了する。2/3未満であれば、上向きのブロック間依存関係情報が、ブロック間依存関係情報全体の2/3以上かどうかを判定する（ステップ１６０４）。もし2/3以上であれば、依存関係方向情報を「下から上」と判断し（ステップ１６０５）、処理を終了する。2/3未満であれば、各ブロック間依存関係情報の左右方向を判定する（ステップ１６０６）。次に、右向きのブロック間依存関係情報が、ブロック間依存関係情報全体の1/2以上かどうかを判定する（ステップ１６０７）。もし1/2以上であれば、依存関係方向情報を「左から右」と判定し（ステップ１６０８）、処理を終了する。1/2未満であれば、依存関係方向情報を「右から左」と判定し（ステップ１６０８）、処理を終了する。
【００５６】
ステップ１６０１で行う、各ブロック間依存関係情報の上下方向を判定する処理の流れを、図１７に示す。各ブロック間依存関係情報の上下方向の判定では、まず、未判定のブロック間依存関係情報レコードBRを選択する（ステップ１７０１）。次に、BRの依存元のブロックBsrcのIDであるIDsrcと、依存先のブロックBtgtのIDであるIDtgtを取得する（ステップ１７０２）。次に、IDsrcとIDtgtが異なるかどうかを判定する（ステップ１７０３）。異なる場合は、BsrcのIDと配置情報から、Bsrcの中心座標(Xsrc, Ysrc)を取得する（ステップ１７０４）。そして、BtgtのIDと配置情報から、Btgtの中心座標(Xtgt, Ytgt)を取得する（ステップ１７０５）。そして、YsrcがYtgtより大きいかどうかを判定する（ステップ１７０６）。大きい場合は、BRは下向きのブロック間依存関係情報と判断する（ステップ１７０７）。そうでない場合は、BRは上向きのブロック間依存関係情報と判断する（ステップ１７０８）。IDsrcとIDtgtが一致する場合は、BRは上下方向無しと判断する（ステップ１７０９）。その後、判断結果をBRに追加する（ステップ１７１０）。その後、全てのブロック間依存関係情報レコードを判定済みであれば、処理を終了する（ステップ１７１１）。未判定のブロック間依存関係情報レコードが残っている場合は、ステップ１７０１から処理を行う。
【００５７】
次に、ステップ１６０６で行う、各ブロック間依存関係情報の左右方向を判定する処理の流れを、図１８に示す。各ブロック間依存関係情報の上下方向の判定では、まず、未判定のブロック間依存関係情報レコードBRを選択する（ステップ１８０１）。次に、BRの依存元のブロックBsrcのIDであるIDsrcと、依存先のブロックBtgtのIDであるIDtgtを取得する（ステップ１８０２）。次に、IDsrcとIDtgtが異なるかどうかを判定する（ステップ１８０３）。異なる場合は、BsrcのIDと配置情報から、Bsrcの中心座標(Xsrc, Ysrc)を取得する（ステップ１８０４）。そして、BtgtのIDと配置情報から、Btgtの中心座標(Xtgt, Ytgt)を取得する（ステップ１８０５）。そして、XsrcがXtgtより大きいかどうかを判定する（ステップ１８０６）。大きい場合は、BRは右向きのブロック間依存関係情報と判断する（ステップ１８０７）。そうでない場合は、BRは左向きのブロック間依存関係情報と判断する（ステップ１８０８）。IDsrcとIDtgtが一致する場合は、BRは左右方向無しと判断する（ステップ１７０９）。その後、判断結果をBRに追加する（ステップ１７１０）。ステップ１６０１で既に上下方向が追加されている場合は、左右方向を上書きする。その後、全てのブロック間依存関係情報レコードを判定済みであれば、処理を終了する（ステップ１８１１）。未判定のブロック間依存関係情報レコードが残っている場合は、ステップ１８０１から処理を行う。
【００５８】
図４乃至図８に示す例について、依存関係方向情報を判定した結果のブロック間依存関係情報を、図１９に示す。依存関係方向情報の判定後、ブロック間依存関係情報レコード１９０１には、「上」「下」「−」のいずれかの値を持つ方向の情報１９０２が追加される。「上」は上向きの依存関係であることを、「下」は下向きの依存関係であることを、「−」は上下の方向情報がないことを意味する。この時、依存関係方向が「下」であるブロック間依存関係情報レコードは、全体の2/3以上であるので、この例における依存関係方向情報は「上から下」と判断される。
【００５９】
［問題ある依存関係を特定（ステップ３０６）］
次に、依存関係検査部１０５は、依存関係方向情報とブロック間依存関係情報を作成後、問題のある依存関係を特定する（ステップ３０６）。依存関係方向情報は、ソフトウェアのアーキテクチャが想定している依存関係の方向である。全ての依存関係の方向を、例えば画面に対して下向きというように、依存関係方向情報と同じ方向に揃えておけば、依存関係方向情報の依存元側の構成要素を置き換える必要が出た場合に、依存関係方向情報の依存先側の構成要素が影響を受ける可能性は低くなり、ソフトウェアの再利用性は向上する。しかし、依存関係方向情報と逆の方向の依存関係が存在する場合、逆向きに依存される構成要素を別の構成要素に置き換える場合、逆向きの依存関係の依存元の構成要素にも変更が必要となるため、ソフトウェアの再利用性は低くなる。そのため、依存関係方向情報と逆向きの依存関係は問題であると考えられる。
【００６０】
また実際のソフトウェア構造図では、上位にアプリ、中間に共通ライブラリ、ミドルウェア、仮想にハードに近いデバイスドライバなどを配置することが普通である。その場合、上位のアプリ層から、ミドル、共通ライブラリを呼び出す下向きの矢印は問題ないが、逆にミドルからアプリを呼び出す上向きの矢印では、複数のアプリで共通であるべきミドルが特定のアプリに依存するという複雑な構造になっていることになる。
【００６１】
依存関係検査部１０５は、図２０に示す流れに従って、問題のある依存関係を特定する。まず、未検査のブロック間依存関係情報レコードBRを選択する（ステップ２００１）。次に、BRの方向の情報を取得する（ステップ２００２）。次に、取得した方向の情報が、依存関係方向情報に対して逆向きかどうかを判定する（ステップ２００３）。もし逆向きであれば、BRを問題のある依存関係と判断する（ステップ２００４）。逆向きでなければ、BRは問題のない依存関係と判断する（ステップ２００５）。その後、BRに検査結果を追加する（ステップ２００６）。そして、全てのブロック間依存関係情報レコードが検査済みかどうかを確認し（ステップ２００７）、検査済みであれば処理を終了する。未検査のブロック間依存関係情報レコードが残っていれば、その未検査のブロック間依存関係情報レコードに対して、ステップ２００１から処理を行う。
【００６２】
ここで、図２１を用いて、依存関係方向情報が「上から下」である時の、図４乃至図８に示す例において問題のある依存関係の特定方法を説明する。この例において、ブロック間依存関係情報のうち、IDがBR9のブロック間依存関係は、依存元のブロックがB5、依存先のブロックがB4であるので、依存線２１０１に示すように、下のブロックから上のブロックへの依存関係である。依存関係方向情報は「上から下」であるので、このブロック間依存関係に対応する依存関係は、依存関係方向情報とは逆向きの依存関係である。そのため、ブロック間依存関係BR9に対応する依存関係は、問題のある依存関係と判断される。また、IDがBR11のブロック間依存関係は、依存元のブロックがB2、依存先のブロックがB1であるので、依存線２１０２に示すように、下のブロックから上のブロックへの依存関係である。依存関係方向情報は「上から下」であるので、このブロック間依存関係に対応する依存関係は、依存関係方向情報とは逆向きの依存関係である。そのため、ブロック間依存関係BR11に対応する依存関係は、問題のある依存関係である。
【００６３】
以上の処理の結果、依存関係検査部１０５は、図２２に示す、検査結果付きブロック間依存関係情報を出力する。検査結果付きブロック間依存関係情報レコード２２０１は、図１９に示すブロック間依存関係情報レコードが持つ情報に加え、検査結果２２０２を持つ。検査結果２２０２はOKまたはNGの値を持ち、OKであれば問題のない依存関係であることを意味し、NGであれば問題のある依存関係であることを意味する。本実施例では、IDがBR9のブロック間依存関係レコードの検査結果２２０３とIDがBR11のブロック間依存関係レコードの検査結果２２０４の値がNGとなる。そのため本実施例では、ブロック間依存関係レコードBR9に対応する依存関係R9と、ブロック間依存関係レコードBR11に対応する依存関係R11が、問題のある依存関係と判断される。
【００６４】
［問題ある依存関係を出力（ステップ３０７）］
最後に、検査結果出力部１０６は、検査結果付きブロック間依存関係情報を取得し、装置利用者に対して問題のある依存関係を出力する（ステップ３０７）。例えば図４乃至図８に示す例では、依存関係R9、依存関係R11が問題であると判断された。この結果を図２３のようにソフトウェア構造図として出力する場合、問題のない依存関係は、依存元のブロックから依存先のブロックへの矢印線として表される。一方、問題のある依存関係は、依存元のブロックから依存先のブロックへの、強調された矢印線として表される。本実施例では、R9の依存関係に対応する依存線２３０１および依存関係R11に対応する依存線２３０２が、強調して表示される。
【００６５】
以上の結果により、本発明に係るソフトウェア構造分析装置は、ソフトウェアの再利用性を低下させる依存関係方向情報と逆向きの依存関係を、問題のある依存関係として特定し、装置利用者に提示する。
【００６６】
なお問題のある依存関係を出力する方法は、矢印の強調だけでなく、依存関係のリスト表示などもできる。さらにユーザに提示するだけでなく、別の処理への前処理として問題のある依存関係のリストを他の処理プログラムの入力として出力することもできる。
【００６７】
以上のとおり、本実施形態においては、論理的構成要素間の関係を幾何学的な位置関係で表したデータを、前記配置情報として用いるため、ソフトウェア開発において生成されたソフトウェア構成要素の依存関係と対応関係情報を基に、論理的構成要素の幾何学的な位置関係を計算することができる。その結果、問題のある依存関係を特定することができる。また、論理的構成要素の幾何学的な位置関係により特定された問題のある依存箇所を示す情報を、装置利用者に提供することができる。
【００６８】
また、依存関係検査部１０５は、論理的構成要素間の依存関係の方向を計算し、この方向を用いて問題の有無を判定するため、ソフトウェア構成要素間の機能的な繋がりを装置利用者に理解しやすい情報を用いて解析することができる。さらに、論理的構成要素間での問題のない依存方向を計算して、これと各依存関係を比較することで、問題の有無を判定することにより、効率よく処理を実行することが可能になる。
【００６９】
なお、依存関係の問題の有無を判定するための情報は、上記例のように、依存関係の方向に限られない。例えば、後述する実施形態のように、依存関係の距離を用いて判定することもできる。また、上記例では、論理的構成要素間の幾何学的な位置関係を２次元平面で表しているが、３次元空間において、上記論理的構成要素間の幾何学的な位置関係および依存関係の方向または距離が表されてもよい。
【００７０】
（実施の形態２）
次に、本発明の第二の実施の形態について説明する。本実施例では、距離の情報を用いて、逆向きの依存関係のうち、配置上の問題により逆向きになっている依存関係を除外し、問題のある依存関係である可能性がより高い依存関係を特定する。
【００７１】
本実施例において、依存関係検査部１０５は、取得した配置情報とブロック間依存関係情報から、範囲許容値S0を作成する。図２４は、範囲許容値S0を説明するための模式図である。範囲許容値S0は、依存元のブロックの中心と依存先のブロックの中心の、依存関係方向情報とは逆の方向の距離をSとした時、逆向きの依存関係が許されるSの最大値である。範囲許容値S0をどの方向で求めるかは、依存関係方向情報によって決まる。例えば、図２４に示す例のように、依存関係方向情報が「上から下」ならば、Sは、依存先のブロック２４０１の中心のy座標の値から依存元のブロック２４０２の中心のy座標の値を引いた値の絶対値になる。
【００７２】
装置利用者から範囲許容値S0が入力されない場合、依存関係検査部１０５は、範囲許容値S0の初期値を自動的に計算することができる。範囲許容値S0の目的がブロックの重なり等の配置上の問題により発生する逆向きの依存関係を許可することであることから、範囲許容値S0の初期値としては、例えば、配置情報において論理的構成要素を表すブロックの高さの平均値が考えられる。
【００７３】
以上のように、範囲許容値を用いることで、他のブロックと重なってしまうため配置できない等のやむを得ない理由により依存関係の方向が逆向きになってしまう依存関係の存在を許可し、配置上の問題に関係なく発生している依存関係方向情報と逆向きの依存関係のみを、問題のある依存関係として特定できるようになる。
【００７４】
依存関係検査部１０５は、図２５に示す処理の流れに従って、ソフトウェアの再利用性を低下させる、依存関係方向情報と逆向きの依存関係を特定する。まず依存関係検査部１０５は、ブロック間依存関係情報から、未検査のブロック間依存関係レコードBRを選択する（ステップ２５０１）。次に、BRの方向の情報を取得する（ステップ２５０２）。次に、取得した方向の情報が、依存関係方向情報に対して逆向きかどうかを判定する（ステップ２５０３）。依存関係が逆向きの場合、依存元のブロックと依存先のブロックの中心の、依存関係方向情報とは逆の方向の距離Sを求め（ステップ２５０４）、Sと範囲許容値S0を比較する（ステップ２５０５）。S>S0ならば、依存関係は逆向きであり、範囲許容値S0を超えているため、BRを問題のある依存関係と判断する（ステップ２５０６）。依存関係が逆向きでない場合、または、SがS0より小さい場合、依存関係検査部１０５は、BRを問題のない依存関係と判断する（ステップ２５０７）。次に依存関係検査部１０５は、BRのブロック間依存関係レコードに、検査結果を追記する（ステップ２５０８）。BRに検査結果を追加後、全てのブロック間依存関係情報レコードが検査済みかどうかを判定する（ステップ２５０９）。全てのブロック間依存関係レコードが検査済みであれば、この処理を終了する。未検査のブロック間依存関係レコードが残っていれば、未検査のブロック間依存関係レコードについて、ステップ２５０１から処理を行う。
【００７５】
ここで、図２１を用いて、依存関係方向情報が「上から下」、範囲許容値S0が6.0である時の、図４乃至図８に示す例において問題のある依存関係の特定方法を説明する。この例において、ブロック間依存関係情報のうち、IDがBR9のブロック間依存関係は、依存元のブロックがB5、依存先のブロックがB4であるので、依存線２１０１に示すように、下のブロックから上のブロックへの依存関係である。依存関係方向情報は「上から下」であるので、このブロック間依存関係に対応する依存関係は、依存関係方向情報とは逆向きの依存関係である。このブロック間依存関係における、依存元のブロックの中心と依存先のブロックの中心の依存関係方向情報と同じ方向の距離Sは、
S=18.0−5.0=13.0 > S0
で、S0より大きい。そのため、ブロック間依存関係BR9に対応する依存関係は、問題のある依存関係である。また、IDがBR11のブロック間依存関係は、依存元のブロックがB2、依存先のブロックがB1であるので、依存線２１０２に示すように、下のブロックから上のブロックへの依存関係である。依存関係方向情報は「上から下」であるので、このブロック間依存関係に対応する依存関係は、依存関係方向情報とは逆向きの依存関係である。このブロック間依存関係における、依存元のブロックの中心と依存先のブロックの中心の依存関係方向情報と同じ方向の距離Sは、
S=49.0−33.0=16.0 > S0
で、S0より大きい。そのため、ブロック間依存関係BR11に対応する依存関係は、問題のある依存関係である。以上の処理の結果、依存関係検査部１０５は、実施の形態１と同じ、図２２に示す検査結果付きブロック間依存関係情報を出力し、検査結果出力部１０６は、実施の形態１と同じく、図２３に示すソフトウェア構造図などの形で、検査結果を出力する。
【００７６】
以上の結果により、本発明に係るソフトウェア構造分析装置は、ソフトウェアの再利用性を低下させる依存関係方向情報と逆向きの依存関係のうち、配置上の問題により逆向きになってしまう依存関係を除いた、問題のある可能性が高い依存関係を特定し、装置利用者に提示する。
【００７７】
なお問題のある依存関係を出力する方法は、矢印の強調だけでなく、依存関係のリスト表示するなどもできる。さらにユーザに提示するだけでなく、別の処理への前処理として問題のある依存関係のリストを他の処理プログラムの入力として出力することもできる。
【００７８】
（実施の形態３）
次に、本発明の第三の実施の形態について説明する。本実施例では、依存関係がないと予想される構成要素の間に存在する依存関係を問題のある依存関係として特定する。
【００７９】
ソフトウェアの開発者がソフトウェア構造図を用いてソフトウェアの設計をする場合、関連する論理的構成要素同士を近くに配置して、ソフトウェア構造図上に意味的なまとまりを作成する。これにより、ソフトウェア構造図上では、関連のある論理的構成要素同士は近くに配置され、関連のない論理的構成要素は離れて配置される。そのため、ソフトウェア構造図上で離れて配置された論理的構成要素間に依存関係が存在する場合、その依存関係は、開発者が意図していない依存関係である可能性がある。本発明に係るソフトウェア構造分析装置は、そのような依存関係を問題のある依存関係として特定する。
【００８０】
依存関係検査部１０５は、取得した配置情報とブロック間依存関係情報から、距離許容値L0を作成する。図２６は、距離許容値L0を説明するための模式図である。距離許容値L0は、依存関係が許される、前記配置情報における前記論理的構成要素の間の距離の上限を意味する。装置利用者から距離許容値L0が入力されない場合、配置情報取得部は、距離許容値L0の初期値を自動的に計算する。距離許容値L0は、離れて配置されており依存関係がないと予測される論理的構成要素間の依存関係を特定するためのものである。そのため、例えば配置情報として入力されたソフトウェア構造図の横幅を3等分した時、右端の区画に属するブロックと左端の区画に属するブロックの間には、本来依存関係はないと予測できる。このことから、距離許容値L0の初期値としては、例えば、配置情報取得部に最初に与えられたソフトウェア構造図の横幅の2/3の長さをＬ０とする。
【００８１】
以上のように、距離許容値を用いることで、第一の実施の形態や第二の実施の形態で述べた、単に方向だけで判断する場合と比べて、構成要素の大きさの違いや、図を描くときの手作業などのよるずれに影響されずに本質的な構造に起因する問題のある依存関係を抽出することが可能となる。
【００８２】
図４乃至図８に示す例において、図９に示す対応関係情報および図１９に示すブロック間依存関係情報が得られた場合に、離れて配置された論理的構成要素間の依存関係を特定する処理の流れを、図２７を用いて説明する。まず依存関係検査部１０５は、ブロック間依存関係情報から、未検査のブロック間依存関係レコードBRを選択する（ステップ２７０１）。次に依存関係検査部１０５は、BRの依存元のブロックBsrcのIDを取得する（ステップ２７０２）。次に依存関係検査部１０５は、取得したBsrcのIDと配置情報から、Bsrcの中心座標(Xsrc,Ysrc)を取得する（ステップ２７０３）。次に依存関係検査部１０５は、BRの依存先のブロックBtgtのIDを取得する（ステップ２７０４）。次に依存関係検査部１０５は、Btgtの中心座標(Xtgt,Ytgt)を取得する(ステップ２７０５)。次に依存関係検査部１０５は、Bsrcの中心とBtgtの中心の距離Lを計算する（ステップ２７０６）。Lは、以下の式（１）で計算することができる。
【００８３】
【数１】
2011170697.tif 000003
【００８４】
次に依存関係検査部１０５は、Lと距離許容値L0を比較する（ステップ２７０７）。L>L0の場合は、BRを問題のある依存関係と判断する（ステップ２７０８）。LがL0以下の場合は、BRは問題のない依存関係と判断する（ステップ２７０９）。次に依存関係検査部１０５は、BRのブロック間依存関係レコードに、検査結果を追記する（ステップ２７１０）。BRに検査結果を追加後、全てのブロック間依存関係情報レコードが検査済みかどうかを判定する（ステップ２７１１）。全てのブロック間依存関係レコードが検査済みであれば、この処理を修了する。未検査のブロック間依存関係レコードが残っていれば、未検査のブロック間依存関係レコードについて、ステップ２７０１から処理を行う。
【００８５】
ここで、図２８を用いて、距離許容値L0が26.7である時の、図４乃至図８に示す例において問題のある依存関係の特定方法を説明する。この例において、ブロック間依存関係情報のうち、IDがBR4のブロック間依存関係は、依存元のブロックがB2、依存先のブロックがB5である。線分２８０１に示す、これらのブロックの中心間の距離L1は、
【００８６】
【数２】
2011170697.tif 000004
【００８７】
となり、距離許容値L0より大きい。そのため、BR4に対応する依存関係は問題があると判断される。また、IDがBR12のブロック間依存関係は、依存元のブロックがB1、依存先のブロックがB3である。線分２８０２に示す、これらのブロックの中心間の距離L2は、
【００８８】
【数３】
2011170697.tif 000005
【００８９】
となり、距離許容値L0より大きい。そのため、BR12に対応する依存関係は問題があると判断される。以上の処理の結果、依存関係検査部１０５は、図２９に示す、検査結果付きブロック間依存関係情報を出力する。本実施例では、IDがBR4のブロック間依存関係レコードの検査結果２９０１とIDがBR12のブロック間依存関係レコードの検査結果２９０２の値がNGとなる。そのため本実施例では、ブロック間依存関係レコードBR4に対応する依存関係R4と、ブロック間依存関係レコードBR12に対応する依存関係R12が、問題のある依存関係と判断される。
【００９０】
最後に、検査結果出力部１０６は、検査結果付きブロック間依存関係情報を取得し、装置利用者に対して問題のある依存関係を出力する。本実施例では、IDがR4、R12の依存関係が問題であると判断された。この結果をソフトウェア構造図として出力する場合、図３０のように、R4の依存関係に対応する依存線３００１および依存関係R12に対応する依存線３００２が、強調して表示される。
【００９１】
以上の結果により、本発明に係るソフトウェア構造分析装置は、ソフトウェアの開発者が意図していない可能性のある離れた論理的構成要素間の依存関係を、問題のある依存関係として特定し、装置利用者に提示する。
【００９２】
（実施の形態４）
本発明の第四の実施の形態について説明する。本発明に係るソフトウェア構造分析装置は、第二の実施の形態で述べた依存関係の特定方法と第三の実施の形態で述べた依存関係の特定方法を組み合わせて、再利用性を低下させる依存関係方向情報に対して逆向きの依存関係と、本来ならば依存関係がないと予想される、離れた論理的構成要素間の依存関係の両方を問題のある依存関係として特定することができる。
【００９３】
再利用性を低下させる依存関係方向情報に対して逆向きの依存関係と、開発者が意図していない可能性がある離れた論理的構成要素間の依存関係の両方を問題のある依存関係として特定する処理の流れを、図３１を用いて説明する。
【００９４】
まず、依存関係検査部１０５は、ブロック間依存関係情報から、未検査のブロック間依存関係レコードBRを選択する（ステップ３１０１）。次に、BRのブロック間依存関係情報レコードから、方向の情報を取得する（ステップ３１０２）。次に、取得した方向の情報と依存関係方向情報を比較し、ブロック間依存関係の方向の情報が依存関係方向情報と逆向きかどうかを判定する（ステップ３１０３）。逆向きの場合は、依存関係方向情報と同じ方向のブロック間の距離Sを求める（ステップ３１０４）。その後、Sが範囲許容値S0より大きいかどうかを判定する（ステップ３１０５）。大きい場合は、BRを問題のある依存関係と判断する（ステップ３１０６）。依存関係の方向が逆向きでない場合、または、SがS0以下の場合は、中心間の距離Lを使って、BRが問題のある依存関係でないかどうかを判断する。そのためにまず、BRの依存元のブロックBsrcのIDを取得する（ステップ３１０７）。次に、取得したBsrcのIDおよび配置情報から、Bsrcの中心座標(Xsrc, Ysrc)を取得する（ステップ３１０８）。次に、BRの依存先のブロックBtgtのIDを取得する（ステップ３１０９）。次に、取得したBtgtのIDおよび配置情報から、Btgtの中心座標(Xtgt, Ytgt)を取得する（ステップ３１１０）。次に、(Xsrc, Ysrc)と(Xtgt, Ytgt)の値から、依存元のブロックと依存先のブロックの中心間の距離Lを計算する（ステップ３１１１）。Lは、以下の式（１）で計算することができる。
【００９５】
【数１】
2011170697.tif 000006
【００９６】
その後、Lが距離許容値L0より大きいかどうかを判定する（ステップ３１１２）。LがL0よりも大きい場合は、BRを問題のある依存関係と判断する（ステップ３１０６）。LがL0以下の場合は、BRを問題のない依存関係と判断する（ステップ３１１３）。BRが問題のある依存関係かどうかの検査後、検査結果をブロック間依存関係情報に追加する（ステップ３１１４）。その後、全てのブロック間依存関係情報レコードが検査済みかどうかを確認する（ステップ３１１５）。確認は、全てのブロック間依存関係情報レコードに、問題のある依存関係かどうかの検査結果が追加されているかどうかで判断することができる。全てのブロック間依存関係情報レコードが検査済みであれば、処理を終了する。未検査のブロック間依存関係情報レコードが残っている場合は、ステップ３１０１に戻って処理を行う。
【００９７】
以上の処理の結果、依存関係検査部１０５は、図３２に示す、検査結果付きブロック間依存関係情報を出力する。本実施例では、IDがBR4のブロック間依存関係レコードの検査結果３２０１と、IDがBR9のブロック間依存関係レコードの検査結果３２０２と、IDがBR11のブロック間依存関係レコードの検査結果３２０３と、IDがBR12のブロック間依存関係レコードの検査結果３２０４の値がNGとなる。そのため本実施例では、ブロック間依存関係レコードBR4に対応する依存関係R4と、ブロック間依存関係レコードBR9に対応する依存関係R9と、ブロック間依存関係レコードBR11に対応する依存関係R11と、ブロック間依存関係レコードBR12に対応する依存関係R12が、問題のある依存関係と判断される。
【００９８】
最後に、検査結果出力部１０６は、検査結果付きブロック間依存関係情報を取得し、装置利用者に対して問題のある依存関係を出力する。図３２に示す例では、IDがR4、R9、R11、R12の依存関係が問題であると判断されている。この結果を図３３のようにソフトウェア構造図として出力する場合、R4の依存関係に対応する依存線３３０１、R9の依存関係に対応する依存線３３０２、依存関係R11に対応する依存線３３０３、および依存関係R12に対応する依存線３３０４が、強調して表示される。
【００９９】
以上の結果により、本発明に係るソフトウェア構造分析装置は、ソフトウェアの再利用性を低下させる依存関係方向情報と逆向きの依存関係と、ソフトウェアの開発者が意図していない可能性のある離れた論理的構成要素間の依存関係を、問題のある依存関係として特定し、装置利用者に提示する。
【０１００】
（実施の形態５）
次に、本発明の第五の実施の形態について説明する。本実施例では、第四の実施の形態で特定した問題のある依存関係の、出力結果の配置情報を画面上で変更することで、問題のある依存関係の検査を再度実施する。第四の実施の形態で配置情報取得部１０３が取得した配置情報がソフトウェアの設計段階で作成された配置情報である時、開発を進める中で変更が生じ、設計時の配置情報と開発者が考える実装の配置情報の間に違いが生まれる場合がある。そのような場合に、与えられた配置情報を、開発者が考える配置情報に変更することで、開発者が考える配置情報において問題のある依存関係を特定できるようになる。
【０１０１】
図３３に示す出力結果において、配置情報を変更する装置利用者の操作の例を、図３４に示す。例えば開発者が、ブロックLIBは、ブロックDRV1およびブロックDRV2よりも上位の、ブロックMWと同じ位置に位置すると考えた場合、出力結果において、ブロックLIBを、３４０１の位置から３４０２の位置に移動させる（図３４参照）。出力結果上のブロックの移動は、例えばマウス等のポインティングデバイスを使って、出力結果上のブロックをドラッグアンドドロップすることで行われる。出力結果上のブロックの移動による配置情報の変更は、配置情報取得部１０３が取得する。
【０１０２】
出力結果上のブロックの移動による配置情報の変更を配置情報取得部１０３が取得した後、配置情報取得部は、最初に与えられた配置情報を変更する。図３４に示すブロックの移動によって変更された配置情報の例を、図３５に示す。ソフトウェア構造図の大きさには変化は発生していないため、図３５（A）に示すソフトウェア構造図の値には変化は生じない。一方、論理的構成要素を表すブロックの大きさと配置情報内の中心座標については、図３４に示すブロックの移動によって、図３５（B）に示すように、移動されたブロックに対応する配置情報レコード３５０１のブロックの中心部の座標が変更される。また、配置情報の変更が生じた場合、配置情報取得部１０３は、図３５（B）に示すように、各配置情報レコードに更新の有無を意味する変更フラグ３５０２を付与することもできる。変更フラグは0または1の値を取り、0であれば変更が発生していないことを、1であれば変更が発生したことを意味する。図３４に示すブロックの移動では、移動されたブロックに対応する配置情報レコード３５０１の変更フラグの値３５０３を1とし、他の変更フラグの値を0とする。
【０１０３】
配置情報の変更後、依存関係検査部１０５は、変更フラグが1である配置情報レコードに対応するブロックについて、そのブロックを依存元または依存先とするブロック間依存関係に対応する依存関係が問題のある依存関係かどうかを検査する。その処理の流れを、図３６に示す。依存関係検査部１０５は、まず配置情報が変更されたブロックを依存元または依存先とするブロック間依存関係を格納するための空の集合Sbrを用意する（ステップ３６０１）。次に、図３５（B）に示す形式を持つ配置情報において、変更フラグの値が1である配置情報レコードのうち、未処理の配置情報レコードを選択する（ステップ３６０２）。次に、選択した配置情報レコードに対応するブロックを依存元とするブロック間依存関係を、集合Sbrに要素として追加する（ステップ３６０３）。次に、選択した配置情報レコードに対応するブロックを依存先とするブロック間依存関係を、集合Sbrに要素として追加する（ステップ３６０４）。次に、変更フラグの値が1の配置情報レコード全てについて、その配置情報レコードに対応するブロックを依存元または依存先とするブロック間依存関係レコードを集合Sbrに格納したかどうかを確認する（ステップ３６０５）。変更フラグの値が1で、対応するブロックを依存元または依存先とするブロック間依存関係全てを集合Sbrに格納していない配置情報レコードが存在する場合は、その配置情報レコードについて、ステップ３６０２から処理を行う。変更フラグの値が1の配置情報レコード全てについて、その配置情報レコードに対応するブロックを依存元または依存先とするブロック間依存関係レコードを集合Sbrに格納済みであるならば、集合Sbrに格納されているブロック間依存関係に対応する依存関係が問題のある依存関係かどうかを検査する（ステップ３６０６）。ステップ３６０６の処理は、図３１に示す処理の流れに従って行われる。
【０１０４】
図３５に示す例の場合、図３６に示す処理において、移動されたブロックB5を依存元または依存先とするブロック間依存関係であるBR4、BR8、BR9が集合Sbrに格納され、問題のある依存関係かどうかが検査される。なお、範囲許容値S0は6.0、距離許容値L0は26.7であるとする。この時、BR4は、依存元のブロックがB2、依存先のブロックがB5のブロック間依存関係である。依存関係方向情報は「上から下」で、移動後の配置情報においてブロックの中心部のy座標の値が同じであることから、BR4は依存関係方向情報と逆の依存関係ではない。また、中心間の距離Lは、
【０１０５】
【数４】
2011170697.tif 000007
【０１０６】
となることから、ブロックの中心間の距離は距離許容値L0より小さいので、ブロック間依存関係BR4に対応する依存関係は問題のない依存関係と判断される。また、BR8は、依存元のブロックがB3、依存先のブロックがB5のブロック間依存関係である。依存関係方向情報が「上から下」であるので、ブロックB3の中心部のy座標Yb3の値とブロックB5の中心部のy座標Yb5の値を比べると、
Yb3=18.0, Yb=33.0
であり、Yb3<Yb5であるので、ブロック間依存関係BR8は依存関係方向情報とは逆向きの、下から上への依存関係である。また、依存元のブロックの中心と依存先のブロックの中心の依存関係方向情報と逆の方向の距離Sは、
S=33.0−18.0=15.0 > S0
となり、S0より大きい。そのため、ブロック間依存関係BR8に対応する依存関係は問題のある依存関係と判定される。また、BR9は、依存元のブロックがB5、依存先のブロックがB4のブロック間依存関係である。依存関係方向情報が「上から下」であるので、ブロックB5の中心部のy座標Yb5の値とブロックB4の中心部のy座標Yb4の値を比べると、
Yb5=33.0, Yb4=18.0
であり、Yb5>Yb4であるので、ブロック間依存関係BR9は依存関係方向情報と同じ方向の依存関係である。また、ブロックB5とブロックB4の中心間の距離Lは、
【０１０７】
【数５】
2011170697.tif 000008
【０１０８】
となり、距離許容値L0より小さい。このことから、ブロック間依存関係BR9に対応する依存関係は、問題のない依存関係である。
【０１０９】
依存関係検査部１０５が出力するこの検査の結果を、図３７に示す。この検査の結果、ブロック間依存関係BR4の結果３７０１はNGからOKに、ブロック間依存関係BR8の結果３７０２はOKからNGに、ブロック間依存関係BR9の結果３７０３はNGからOKに更新される。
【０１１０】
この結果を用いて結果出力部１０６が出力するソフトウェア構造図を図３８に示す。図３３に示す、配置情報変更前のソフトウェア構造図と比べて、図３８では、依存関係R4に対応する依存線３８０１が通常の依存線に、依存関係R8に対応する依存線３８０２は強調された依存線に、依存関係R9に対応する依存線３８０３は通常の依存線に表示が変更される。
【０１１１】
以上の結果により、本実施形態に係るソフトウェア構造分析装置は、設計時に開発者が考えたソフトウェア構造が開発中に変更された場合でも、装置利用者がソフトウェア構造の変更結果を装置に与えることで、変更後のソフトウェア構造から、アーキテクチャにおいて問題のある依存関係を特定し、装置利用者に提示することができる。これにより、装置利用者は、例えば、与えられた配置情報から、アーキテクチャにおいて問題があると判断された依存関係が、実際には問題がない場合には、その依存関係は問題がないと判定されるよう与えられた配置情報を変更することで、現在の実装におけるアーキテクチャを明らかにすることができる。
【０１１２】
またユーザが変更した配置情報は、現行のソースコードが持っている、隠れたソフトウェア構造を表しており、本ソフトウェア構造分析装置を使うことにより、対話的に変更されたソフトウェア構造をソースコードと対比しながら作り上げることができる。
【産業上の利用可能性】
【０１１３】
本発明のソフトウェア構造分析装置は、差分開発が繰り返されるなどの原因によってソフトウェア構造が複雑化したソフトウェアを分析し、問題のある依存関係を特定する場合に有用である。
【符号の説明】
【０１１４】
１０１  構成要素情報取得部
１０２  依存関係情報取得部
１０３  配置情報取得部
１０４  対応関係情報取得部
１０５  依存関係検査部
１０６  結果出力部
２０１  ファイルを表す図形
２０２  依存関係を表す矢印
４０１  構成要素情報レコード
４０２  構成要素のIDの情報
４０３  構成要素の名前の情報
４０４  構成要素の種類の情報
４０５  構成要素の親の情報
５０１  ディレクトリを意味する図形
５０２  ファイルを意味する図形
５０３  関数、変数を意味する図形
５０４  包含関係を意味する関係線
６０１  依存関係情報レコード
６０２  依存関係のIDの情報
６０３  依存関係の依存元の構成要素のIDの情報
６０４  依存関係の依存先の構成要素のIDの情報
６０５  依存関係の種類の情報
７０１  論理的構成要素APPLを表すブロック
７０２  論理的構成要素MWを表すブロック
７０３  論理的構成要素DRV1を表すブロック
７０４  論理的構成要素DRV2を表すブロック
７０５  論理的構成要素LIBを表すブロック
８０１  配置情報として与えられるソフトウェア構造図の高さの情報
８０２  配置情報として与えられるソフトウェア構造図の横幅の情報
８０３  配置情報レコード
８０４  配置情報として与えられるブロックのIDの情報
８０５  配置情報として与えられるブロックのブロック名の情報
８０６  配置情報として与えられるブロックの大きさの情報
８０７  配置情報として与えられるブロックの中心部の座標の情報
８０８  配置情報として与えられるブロックの高さの情報
８０９  配置情報として与えられるブロックの横幅の情報
８１０  配置情報として与えられるブロックの中心部のx座標の情報
８１１  配置情報として与えられるブロックの中心部のy座標の情報
９０１  対応関係情報レコード
９０２  対応関係情報のブロックのIDの情報
９０３  ブロックに対応する構成要素のIDの情報
９０４  ブロックに対応する構成要素に包含される構成要素のIDの情報
１５０１  ブロック間依存関係情報レコード
１５０２  ブロック間依存関係のIDの情報
１５０３  ブロック間依存関係に対応する依存関係のIDの情報
１５０４  ブロック間依存関係の依存元のブロックのIDの情報
１５０５  ブロック間依存関係の依存先のブロックのIDの情報
１９０１  方向情報が追加されたブロック間依存関係情報レコードの一例
１９０２  追加された、依存関係の方向の情報
２１０１、２１０２  依存関係方向情報と逆向きの依存関係
２２０１  検査結果付きブロック間依存関係情報レコード
２２０２  依存関係の検査結果
２２０３、２２０４  依存関係方向情報に対して逆向きの依存関係と判定された依存関係の検査結果
２３０１、２３０２  結果出力部に出力された、依存関係方向情報に対して逆向きの依存関係を意味する依存線
２４０１、２４０２  ブロックの中心
２４０３  範囲許容値S0の大きさの例
２４０４  ブロックの中心間の、依存関係方向情報と逆の方向の距離
２８０１、２８０２  離れた論理的構成要素間の依存関係
２９０１、２９０１  離れた論理的構成要素間の依存関係と判定された依存関係の検査結果
３００１、３００２  結果出力部に出力された、離れた論理的構成要素間の依存関係を意味する依存線
３２０１、３２０４  離れた論理的構成要素間の依存関係と判定された依存関係の検査結果
３２０２、３２０３  依存関係方向情報に対して逆向きの依存関係と判定された依存関係の検査結果
３３０２、３３０３  結果出力部に出力された、依存関係方向情報に対して逆向きの依存関係を意味する依存線
３３０１、３３０４  結果出力部に出力された、離れた論理的構成要素間の依存関係を意味する依存線
３４０１  ブロックLIBの移動前の位置
３４０２  ブロックLIBの移動後の位置
３５０１  配置情報が変更された配置情報レコード
３５０２  配置情報の変更フラグの情報
３５０３  配置情報が変更されたことを意味するフラグの値
３７０１、３７０２、３７０３  配置情報の変更によって更新された、依存関係の検査結果
３８０１、３８０２、３８０３  依存関係検査部の検査結果が更新された依存関係に対応する依存線
【図１】
2011170697.tif 000009
【図２】
2011170697.tif 000010
【図３】
2011170697.tif 000011
【図４】
2011170697.tif 000012
【図５】
2011170697.tif 000013
【図６】
2011170697.tif 000014
【図７】
2011170697.tif 000015
【図８】
2011170697.tif 000016
【図９】
2011170697.tif 000017
【図１０】
2011170697.tif 000018
【図１１】
2011170697.tif 000019
【図１２】
2011170697.tif 000020
【図１３】
2011170697.tif 000021
【図１４】
2011170697.tif 000022
【図１５】
2011170697.tif 000023
【図１６】
2011170697.tif 000024
【図１７】
2011170697.tif 000025
【図１８】
2011170697.tif 000026
【図１９】
2011170697.tif 000027
【図２０】
2011170697.tif 000028
【図２１】
2011170697.tif 000029
【図２２】
2011170697.tif 000030
【図２３】
2011170697.tif 000031
【図２４】
2011170697.tif 000032
【図２５】
2011170697.tif 000033
【図２６】
2011170697.tif 000034
【図２７】
2011170697.tif 000035
【図２８】
2011170697.tif 000036
【図２９】
2011170697.tif 000037
【図３０】
2011170697.tif 000038
【図３１】
2011170697.tif 000039
【図３２】
2011170697.tif 000040
【図３３】
2011170697.tif 000041
【図３４】
2011170697.tif 000042
【図３５】
2011170697.tif 000043
【図３６】
2011170697.tif 000044
【図３７】
2011170697.tif 000045
【図３８】
2011170697.tif 000046