(57)【要約】【課題】ソフトウェア構造の複雑化の要因となる改変箇所を特定し易くすること。【解決手段】構造変化検出装置１０１は、ソフトウェアの構成要素群の構成要素間の依存関係の集合から、ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出する。構造変化検出装置１０１は、構成要素間の依存関係の集合のうち、抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出する。構造変化検出装置１０１は、算出した第１の指標値と、構成要素間の依存関係の集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値Ｔ以上の場合に、抽出した依存関係を特定する情報を出力する。【選択図】図１
2016051224.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
処理を実行することを特徴とするソフトウェアの構造変化検出方法。
【請求項２】
前記コンピュータが、
前記ソフトウェアの改変により追加された依存関係のうち抽出されていない依存関係がなくなるまで、前記集合から前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、抽出した依存関係ごとに、前記算出する処理および前記出力する処理を実行することを特徴とする請求項１に記載のソフトウェアの構造変化検出方法。
【請求項３】
前記コンピュータが、
前記抽出した依存関係のうち、前記第２の指標値との差分が前記閾値以上となる依存関係が複数存在する場合は、前記第２の指標値との差分が最大となる依存関係を特定する情報を出力する、処理を実行することを特徴とする請求項２に記載のソフトウェアの構造変化検出方法。
【請求項４】
ソフトウェア構造の複雑度合いを示す指標値は、前記ソフトウェアの構成要素をノードとし、構成要素間の依存関係を有向辺とする有向グラフ構造のノード間をつなぐ最短パスの総数であることを特徴とする請求項１〜３のいずれか一つに記載のソフトウェアの構造変化検出方法。
【請求項５】
ソフトウェア構造の複雑度合いを示す指標値は、前記ソフトウェアの構成要素をノードとし、構成要素間の依存関係を有向辺とする有向グラフ構造のノード間をつなぐ最短パスの平均距離であることを特徴とする請求項１〜４のいずれか一つに記載のソフトウェアの構造変化検出方法。
【請求項６】
ソフトウェア構造の複雑度合いを示す指標値は、前記ソフトウェアの構成要素をノードとし、構成要素間の依存関係を辺とするグラフ構造の各ノードの媒介中心性から得られる媒介性集中度であることを特徴とする請求項１〜５のいずれか一つに記載のソフトウェアの構造変化検出方法。
【請求項７】
前記コンピュータが、
前記第２の指標値と、前記ソフトウェアを改変する前の構成要素間の依存関係の集合に基づくソフトウェア構造の複雑度合いを示す第３の指標値との差分が閾値以上の場合に、前記抽出する処理を実行することを特徴とする請求項１〜６のいずれか一つに記載のソフトウェアの構造変化検出方法。
【請求項８】
コンピュータに、
ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
処理を実行させることを特徴とするソフトウェアの構造変化検出プログラム。
【請求項９】
ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
制御部を有することを特徴とするソフトウェアの構造変化検出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの構造変化検出方法、構造変化検出プログラム、および構造変化検出装置に関する。
【背景技術】
【０００２】
ソフトウェアは、機能向上などのためにプログラムを変更してエンハンスしていくことが多い。一方で、ソフトウェアのエンハンスを重ねることにより、ソフトウェア構造が複雑化し、ソースコードの理解し易さ、改変し易さ、試験し易さなどの品質が低下して保守性が悪くなる傾向にある。
【０００３】
先行技術としては、例えば、アプリケーションの制御構造とデータ依存構造を解析してアプリケーションモデルを生成し、アプリケーションモデルからアーキテクチャ複雑度が改善する改善ポイントを検索して、改善ポイントリストを出力する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２００９／０１１０５６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術では、ソフトウェアの改変により変更された部分のうちのどの部分が、ソフトウェア構造の複雑化に対して影響が大きいのかを判断することが難しい。
【０００６】
一つの側面では、本発明は、ソフトウェア構造の複雑化の要因となる改変箇所を特定し易くするソフトウェアの構造変化検出方法、構造変化検出プログラム、および構造変化検出装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力するソフトウェアの構造変化検出方法、構造変化検出プログラム、および構造変化検出装置が提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、ソフトウェア構造の複雑化の要因となる改変箇所を特定し易くすることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかるソフトウェアの構造変化検出方法の一実施例を示す説明図である。
【図２】図２は、構造変化検出装置１０１のハードウェア構成例を示すブロック図である。
【図３】図３は、改変前のソフトウェアＳＷのグラフ表現例を示す説明図である。
【図４】図４は、改変後のソフトウェアＳＷのグラフ表現例を示す説明図である。
【図５】図５は、構造変化検出装置１０１の機能的構成例を示すブロック図である。
【図６】図６は、エッジリストＥＬの具体例を示す説明図である。
【図７】図７は、差分テーブル７００の記憶内容の一例を示す説明図である。
【図８】図８は、構造変化特定リスト８００の具体例を示す説明図である。
【図９】図９は、最短パス表の具体例を示す説明図である。
【図１０】図１０は、削除後のソフトウェアＳＷのグラフ表現例を示す説明図（その１）である。
【図１１】図１１は、削除後のソフトウェアＳＷのグラフ表現例を示す説明図（その２）である。
【図１２】図１２は、削除後のソフトウェアＳＷのグラフ表現例を示す説明図（その３）である。
【図１３】図１３は、指標値種別「媒介性集中度」の指標値Ｖの算出例を示す説明図である。
【図１４】図１４は、構造変化検出装置１０１の構造変化検出処理手順の一例を示すフローチャートである。
【図１５】図１５は、構造変化特定リスト登録処理の具体的処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、本発明にかかるソフトウェアの構造変化検出方法、構造変化検出プログラム、および構造変化検出装置の実施の形態を詳細に説明する。
【００１１】
（ソフトウェアの構造変化検出方法の一実施例）
図１は、実施の形態にかかるソフトウェアの構造変化検出方法の一実施例を示す説明図である。図１において、構造変化検出装置１０１は、改変後のソフトウェアのうちのソフトウェア構造の複雑化の要因となる改変箇所の特定を支援するコンピュータである。
【００１２】
ソフトウェアは、プログラムの集合体であり、コンピュータを動作させる命令、手順などをコンピュータが理解できる形式で記述したものである。ソフトウェアは、機能向上などのためにプログラムを変更してエンハンスしていくことが多いが、エンハンスを重ねることにより、ソフトウェア構造の複雑化を招いてしまう。
【００１３】
ソフトウェア構造が複雑化すると、プログラムの理解し易さ、改変し易さ、試験し易さなどの品質が低下して、ソフトウェアの保守性が悪くなる傾向にある。このため、ソフトウェア構造の複雑化の要因となる改変箇所を特定し、その改変箇所を修正するなどして品質の低下を防ぐことは重要である。
【００１４】
そこで、実施の形態では、ソフトウェアに含まれる構成要素間の依存関係が、ソフトウェア構造を表す最小単位であることに着目して、ソフトウェア構造の複雑化の要因となる構成要素間の依存関係を特定する構造変化検出方法について説明する。以下、改変後のソフトウェアとして「ソフトウェア１１０」を例に挙げて、構造変化検出装置１０１の処理例について説明する。
【００１５】
（１）構造変化検出装置１０１は、ソフトウェアの構成要素群の構成要素間の依存関係の集合から、ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出する。ここで、構成要素は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどである。
【００１６】
構成要素間の依存関係は、例えば、コンポーネント、モジュール、ソースコード、クラス、関数などの呼び出し関係、継承関係、包含関係やデータアクセス関係などの関係である。構成要素間の依存関係は、例えば、ソフトウェアに新たな構成要素を追加、あるいは、ソフトウェアから既存の構成要素を削除した場合に追加される。
【００１７】
また、構成要素間の依存関係は、例えば、既存の構成要素を修正するなどして、既存の構成要素間の依存関係を新たに規定した場合に追加される。さらに、ソフトウェアの改変では、構成要素間の依存関係の向きを変更する場合がある。ここでは、このような変更が行われた依存関係も、ソフトウェアの改変により追加された依存関係として扱う。
【００１８】
また、ソフトウェアは、例えば、ソフトウェアの構成要素をノード（頂点）とし、構成要素間の依存関係を有向辺（以下、「エッジ」と称する）とする有向グラフ構造により表現することができる。なお、ソフトウェア構造を分析して、プログラム間の関係をグラフ形式で表す従来技術として、例えば、特開２０１３−１５６７８６号公報を参照することができる。
【００１９】
図１の例では、ソフトウェア１１０の各構成要素ａ〜ｆをノードとし、各構成要素間の依存関係をエッジ１１１〜１１７とする有向グラフ構造により、ソフトウェア１１０が表現されている。例えば、構成要素ａ，ｂをプログラム（Ｃ言語では、関数）とすると、エッジ１１１は、プログラムａがプログラムｂを呼び出すことを示す。
【００２０】
また、構成要素ｂ，ｆをプログラムとし、構成要素ｅをデータとすると、エッジ１１４は、プログラムｂのデータｅの書き込みを示し、エッジ１１６は、プログラムｆのデータｅの読み込みを示す。すなわち、プログラムｂがデータｅを書き込み、プログラムｆがデータｅを読み込むことで、プログラムｂとプログラムｆとが関係している。
【００２１】
ここでは、ソフトウェア１１０の構成要素ａ〜ｆをプログラムとし、エッジ１１１〜１１７のうちのエッジ１１６，１１７が、ソフトウェア１１０の改変により追加された構成要素間の依存関係を表す場合を想定する。
【００２２】
この場合、構造変化検出装置１０１は、エッジ１１１〜１１７から、エッジ１１６またはエッジ１１７を抽出する、あるいは、エッジ１１６およびエッジ１１７を抽出する。ここでは、ソフトウェア１１０の改変により追加された依存関係を表すエッジとして、エッジ１１７が抽出された場合を想定する。
【００２３】
（２）構造変化検出装置１０１は、構成要素間の依存関係の集合のうち、抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出する。ここで、ソフトウェア構造の複雑度合いを示す指標値とは、ソフトウェアの構造的な複雑さを示す値である。すなわち、第１の指標値は、抽出された依存関係がソフトウェアから削除された削除後のソフトウェアの構造的な複雑さを示す値である。
【００２４】
ソフトウェア構造の複雑度合いを示す指標値としては、例えば、ソフトウェアを表現する有向グラフ構造のノード間をつなぐ最短パスの総数を用いることができる。最短パスは、関係元のノードから関係先のノードに到達するパスのうち距離が最短となるパスである。距離は、例えば、関係元のノードから関係先のノードに到達するまでに経由するエッジの数で表される。
【００２５】
ソフトウェアを表現する有向グラフ構造において、ノード間をつなぐ最短パスの総数が増えると、ソフトウェア構造が複雑化してバグ数が増える傾向にある。すなわち、最短パスの総数は、ソフトウェア構造の複雑度合いを判断するための指標となり得る。
【００２６】
また、ソフトウェア構造の複雑度合いを示す指標値として、例えば、ソフトウェアを表現する有向グラフ構造のノード間をつなぐ最短パスの平均距離を用いることができる。ソフトウェアを表現する有向グラフ構造において、ノード間をつなぐ最短パスの平均距離が長くなると、ソフトウェア構造が複雑化してバグ数が増える傾向にある。すなわち、最短パスの平均距離は、ソフトウェア構造の複雑度合いを判断するための指標となり得る。
【００２７】
さらに、ソフトウェア構造の複雑度合いを示す指標値として、例えば、ソフトウェアを表現する有向グラフ構造の各ノードの媒介中心性から得られる媒介性集中度を用いることができる。媒介中心性は、有向グラフ構造における各ノードの中心性の高さを示す指標である。
【００２８】
媒介性集中度は、有向グラフ構造において、中心的なノードがどの程度集中しているかを示す指標である。ソフトウェアを表現する有向グラフ構造の媒介性集中度が高くなると、ソフトウェア構造が複雑化してバグ数が増える傾向にある。すなわち、媒介性集中度は、ソフトウェア構造の複雑度合いを判断するための指標となり得る。
【００２９】
図１の例では、構造変化検出装置１０１は、エッジ１１１〜１１７のうち、抽出したエッジ１１７を除く残余のエッジ１１１〜１１６に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出する。上述した「最短パスの総数」を指標値として用いる場合を例に挙げると、第１の指標値は「１０」となる。
【００３０】
（３）構造変化検出装置１０１は、算出した第１の指標値と、構成要素間の依存関係の集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値Ｔ以上の場合に、抽出した依存関係を特定する情報を出力する。ここで、第２の指標値は、改変後のソフトウェアの構造的な複雑さを示す値である。
【００３１】
また、閾値Ｔは、任意に設定可能である。例えば、閾値Ｔは、第１の指標値と第２の指標値との差分（第２の指標値−第１の指標値）が閾値Ｔ以上となると、抽出された依存関係を追加することでソフトウェアの複雑さが大きく増し、ソフトウェア構造の複雑化に対して大きな影響を与えていると判断できる値に設定される。
【００３２】
一例として、上述した「最短パスの総数」を指標値として用いる場合を例に挙げると、第２の指標値は「１６」となる。また、閾値Ｔを「Ｔ＝３」とする。この場合、第１の指標値「１０」と第２の指標値「１６」との差分「６（＝１６−１０）」が閾値Ｔ以上となる。
【００３３】
このため、構造変化検出装置１０１は、抽出したエッジ１１７を特定する情報１２０を出力する。情報１２０は、例えば、エッジ１１７が表す依存関係の関係元となる「プログラムｄ」と、関係先となる「プログラムａ」とを示す情報である。
【００３４】
このように、構造変化検出装置１０１によれば、ソフトウェアの改変により追加された構成要素間の依存関係のうち、ソフトウェア構造の複雑化に対して影響が大きい構成要素間の依存関係を特定して、当該依存関係を特定する情報を出力することができる。
【００３５】
これにより、ユーザは、ソフトウェアの改変に伴うソフトウェア構造の複雑化の要因となる改変箇所を特定することができる。図１の例では、ユーザは、情報１２０を参照することにより、ソフトウェア１１０のプログラムｄがプログラムａを呼び出す部分を、ソフトウェア構造の複雑化の要因として特定することができる。
【００３６】
この結果、ユーザは、ソフトウェア構造の複雑化の要因となる改変箇所について、何が悪く、どのように修正すればよいのかを突き止めることが可能となり、ソフトウェアの理解し易さ、改変し易さなどの品質の低下を防いで保守性を確保することができる。
【００３７】
（構造変化検出装置１０１のハードウェア構成例）
図２は、構造変化検出装置１０１のハードウェア構成例を示すブロック図である。図２において、構造変化検出装置１０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、メモリ２０２と、ディスクドライブ２０３と、ディスク２０４と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０５と、ディスプレイ２０６と、入力装置２０７と、を有する。また、各構成部はバス２００によってそれぞれ接続される。
【００３８】
ここで、ＣＰＵ２０１は、構造変化検出装置１０１の全体の制御を司る。メモリ２０２は、例えば、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ２０１のワークエリアとして使用される。メモリ２０２に記憶されるプログラムは、ＣＰＵ２０１にロードされることで、コーディングされている処理をＣＰＵ２０１に実行させる。
【００３９】
ディスクドライブ２０３は、ＣＰＵ２０１の制御に従ってディスク２０４に対するデータのリード／ライトを制御する。ディスク２０４は、ディスクドライブ２０３の制御で書き込まれたデータを記憶する。ディスク２０４としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
【００４０】
Ｉ／Ｆ２０５は、通信回線を通じてネットワーク２１０に接続され、ネットワーク２１０を介して他のコンピュータに接続される。そして、Ｉ／Ｆ２０５は、ネットワーク２１０と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。ネットワーク２１０は、例えば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどである。
【００４１】
ディスプレイ２０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０６は、例えば、ＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）、液晶ディスプレイ、有機ＥＬ（Ｅｌｅｃｔｒｏｌｕｍｉｎｅｓｃｅｎｃｅ）ディスプレイなどを採用することができる。
【００４２】
入力装置２０７は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。入力装置２０７は、キーボードやマウスなどであってもよく、また、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００４３】
なお、構造変化検出装置１０１は、上述した構成部のうち、例えば、ディスプレイ２０６や入力装置２０７を有さないことにしてもよい。また、構造変化検出装置１０１は、上述した構成部のほか、例えば、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、スキャナ、プリンタなどを有することにしてもよい。
【００４４】
（改変前後のソフトウェアＳＷのグラフ表現例）
つぎに、図３および図４を用いて、改変前後のソフトウェアＳＷのグラフ表現例について説明する。
【００４５】
図３は、改変前のソフトウェアＳＷのグラフ表現例を示す説明図である。図３において、改変前のソフトウェアＳＷを表現する有向グラフ構造が示されている。図３中、○の図形は、ソフトウェアＳＷの構成要素を表すノードを示す。図３の例では、改変前のソフトウェアＳＷの構成要素の数を１０個とする。
【００４６】
また、ノード間の矢印は、構成要素間の依存関係を表すエッジ（例えば、エッジｅ１〜ｅ９）を示す。矢印の始端を関係元のノード（関係元の構成要素）とし、矢印の終端（矢印の先）を関係先のノード（関係先の構成要素）とする。なお、図３中、○の図形の中のアルファベット（例えば、Ａ〜Ｊ）は、ソフトウェアＳＷの構成要素の識別子である。
【００４７】
図４は、改変後のソフトウェアＳＷのグラフ表現例を示す説明図である。図４において、改変後のソフトウェアＳＷを表現する有向グラフ構造が示されている。図４の例では、ソフトウェアＳＷの改変により追加された構成要素Ｋ，Ｌを表すノードがそれぞれ追加されている。また、ソフトウェアＳＷの改変により追加された構成要素間の依存関係を表すエッジｅ１０〜ｅ１２がそれぞれ追加されている。
【００４８】
（構造変化検出装置１０１の機能的構成例）
図５は、構造変化検出装置１０１の機能的構成例を示すブロック図である。図５において、構造変化検出装置１０１は、取得部５０１と、作成部５０２と、抽出部５０３と、算出部５０４と、判定部５０５と、出力部５０６と、を含む構成である。取得部５０１〜出力部５０６は制御部となる機能であり、具体的には、例えば、図２に示したメモリ２０２、ディスク２０４などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０５により、その機能を実現する。各機能部の処理結果は、例えば、メモリ２０２、ディスク２０４などの記憶装置に記憶される。
【００４９】
取得部５０１は、改変前後のソフトウェアＳＷを取得する機能を有する。ソフトウェアＳＷは、プログラムの集合体である。具体的には、例えば、取得部５０１は、図２に示した入力装置２０７を用いたユーザの操作入力により、改変前後のソフトウェアＳＷのソースコードを取得する。また、取得部５０１は、例えば、図２に示したネットワーク２１０を介して、外部のコンピュータから改変前後のソフトウェアＳＷのソースコードを取得することにしてもよい。
【００５０】
作成部５０２は、改変前後のソフトウェアＳＷに基づいて、改変前後のソフトウェアＳＷの構成要素間の依存関係の差分を示すエッジリストＥＬを作成する機能を有する。具体的には、例えば、まず、作成部５０２は、既存の構文解析技術および静的解析技術により、改変前のソフトウェアＳＷのソースコードを解析する。そして、作成部５０２は、解析したソースコードから関係元の構成要素と関係先の構成要素との組を抽出することにより、改変前のソフトウェアＳＷの構成要素間の依存関係を抽出する。
【００５１】
同様に、作成部５０２は、既存の構文解析技術および静的解析技術により、改変後のソフトウェアＳＷのソースコードを解析する。そして、作成部５０２は、解析したソースコードから関係元の構成要素と関係先の構成要素との組を抽出することにより、改変後のソフトウェアＳＷの構成要素間の依存関係を抽出する。
【００５２】
そして、作成部５０２は、抽出した改変前後のソフトウェアＳＷの構成要素間の依存関係を比較することにより、改変前後の構成要素間の依存関係の差分を示すエッジリストＥＬを作成する。ここで、図３および図４に有向グラフ構造を示した改変前後のソフトウェアＳＷに基づいて作成されるエッジリストＥＬの具体例について説明する。
【００５３】
図６は、エッジリストＥＬの具体例を示す説明図である。図６において、エッジリストＥＬは、エッジＩＤ、ソース、ターゲットおよび新旧フラグのフィールドを有し、各フィールドに情報を設定することで、エッジ情報（例えば、エッジ情報６００−１〜６００−１２）をレコードとして記憶する。
【００５４】
ここで、エッジＩＤは、ソフトウェアＳＷの構成要素間の依存関係を表すエッジの識別子である。ソースは、関係元の構成要素の識別子である。ターゲットは、関係先の構成要素の識別子である。新旧フラグは、ソフトウェアＳＷの改変により追加されたエッジ（構成要素間の依存関係）であるか否かを示す情報である。
【００５５】
新旧フラグには、ソフトウェアＳＷの改変前から存在するエッジの場合に「ｏｌｄ」が設定され、ソフトウェアＳＷの改変により追加されたエッジの場合に「ｎｅｗ」が設定される。エッジリストＥＬによれば、改変後のソフトウェアＳＷの構成要素間の依存関係の集合のうち、改変により追加された構成要素間の依存関係を判別することができる。
【００５６】
図５の説明に戻り、抽出部５０３は、改変後のソフトウェアＳＷの構成要素群の構成要素間の依存関係の集合から、ソフトウェアＳＷの改変により追加された少なくともいずれかの依存関係を抽出する機能を有する。具体的には、例えば、抽出部５０３は、作成されたエッジリストＥＬを参照して、新旧フラグ「ｎｅｗ」のいずれかのエッジを抽出する。この際、抽出部５０３は、新旧フラグ「ｎｅｗ」の１つのエッジを抽出してもよく、また、新旧フラグ「ｎｅｗ」の複数のエッジを抽出することにしてもよい。
【００５７】
抽出部５０３の抽出処理は、例えば、新旧フラグ「ｎｅｗ」のエッジのうち抽出されていない未抽出のエッジがなくなるまで繰り返し実行される。また、新旧フラグ「ｎｅｗ」の複数のエッジを抽出する場合には、複数のエッジの組合せのうち抽出されていない未抽出の組合せがなくなるまで繰り返し実行されることにしてもよい。
【００５８】
以下の説明では、改変後のソフトウェアＳＷの構成要素群の構成要素間の依存関係を表すエッジの集合を「エッジｅ１〜ｅｎ」と表記する場合がある（図６の例では、ｎ＝１２）。また、エッジｅ１〜ｅｎのうち、抽出部５０３によって抽出されたエッジを「エッジｅｉ」と表記する場合がある（ｉ＝１，２，…，ｎ）。ただし、エッジｅｉは、複数存在する場合がある。
【００５９】
算出部５０４は、改変後のソフトウェアＳＷの構成要素群の構成要素間の依存関係の集合のうち、抽出された依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_削除後を算出する機能を有する。具体的には、例えば、算出部５０４は、エッジリストＥＬを参照して、エッジｅ１〜ｅｎのうち、抽出されたエッジｅｉを除く残余のエッジに基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_削除後を算出する。
【００６０】
ここで、指標値Ｖ_削除後は、上述した第１の指標値に対応しており、改変後のソフトウェアＳＷからエッジｅｉが表す構成要素間の依存関係が削除された場合の削除後のソフトウェアＳＷの構造的な複雑さを示す。指標値Ｖ_削除後としては、例えば、上述した「最短パスの総数」、「最短パスの平均距離」および「媒介性集中度」のいずれの種別の指標値を用いることにしてもよい。
【００６１】
例えば、構造変化検出装置１０１は、指標値Ｖ_削除後として、「最短パスの総数」、「最短パスの平均距離」および「媒介性集中度」のいずれの種別の指標値を算出するのかの選択を受け付けることにしてもよい。この場合、算出部５０４は、選択された種別の指標値Ｖ_削除後を算出する。
【００６２】
なお、指標値Ｖ_削除後の算出例については、図１０〜図１２を用いて後述する。また、算出された指標値Ｖ_削除後は、後述する図７に示す差分テーブル７００に記憶される。
【００６３】
また、算出部５０４は、改変後のソフトウェアＳＷの構成要素群の構成要素間の依存関係の集合に基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_改変後を算出する機能を有する。具体的には、例えば、算出部５０４は、エッジリストＥＬを参照して、エッジｅ１〜ｅｎに基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_改変後を算出する。
【００６４】
ここで、指標値Ｖ_改変後は、上述した第２の指標値に対応しており、改変後のソフトウェアＳＷの構造的な複雑さを示す。ただし、指標値Ｖ_改変後としては、指標値Ｖ_削除後と同じ種別（例えば、最短パスの総数、最短パスの平均距離、媒介性集中度）の指標値を用いる。
【００６５】
なお、指標値Ｖ_改変後の算出例については、図９〜図１３を用いて後述する。また、算出された指標値Ｖ_改変後は、後述する図７に示す差分テーブル７００に記憶される。
【００６６】
また、算出部５０４は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分を算出する機能を有する。ここで、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後）として、上述した「最短パスの総数」、「最短パスの平均距離」、「媒介性集中度」などを用いる場合、指標値Ｖが大きくなると、ソフトウェアＳＷの構造的な複雑さが増すことになる。
【００６７】
この場合、算出部５０４は、例えば、指標値Ｖ_改変後から指標値Ｖ_削除後を減算することにより、指標値Ｖ_削除後と指標値Ｖ_改変後との差分を算出する。また、指標値Ｖ_削除後と指標値Ｖ_改変後との差分として、算出部５０４は、例えば、指標値Ｖ_削除後に対する指標値Ｖ_改変後の増加率を求めることにしてもよい。
【００６８】
ただし、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後）として、ソフトウェアＳＷの構造的な複雑さが増すと、指標値Ｖが小さくなるものを用いることにしてもよい。この場合、算出部５０４は、例えば、指標値Ｖ_削除後から指標値Ｖ_改変後を減算することにより、指標値Ｖ_削除後と指標値Ｖ_改変後との差分を算出する。
【００６９】
なお、指標値Ｖ_削除後と指標値Ｖ_改変後との差分の算出例については、図１０〜図１２を用いて後述する。また、算出された指標値Ｖ_削除後と指標値Ｖ_改変後との差分は、図７に示す差分テーブル７００に記憶される。ここで、差分テーブル７００の記憶内容について説明する。差分テーブル７００は、例えば、メモリ２０２、ディスク２０４などの記憶装置により実現される。
【００７０】
図７は、差分テーブル７００の記憶内容の一例を示す説明図である。図７において、差分テーブル７００は、抽出エッジＩＤ、指標値種別、Ｖ_削除後、Ｖ_改変後および差分のフィールドを有し、各フィールドに情報を設定することで、差分情報（例えば、差分情報７００−１〜７００−３）をレコードとして記憶する。
【００７１】
ここで、抽出エッジＩＤは、抽出部５０３によって抽出されたエッジｅｉの識別子である。指標値種別は、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後）の種別である。指標値種別としては、例えば、「最短パスの総数」、「最短パスの平均距離」および「媒介性集中度」のいずれかの種別が設定される。
【００７２】
Ｖ_削除後は、改変後のソフトウェアＳＷからエッジｅｉが表す構成要素間の依存関係が削除された場合の削除後のソフトウェアＳＷの構造的な複雑さを示す指標値である。Ｖ_改変後は、改変後のソフトウェアＳＷの構造的な複雑さを示す指標値である。差分は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分である。
【００７３】
例えば、差分情報７００−１は、改変後のソフトウェアＳＷからエッジｅ１０が表す構成要素間の依存関係が削除された場合の指標値Ｖ_削除後「４２」と指標値Ｖ_改変後「４４」との差分「２」を示す。ただし、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後）の種別は、「最短パスの総数」である。
【００７４】
図５の説明に戻り、判定部５０５は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上であるか否かを判定する機能を有する。具体的には、例えば、判定部５０５は、図７に示したような差分テーブル７００を参照して、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上であるか否かを判定する。
【００７５】
ここで、閾値Ｔ１は、上述した閾値Ｔに対応しており、指標値Ｖの種別ごとに予め設定されてメモリ２０２、ディスク２０４などの記憶装置に記憶されている。例えば、閾値Ｔ１は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となると、抽出されたエッジｅｉが表す構成要素間の依存関係を追加する改変が、ソフトウェア構造の複雑化に大きな影響を与えていると判断できる値に設定される。
【００７６】
一例として、指標値種別「最短パスの総数」の閾値Ｔ１を「Ｔ１＝１０」とする。この場合、判定部５０５は、例えば、差分テーブル７００を参照して、エッジｅ１０の指標値Ｖ_削除後と指標値Ｖ_改変後との差分「２」が閾値Ｔ１未満であると判定する。また、判定部５０５は、エッジｅ１１の指標値Ｖ_削除後と指標値Ｖ_改変後との差分「２４」が閾値Ｔ１以上であると判定する。また、判定部５０５は、エッジｅ１２の指標値Ｖ_削除後と指標値Ｖ_改変後との差分「７」が閾値Ｔ１未満であると判定する。
【００７７】
また、判定部５０５は、抽出されたエッジｅｉの指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上であると判定した場合、エッジｅｉを特定する情報を、図８に示すような構造変化特定リスト８００に登録することにしてもよい。ここで、構造変化特定リスト８００の具体例について説明する。
【００７８】
図８は、構造変化特定リスト８００の具体例を示す説明図である。図８において、構造変化特定リスト８００は、指標値種別、ソース、ターゲットおよび差分のフィールドを有し、各フィールドに情報を設定することで、構造変化情報（例えば、構造変化情報８００−１，８００−２）をレコードとして記憶する。
【００７９】
ここで、指標値種別は、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後）の種別である。ソースは、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となるエッジｅｉが表す関係元の構成要素の情報である。図８の例では、ソースとして、関係元の構成要素となる関数の関数名が示されている。
【００８０】
ターゲットは、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となるエッジｅｉが表す関係先の構成要素の情報である。図８の例では、ターゲットとして、関係先の構成要素となる関数の関数名が示されている。差分は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分である。
【００８１】
図５の説明に戻り、出力部５０６は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上であると判定された場合、抽出された構成要素間の依存関係を特定する情報を出力する機能を有する。具体的には、例えば、出力部５０６は、図８に示したような構造変化特定リスト８００を出力することにしてもよい。
【００８２】
これにより、ユーザは、構造変化特定リスト８００を参照することにより、改変後のソフトウェアＳＷの関数「ａｃｃｔ．ｃ＃ｄｏ＿ａｃｃｔ＿ｐｒｏｃｅｓｓ」が関数「ｃｒｅｄ．ｃ＃ｏｖｅｒｒｉｄｅ＿ｃｒｅｄｓ」を呼び出す部分が、ソフトウェア構造の複雑化の要因となっていると判断することができる。
【００８３】
また、ユーザは、改変後のソフトウェアＳＷの関数「ａｃｃｔ．ｃ＃ａｃｃｔ＿ｐａｒｍ」が関数「ａｃｃｔ．ｃ＃ｃｈｅｃｋ＿ｆｒｅｅ＿ｓｐａｃｅ」を呼び出す部分が、ソフトウェア構造の複雑化の要因となっていると判断することができる。また、ユーザは、ソフトウェア構造の複雑化の要因となる改変箇所が、どの種別の指標値Ｖを用いて特定されたのかを判別することができる。
【００８４】
図５の説明に戻り、抽出部５０３によって抽出された構成要素間の依存関係のうち、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となる依存関係が複数存在する場合がある。この場合、出力部５０６は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が最大となる依存関係を特定する情報を出力することにしてもよい。
【００８５】
また、出力部５０６は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となる依存関係が複数存在する場合、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が大きいものから上位Ｘ個の依存関係を特定する情報を出力することにしてもよい。上記Ｘの値は、任意に設定可能である（例えば、Ｘ＝３）。
【００８６】
また、出力部５０６は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となる依存関係が複数存在する場合、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が大きいものから順に、構成要素間の依存関係を特定する情報を出力することにしてもよい。
【００８７】
なお、出力部５０６の出力形式としては、例えば、ディスプレイ２０６への表示、不図示のプリンタへの印刷出力、Ｉ／Ｆ２０５による外部のコンピュータへの送信、メモリ２０２、ディスク２０４などの記憶装置への記憶がある。
【００８８】
ここで、ソフトウェアＳＷの改変前後において、ソフトウェア構造の複雑度合いがあまり大きくならない、あるいは、ソフトウェア構造の複雑度合いが小さくなる場合がある。そこで、抽出部５０３は、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上である場合に、上述した抽出処理を実行することにしてもよい。
【００８９】
例えばまず、算出部５０４は、改変前のソフトウェアＳＷの構成要素群の構成要素間の依存関係の集合に基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_改変前を算出する。ここで、指標値Ｖ_改変前は、改変前のソフトウェアＳＷの構造的な複雑さを示す。
【００９０】
具体的には、例えば、算出部５０４は、エッジリストＥＬを参照して、エッジｅ１〜ｅｎのうち新旧フラグ「ｎｅｗ」のエッジを除く残余のエッジに基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_改変前を算出する。ただし、指標値Ｖ_改変前としては、指標値Ｖ_改変後と同じ種別の指標値を用いる。
【００９１】
つぎに、抽出部５０３は、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上であるか否かを判定する。そして、抽出部５０３は、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上である場合に、エッジリストＥＬを参照して、新旧フラグ「ｎｅｗ」のいずれかのエッジを抽出することにしてもよい。
【００９２】
ここで、閾値Ｔ０は、上述した閾値Ｔ１よりも大きい値であり、指標値Ｖの種別ごとに予め設定されてメモリ２０２、ディスク２０４などの記憶装置に記憶されている。例えば、閾値Ｔ０は、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上となると、ソフトウェアＳＷの改変が、ソフトウェア構造の複雑化に大きな影響を与えていると判断できる値に設定される。
【００９３】
なお、上述した説明では、改変前後のソフトウェアＳＷに基づいてエッジリストＥＬを作成する場合を例に挙げて説明したが、これに限らない。例えば、取得部５０１が、ユーザの操作入力により、または、外部のコンピュータから、改変前後のソフトウェアＳＷのエッジリストＥＬを取得することにしてもよい。
【００９４】
また、上述した説明では、ソフトウェアＳＷの改変により追加された依存関係のみを対象として指標値Ｖ_削除後を算出することにしたが、これに限らない。例えば、ソフトウェアＳＷの改変により構成要素間の依存関係が削除されることがあり、構成要素間の依存関係の削除によりソフトウェアＳＷの複雑さが増す場合が考えられる。
【００９５】
そこで、算出部５０４は、ソフトウェアＳＷの改変により削除された構成要素間の依存関係を元の状態に戻した場合のソフトウェア構造の複雑度合いを示す指標値を、指標値Ｖ_削除後として算出することにしてもよい。ただし、この場合に用いる指標値Ｖ_削除後の種別は「媒介性集中度」とする。
【００９６】
具体的には、例えば、まず、抽出部５０３は、改変前のソフトウェアＳＷの構成要素群の構成要素間の依存関係の集合から、ソフトウェアＳＷの改変により削除されるいずれかの依存関係を抽出する。ソフトウェアＳＷの改変により削除されるいずれかの依存関係は、改変前後のソフトウェアＳＷの構成要素間の依存関係を比較することにより特定することができる。そして、算出部５０４は、改変後のソフトウェアＳＷの構成要素群の構成要素間の依存関係の集合に、抽出された依存関係を追加した追加後の集合に基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_削除後を算出することにしてもよい。
【００９７】
（指標値Ｖ_削除後および指標値Ｖ_改変後の算出例）
つぎに、図３および図４に有向グラフ構造を示した改変前後のソフトウェアＳＷを例に挙げて、指標値Ｖ_削除後および指標値Ｖ_改変後の算出例について説明する。ただし、指標値種別が、「最短パスの総数」または「最短パスの平均距離」である場合を想定する。
【００９８】
まず、図９を用いて、指標値Ｖ_改変後の算出例について説明する。
【００９９】
図９は、最短パス表の具体例を示す説明図である。図９において、最短パス表９００は、改変後のソフトウェアＳＷを表現する有向グラフ構造（図４参照）のノード間をつなぐ最短パスの距離を記憶する。まず、算出部５０４は、エッジリストＥＬ（図６参照）を参照して、ノード間の最短パスおよび最短パスの距離を特定する。
【０１００】
つぎに、算出部５０４は、最短パス表９００内のセルのうち、特定した最短パスに対応するセルに、特定した最短パスの距離を記録する。例えば、ノードＡとノードＥとをつなぐ最短パスを例に挙げると、算出部５０４は、ノードＡとノードＥとをつなぐ最短パスに対応するセルに距離「２」を記録する。
【０１０１】
そして、算出部５０４は、最短パス表９００を参照して、最短パス表９００内の距離が記録されたセルの数を算出することにより、最短パスの総数を算出する。図９の例では、最短パス表９００内の距離が記録されたセルの数は「４４」である。このため、指標値種別が「最短パスの総数」である場合の指標値Ｖ_改変後は「４４」となる。
【０１０２】
また、算出部５０４は、最短パス表９００を参照して、最短パス表９００に記録された最短パスの距離の総和を、最短パスの総数で割ることにより、最短パスの平均距離を算出する。図９の例では、最短パスの距離の総和は「１２３」であり、最短パスの平均距離は「２．７９５（≒１２３／４４）」である。このため、指標値種別が「最短パスの平均距離」である場合の指標値Ｖ_改変後は「２．７９５」となる。
【０１０３】
つぎに、図１０〜図１２を用いて、指標値Ｖ_削除後の算出例について説明する。
【０１０４】
図１０は、削除後のソフトウェアＳＷのグラフ表現例を示す説明図（その１）である。図１０の例では、ソフトウェアＳＷの改変により追加されたエッジｅ１０〜ｅ１２のうちのエッジｅ１０が削除されている。すなわち、図１０の例は、エッジｅｉとして、エッジｅ１０が抽出された場合の有向グラフ構造を示している。
【０１０５】
この場合、まず、算出部５０４は、例えば、エッジリストＥＬ（図６参照）からエッジｅ１０を削除する。つぎに、算出部５０４は、削除後のエッジリストＥＬを参照して、ノード間の最短パスおよび最短パスの距離を特定する。そして、算出部５０４は、図９に示したような最短パス表９００を用いて、最短パスの総数と平均距離を算出する。
【０１０６】
図１０の例では、最短パスの総数は「４２」である。このため、指標値Ｖの種別が「最短パスの総数」である場合のエッジｅ１０についての指標値Ｖ_削除後は「４２」となる。また、最短パスの平均距離は「２．８５７」である。このため、指標値種別が「最短パスの平均距離」である場合のエッジｅ１０についての指標値Ｖ_改変後は「２．８５７」となる。
【０１０７】
図１１は、削除後のソフトウェアＳＷのグラフ表現例を示す説明図（その２）である。図１１の例では、ソフトウェアＳＷの改変により追加されたエッジｅ１０〜ｅ１２のうちのエッジｅ１１が削除されている。すなわち、図１１の例は、エッジｅｉとして、エッジｅ１１が抽出された場合の有向グラフ構造を示している。
【０１０８】
この場合、まず、算出部５０４は、例えば、エッジリストＥＬ（図６参照）からエッジｅ１１を削除する。つぎに、算出部５０４は、削除後のエッジリストＥＬを参照して、ノード間の最短パスおよび最短パスの距離を特定する。そして、算出部５０４は、図９に示したような最短パス表９００を用いて、最短パスの総数と平均距離を算出する。
【０１０９】
図１１の例では、最短パスの総数は「２０」である。このため、指標値Ｖの種別が「最短パスの総数」である場合のエッジｅ１１についての指標値Ｖ_削除後は「２０」となる。また、最短パスの平均距離は「１．５５」である。このため、指標値種別が「最短パスの平均距離」である場合のエッジｅ１１についての指標値Ｖ_改変後は「１．５５」となる。
【０１１０】
図１２は、削除後のソフトウェアＳＷのグラフ表現例を示す説明図（その３）である。図１２の例では、ソフトウェアＳＷの改変により追加されたエッジｅ１０〜ｅ１２のうちのエッジｅ１２が削除されている。すなわち、図１２の例は、エッジｅｉとして、エッジｅ１２が抽出された場合の有向グラフ構造を示している。
【０１１１】
この場合、まず、算出部５０４は、例えば、エッジリストＥＬ（図６参照）からエッジｅ１２を削除する。つぎに、算出部５０４は、削除後のエッジリストＥＬを参照して、ノード間の最短パスおよび最短パスの距離を特定する。そして、算出部５０４は、図９に示したような最短パス表９００を用いて、最短パスの総数と平均距離を算出する。
【０１１２】
図１２の例では、最短パスの総数は「３７」である。このため、指標値種別が「最短パスの総数」である場合のエッジｅ１２についての指標値Ｖ_削除後は「３７」となる。また、最短パスの平均距離は「２．５６７」である。このため、指標値種別が「最短パスの平均距離」である場合のエッジｅ１２についての指標値Ｖ_改変後は「２．５６７」となる。
【０１１３】
（指標値種別が「媒介性集中度」である場合の指標値Ｖの算出例）
つぎに、指標値種別が「媒介性集中度」である場合の指標値Ｖの算出例について説明する。ここでは、説明を簡単にするため、改変後のソフトウェアＳＷが、図１３に示すような無向グラフ構造で表現される場合を例に挙げて、指標値種別が「媒介性集中度」である場合の指標値Ｖ_改変後の算出例について説明する。
【０１１４】
図１３は、指標値種別「媒介性集中度」の指標値Ｖの算出例を示す説明図である。図１３において、改変後のソフトウェアＳＷを表現する無向グラフ構造１３００が示されている。図１３の例では、改変後のソフトウェアＳＷの構成要素の数を７個とする。
【０１１５】
まず、算出部５０４は、各ノードｉの媒介中心性Ｃ（ｉ）を算出する（ｉ＝Ａ，Ｂ，…，Ｇ）。ここで、媒介中心性Ｃ（ｉ）は、ノードｉを除く全てのノードが互いに連絡するときに、ノードｉを通る割合で求められる。このため、算出部５０４は、例えば、下記式（１）を用いて、各ノードｉの媒介中心性Ｃ（ｉ）を算出することができる。
【０１１６】
ただし、連絡には最短経路が使われ、迂回はしないこととする。また、最短経路が複数存在する場合、経路数は「ノードｉを通る経路数／存在する最短経路数」で求める。ノードｉを除く他ノードの組合せは、下記式（２）を用いて求めることができる。ただし、ｇは、無向グラフ構造に属するノードの総数である。
【０１１７】
Ｃ（ｉ）＝（ノードｉを通る経路数の総和）÷（ノードｉを除く他ノードの組合せ）
・・・（１）
【０１１８】
ノードｉを除く他ノードの組合せ＝（ｇ−１）×（ｇ−２）÷２    ・・・（２）
【０１１９】
なお、有向グラフ構造の場合、ノードｉを除く他ノードの組合せは、下記式（３）を用いて求めることができる。ただし、ｇは、有向グラフ構造に属するノードの総数である。
【０１２０】
ノードｉを除く他ノードの組合せ＝（ｇ−１）×（ｇ−２）        ・・・（３）
【０１２１】
各ノードＡ〜Ｇの媒介中心性Ｃ（Ａ）〜Ｃ（Ｇ）は、表１３０１のようになる。
【０１２２】
つぎに、算出部５０４は、各ノードｉの媒介中心性Ｃ（ｉ）の分散を算出する。具体的には、例えば、算出部５０４は、媒介中心性Ｃ（Ａ）〜Ｃ（Ｇ）のうちの最大の媒介中心性Ｃmaxから、各ノードｉの媒介中心性Ｃ（ｉ）を減算することにより、各ノードｉの媒介中心性Ｃ（ｉ）の分散を算出することができる。
【０１２３】
各ノードＡ〜Ｇの媒介中心性Ｃ（Ａ）〜Ｃ（Ｇ）の分散は、表１３０２のようになる。
【０１２４】
つぎに、算出部５０４は、ノードの総数が７個の無向グラフ構造のノードｉが取り得る最大の媒介中心性の分散を算出する。具体的には、例えば、算出部５０４は、無向グラフ構造１３００と同規模のスター型の無向グラフ構造について、無向グラフ構造１３００と同様の処理を行うことにより、最大の媒介中心性の分散を算出することができる。
【０１２５】
無向グラフ構造１３００と同規模のスター型の無向グラフ構造の各ノードＡ〜Ｇの媒介中心性Ｃ（Ａ）〜Ｃ（Ｇ）の分散は、表１３０３のようになる。
【０１２６】
そして、算出部５０４は、無向グラフ構造１３００の各ノードＡ〜Ｇの媒介中心性Ｃ（Ａ）〜Ｃ（Ｇ）の分散の総和を、無向グラフ構造１３００と同規模のスター型の無向グラフ構造の各ノードＡ〜Ｇの媒介中心性Ｃ（Ａ）〜Ｃ（Ｇ）の分散の総和で割る。これにより、媒介性集中度を算出することができる。
【０１２７】
図１３の例では媒介性集中度は「０．４７（≒２．８１／６．００）」となる。このため、指標値種別が「媒介性集中度」である場合の指標値Ｖ_改変後は「０．４７」となる。
【０１２８】
（構造変化検出装置１０１の構造変化検出処理手順）
つぎに、構造変化検出装置１０１の構造変化検出処理手順について説明する。
【０１２９】
図１４は、構造変化検出装置１０１の構造変化検出処理手順の一例を示すフローチャートである。図１４のフローチャートにおいて、まず、構造変化検出装置１０１は、改変前後のソフトウェアＳＷを取得したか否かを判断する（ステップＳ１４０１）。ここで、構造変化検出装置１０１は、改変前後のソフトウェアＳＷを取得するのを待つ（ステップＳ１４０１：Ｎｏ）。
【０１３０】
そして、構造変化検出装置１０１は、改変前後のソフトウェアＳＷを取得した場合（ステップＳ１４０１：Ｙｅｓ）、改変前後のソフトウェアＳＷに基づいて、改変前後の構成要素間の依存関係の差分を示すエッジリストＥＬを作成する（ステップＳ１４０２）。
【０１３１】
つぎに、構造変化検出装置１０１は、エッジリストＥＬを参照して、エッジｅ１〜ｅｎのうち新旧フラグ「ｎｅｗ」のエッジを除く残余のエッジに基づいて、改変前のソフトウェア構造の複雑度合いを示す指標値Ｖ_改変前を算出する（ステップＳ１４０３）。
【０１３２】
つぎに、構造変化検出装置１０１は、エッジリストＥＬを参照して、エッジｅ１〜ｅｎに基づいて、改変後のソフトウェア構造の複雑度合いを示す指標値Ｖ_改変後を算出する（ステップＳ１４０４）。そして、構造変化検出装置１０１は、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上であるか否かを判定する（ステップＳ１４０５）。
【０１３３】
ここで、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０未満の場合（ステップＳ１４０５：Ｎｏ）、構造変化検出装置１０１は、構造変化無しメッセージを出力して（ステップＳ１４０６）、本フローチャートによる一連の処理を終了する。なお、構造変化無しメッセージは、ソフトウェアＳＷの改変に伴う構造変化が検出されなかったことを示すメッセージである。
【０１３４】
一方、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上の場合（ステップＳ１４０５：Ｙｅｓ）、構造変化検出装置１０１は、構造変化特定リスト登録処理を実行する（ステップＳ１４０７）。構造変化特定リスト登録処理の具体的な処理手順については、図１５のフローチャートを用いて後述する。
【０１３５】
そして、構造変化検出装置１０１は、構造変化特定リスト８００に構造変化情報が登録されているか否かを判断する（ステップＳ１４０８）。ここで、構造変化情報が登録されている場合（ステップＳ１４０８：Ｙｅｓ）、構造変化検出装置１０１は、構造変化特定リスト８００を出力して（ステップＳ１４０９）、本フローチャートによる一連の処理を終了する。
【０１３６】
一方、構造変化情報が登録されていない場合（ステップＳ１４０８：Ｎｏ）、構造変化検出装置１０１は、原因特定不可メッセージを出力して（ステップＳ１４１０）、本フローチャートによる一連の処理を終了する。なお、原因特定不可メッセージは、ソフトウェアＳＷの改変に伴う構造変化が検出されたが、その構造変化の原因を特定できなかったことを示すメッセージである。
【０１３７】
これにより、ソフトウェアＳＷの改変に伴う構造変化が検出された場合に、ソフトウェア構造の複雑化に対して影響が大きい改変箇所を特定するための構造変化特定リスト８００を出力することができる。また、ソフトウェアＳＷの改変に伴う構造変化が検出されなかった場合は、構造変化無しメッセージを出力することができる。また、ソフトウェアＳＷの改変に伴う構造変化が検出されたが、その構造変化の原因を特定できなかった場合には、原因特定不可メッセージを出力することができる。
【０１３８】
＜構造変化特定リスト登録処理の具体的処理手順＞
つぎに、図１４に示したステップＳ１４０７の構造変化特定リスト登録処理の具体的な処理手順について説明する。
【０１３９】
図１５は、構造変化特定リスト登録処理の具体的処理手順の一例を示すフローチャートである。図１５のフローチャートにおいて、まず、構造変化検出装置１０１は、エッジリストＥＬを参照して、新旧フラグ「ｎｅｗ」の未抽出のエッジｅｉを抽出する（ステップＳ１５０１）。
【０１４０】
つぎに、構造変化検出装置１０１は、エッジリストＥＬからエッジｅｉを削除し（ステップＳ１５０２）、削除後のエッジリストＥＬを参照して、削除後のソフトウェア構造の複雑度合いを示す指標値Ｖ_削除後を算出する（ステップＳ１５０３）。そして、構造変化検出装置１０１は、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上であるか否かを判定する（ステップＳ１５０４）。
【０１４１】
ここで、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１未満の場合（ステップＳ１５０４：Ｎｏ）、構造変化検出装置１０１は、ステップＳ１５０６に移行する。一方、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上の場合（ステップＳ１５０４：Ｙｅｓ）、構造変化検出装置１０１は、抽出したエッジｅｉを特定する構造変化情報を構造変化特定リスト８００に登録する（ステップＳ１５０５）。
【０１４２】
つぎに、構造変化検出装置１０１は、ステップＳ１５０２において削除したエッジｅｉをエッジリストＥＬに戻す（ステップＳ１５０６）。そして、構造変化検出装置１０１は、エッジリストＥＬから抽出していない未抽出の新旧フラグ「ｎｅｗ」のエッジがあるか否かを判断する（ステップＳ１５０７）。
【０１４３】
ここで、未抽出の新旧フラグ「ｎｅｗ」のエッジがある場合（ステップＳ１５０７：Ｙｅｓ）、構造変化検出装置１０１は、ステップＳ１５０１に戻る。一方、未抽出の新旧フラグ「ｎｅｗ」のエッジがない場合（ステップＳ１５０７：Ｎｏ）、構造変化検出装置１０１は、構造変化特定リスト登録処理を呼び出したステップに戻る。
【０１４４】
これにより、ソフトウェア構造の複雑化に対して影響が大きいエッジｅｉを特定する構造変化情報をリスト化して構造変化特定リスト８００に登録することができる。
【０１４５】
以上説明したように、実施の形態にかかる構造変化検出装置１０１によれば、改変前後のソフトウェアＳＷに基づいて、改変前後のソフトウェアＳＷの構成要素間の依存関係の差分を示すエッジリストＥＬを作成することができる。これにより、改変後のソフトウェアＳＷの構成要素間の依存関係の集合のうち、改変により追加された構成要素間の依存関係を判別することができる。
【０１４６】
また、構造変化検出装置１０１によれば、作成したエッジリストＥＬを参照して、エッジｅ１〜ｅｎから改変により追加されたエッジｅｉを抽出することができる。そして、構造変化検出装置１０１によれば、エッジｅ１〜ｅｎのうち、抽出したエッジｅｉを除く残余のエッジに基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_削除後を算出することができる。これにより、改変後のソフトウェアＳＷからエッジｅｉが表す構成要素間の依存関係が削除された場合の削除後のソフトウェアＳＷの構造的な複雑さを判断する指標を求めることができる。
【０１４７】
また、構造変化検出装置１０１によれば、エッジリストＥＬを参照して、エッジｅ１〜ｅｎに基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_改変後を算出することができる。これにより、改変後のソフトウェアＳＷの構造的な複雑さを判断する指標を求めることができる。
【０１４８】
また、構造変化検出装置１０１によれば、算出した指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上であるか否かを判定することができる。これにより、エッジｅｉが表す構成要素間の依存関係を追加する改変が、ソフトウェア構造の複雑化に対して影響が大きいか否かを判断することができる。
【０１４９】
また、構造変化検出装置１０１によれば、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上の場合に、抽出したエッジｅｉが表す構成要素間の依存関係を特定する構造変化情報を出力することができる。これにより、ユーザは、ソフトウェアＳＷの改変に伴うソフトウェア構造の複雑化の要因となる改変箇所を特定することができる。
【０１５０】
また、構造変化検出装置１０１によれば、エッジリストＥＬを参照して、ソフトウェアＳＷの改変により追加されたエッジのうち抽出されていない未抽出のエッジがなくなるまで、改変により追加されたエッジｅｉの抽出を繰り返し行うことができる。これにより、ソフトウェア構造の複雑化に対して影響が大きい改変箇所を網羅的に特定することができる。
【０１５１】
また、構造変化検出装置１０１によれば、指標値Ｖ_削除後と指標値Ｖ_改変後との差分が閾値Ｔ１以上となるエッジが複数存在する場合は、差分が最大となるエッジｅｉが表す構成要素間の依存関係を特定する構造変化情報を出力することができる。これにより、ユーザは、ソフトウェア構造の複雑化に対して最も影響が大きい改変箇所を特定することができる。
【０１５２】
また、構造変化検出装置１０１によれば、エッジリストＥＬを参照して、エッジｅ１〜ｅｎのうち改変により追加されたエッジを除く残余のエッジに基づいて、ソフトウェア構造の複雑度合いを示す指標値Ｖ_改変前を算出することができる。これにより、改変前のソフトウェアＳＷの構造的な複雑さを判断する指標を求めることができる。
【０１５３】
また、構造変化検出装置１０１によれば、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０以上である場合に、エッジリストＥＬを参照して、エッジｅ１〜ｅｎから改変により追加されたエッジｅｉを抽出することができる。これにより、ソフトウェア構造を複雑化させるような改変が行われていない場合の抽出処理を抑制して、構造変化検出装置１０１の処理負荷の増大を抑制することができる。
【０１５４】
また、構造変化検出装置１０１によれば、指標値Ｖ_改変前と指標値Ｖ_改変後との差分が閾値Ｔ０未満の場合には、構造変化無しメッセージを出力することができる。これにより、ユーザは、ソフトウェアＳＷの改変に伴う構造変化が検出されなかったことを認識することができる。
【０１５５】
また、構造変化検出装置１０１によれば、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後、指標値Ｖ_改変前）として、バグ数と正の相関が認められる「最短パスの総数」を用いることができる。これにより、改変後のソフトウェアＳＷのバグ数を増加させる要因となる改変箇所を特定することができる。
【０１５６】
また、構造変化検出装置１０１によれば、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後、指標値Ｖ_改変前）として、バグ数と正の相関が認められる「最短パスの平均距離」を用いることができる。これにより、改変後のソフトウェアＳＷのバグ数を増加させる要因となる改変箇所を特定することができる。
【０１５７】
また、構造変化検出装置１０１によれば、指標値Ｖ（指標値Ｖ_削除後、指標値Ｖ_改変後、指標値Ｖ_改変前）として、バグ数と正の相関が認められる「媒介性集中度」を用いることができる。これにより、改変後のソフトウェアＳＷのバグ数を増加させる要因となる改変箇所を特定することができる。
【０１５８】
これらのことから、実施の形態にかかる構造変化検出装置１０１によれば、ユーザは、開発プロセスの早い段階（例えば、テスト開始前の段階）でソフトウェア構造を悪化させる要因を見つけることができる。そして、ユーザは、ソフトウェア構造の複雑化の要因となる改変箇所について、何が悪く、どのように修正すればよいのかを突き止めることが可能となり、ソフトウェアの理解し易さ、改変し易さなどの品質の低下を防いで保守性を確保することができる。
【０１５９】
また、ユーザは、ソフトウェア構造の複雑化の要因となる改変箇所を要注意箇所として示すことで、次回エンハンス時のプログラム変更仕様の指針を示すことができる。また、ソフトウェア構造の複雑化の要因となる改変箇所を、ソフトウェアＳＷのソースコードのみを用いてソフトウェア構造の複雑化に対する影響を評価できるため、人的稼働が不要となり、低コストかつ高精度にソフトウェア構造の複雑化の要因となる改変箇所を特定できる。
【０１６０】
なお、本実施の形態で説明したソフトウェアの構造変化検出方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ソフトウェアの構造変化検出プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本ソフトウェアの構造変化検出プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１６１】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１６２】
（付記１）コンピュータが、
ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
処理を実行することを特徴とするソフトウェアの構造変化検出方法。
【０１６３】
（付記２）前記コンピュータが、
前記ソフトウェアの改変により追加された依存関係のうち抽出されていない依存関係がなくなるまで、前記集合から前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、抽出した依存関係ごとに、前記算出する処理および前記出力する処理を実行することを特徴とする付記１に記載のソフトウェアの構造変化検出方法。
【０１６４】
（付記３）前記コンピュータが、
前記抽出した依存関係のうち、前記第２の指標値との差分が前記閾値以上となる依存関係が複数存在する場合は、前記第２の指標値との差分が最大となる依存関係を特定する情報を出力する、処理を実行することを特徴とする付記２に記載のソフトウェアの構造変化検出方法。
【０１６５】
（付記４）ソフトウェア構造の複雑度合いを示す指標値は、前記ソフトウェアの構成要素をノードとし、構成要素間の依存関係を有向辺とする有向グラフ構造のノード間をつなぐ最短パスの総数であることを特徴とする付記１〜３のいずれか一つに記載のソフトウェアの構造変化検出方法。
【０１６６】
（付記５）ソフトウェア構造の複雑度合いを示す指標値は、前記ソフトウェアの構成要素をノードとし、構成要素間の依存関係を有向辺とする有向グラフ構造のノード間をつなぐ最短パスの平均距離であることを特徴とする付記１〜４のいずれか一つに記載のソフトウェアの構造変化検出方法。
【０１６７】
（付記６）ソフトウェア構造の複雑度合いを示す指標値は、前記ソフトウェアの構成要素をノードとし、構成要素間の依存関係を辺とするグラフ構造の各ノードの媒介中心性から得られる媒介性集中度であることを特徴とする付記１〜５のいずれか一つに記載のソフトウェアの構造変化検出方法。
【０１６８】
（付記７）前記コンピュータが、
前記第２の指標値と、前記ソフトウェアを改変する前の構成要素間の依存関係の集合に基づくソフトウェア構造の複雑度合いを示す第３の指標値との差分が閾値以上の場合に、前記抽出する処理を実行することを特徴とする付記１〜６のいずれか一つに記載のソフトウェアの構造変化検出方法。
【０１６９】
（付記８）コンピュータに、
ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
処理を実行させることを特徴とするソフトウェアの構造変化検出プログラム。
【０１７０】
（付記９）ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
制御部を有することを特徴とするソフトウェアの構造変化検出装置。
【０１７１】
（付記１０）コンピュータに、
ソフトウェアの構成要素群の構成要素間の依存関係の集合から、前記ソフトウェアの改変により追加された少なくともいずれかの依存関係を抽出し、
前記集合のうち前記抽出した依存関係を除く残余の依存関係に基づいて、ソフトウェア構造の複雑度合いを示す第１の指標値を算出し、
前記第１の指標値と、前記集合に基づくソフトウェア構造の複雑度合いを示す第２の指標値との差分が閾値以上の場合に、前記抽出した依存関係を特定する情報を出力する、
処理を実行させるソフトウェアの構造変化検出プログラムを記録したことを特徴とする前記コンピュータに読み取り可能な記録媒体。
【符号の説明】
【０１７２】
１０１  構造変化検出装置
１１０，ＳＷ  ソフトウェア
１１１〜１１７，ｅ１〜ｅｎ，ｅｉ  エッジ
５０１  取得部
５０２  作成部
５０３  抽出部
５０４  算出部
５０５  判定部
５０６  出力部
７００  差分テーブル
８００  構造変化特定リスト
９００  最短パス表
ａ〜ｆ，Ａ〜Ｌ  構成要素
ＥＬ  エッジリスト
【図１】
2016051224.tif 000003
【図２】
2016051224.tif 000004
【図３】
2016051224.tif 000005
【図４】
2016051224.tif 000006
【図５】
2016051224.tif 000007
【図６】
2016051224.tif 000008
【図７】
2016051224.tif 000009
【図８】
2016051224.tif 000010
【図９】
2016051224.tif 000011
【図１０】
2016051224.tif 000012
【図１１】
2016051224.tif 000013
【図１２】
2016051224.tif 000014
【図１３】
2016051224.tif 000015
【図１４】
2016051224.tif 000016
【図１５】
2016051224.tif 000017