(57)【特許請求の範囲】
【請求項１】
コンピュータに、
第１のソースコードと、該第１のソースコードをカスタマイズした第２のソースコードと、該第１のソースコードとバージョンが異なる第３のソースコードとを取得し、
前記第１のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第１の呼出関係と前記第２のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第２の呼出関係との差分のノード対を抽出し、抽出した該ノード対のうち呼出元のノードを第１の集合に保持し、
前記第１の呼出関係と前記第３のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第３の呼出関係との差分のノード対を抽出し、抽出した該ノード対の呼出元及び呼出先のノードを第２の集合に保持し、
所定のルールに基づいて、前記第１の呼出関係における前記第１の集合に含まれる各ノードと、前記第３の呼出関係における前記第２の集合に含まれる各ノードとを組み合わせたノード対のそれぞれの、ノードの同一性又は呼出関係の同一性による類似度を算出し、
前記第２の集合に含まれるノードを、前記類似度の高い順に、出力する
処理を実行させるソフトウェア開発支援プログラム。
【請求項２】
前記類似度の算出において、前記組み合わせたノード対毎に、該組み合わせたノード対に含まれるノード同士、該組み合わせたノード対の各ノードの呼出元のノード同士、及び該組み合わせたノード対の各ノードの呼出先のノード同士を比較し、比較したノード対のそれぞれが、同一ノードであるか否か、同一のインタフェースを実装したメソッドであるか否か、またはメソッド名が同一であるか否かに応じて類似度の値が規定されている前記所定のルールに基づいて、比較したノード対のそれぞれに該類似度を付与し、該比較したノード対のそれぞれに付与された類似度の合計値を前記組み合わせたノード対の類似度とする
ことを特徴とする請求項１に記載のソフトウェア開発支援プログラム。
【請求項３】
前記出力において、前記第２の集合に含まれるノードを修正候補箇所として出力すると共に、前記第１の集合のうち、前記組み合わせたノード対に含まれる呼出元のノードであって、前記第１の呼出関係と前記第２の呼出関係との差分のノード対のうち該呼出元のノードに対応する呼出先のノードを、前記修正候補箇所に対する修正反映対象として出力する
ことを特徴とする請求項１または２に記載のソフトウェア開発支援プログラム。
【請求項４】
第１のソースコードと、該第１のソースコードをカスタマイズした第２のソースコードと、該第１のソースコードとバージョンが異なる第３のソースコードとを取得する取得部と、
前記第１のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第１の呼出関係と前記第２のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第２の呼出関係との差分のノード対を抽出し、抽出した該ノード対のうち呼出元のノードを第１の集合に保持する第１の抽出部と、
前記第１の呼出関係と前記第３のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第３の呼出関係との差分のノード対を抽出し、抽出した該ノード対の呼出元及び呼出先のノードを第２の集合に保持する第２の抽出部と、
所定のルールに基づいて、前記第１の呼出関係における前記第１の集合に含まれる各ノードと、前記第３の呼出関係における前記第２の集合に含まれる各ノードとを組み合わせたノード対のそれぞれの、ノードの同一性又は呼出関係の同一性による類似度を算出する算出部と、
前記第２の集合に含まれるノードを、前記類似度の高い順に、出力する出力制御部と、
を備えることを特徴とするソフトウェア開発支援装置。
【請求項５】
コンピュータが、
第１のソースコードと、該第１のソースコードをカスタマイズした第２のソースコードと、該第１のソースコードとバージョンが異なる第３のソースコードとを取得し、
前記第１のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第１の呼出関係と前記第２のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第２の呼出関係との差分のノード対を抽出し、抽出した該ノード対のうち呼出元のノードを第１の集合に保持し、
前記第１の呼出関係と前記第３のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第３の呼出関係との差分のノード対を抽出し、抽出した該ノード対の呼出元及び呼出先のノードを第２の集合に保持し、
所定のルールに基づいて、前記第１の呼出関係における前記第１の集合に含まれる各ノードと、前記第３の呼出関係における前記第２の集合に含まれる各ノードとを組み合わせたノード対のそれぞれの、ノードの同一性又は呼出関係の同一性による類似度を算出し、
前記第２の集合に含まれるノードを、前記類似度の高い順に、出力する
処理を実行するソフトウェア開発支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書は、ソフトウェア開発支援プログラム、ソフトウェア開発支援装置、及びソフトウェア開発支援方法に関する。
【背景技術】
【０００２】
ソフトウェア開発では、効率よく作業を行うために、様々なソフトウェア開発支援技術が利用されている。
【０００３】
例えば、第１の技術として、機能を担当する実行プログラムとソースプログラムコード間の関係を自動抽出し、ソースプログラムコード変更による他機能への影響範囲を漏れなく且つ見やすい形で開発者に提示する技術がある（例えば、特許文献１）。
【０００４】
第２の技術として、プログラム中の類似箇所を特定する技術がある（例えば、特許文献２）。
【０００５】
第３の技術として、ソースコードのバージョンアップ、特にソースコードの元ファイルから派生した２つの派生ファイルの一方に、もう一方のファイルの変更箇所を取り込んで新バージョンを作成する技術がある（例えば、特許文献３）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−１２２７５４号公報
【特許文献２】特開２００９−１９９１７２号公報
【特許文献３】特開平０９−０８１３７１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
近年、オープンソースソフトウェア（ＯＳＳ）など外部で管理されているソースコードを利用してソフトウェア開発が行われることが増えている。この場合、ＯＳＳに対して独自のカスタマイズを施して、そのＯＳＳを利用することになる。そのＯＳＳのバージョンアップがされる場合、カスタマイズしたＯＳＳにそのバージョンアップの内容を反映する必要がある。
【０００８】
ところが、ソースコード内の機能の呼出関係を考慮しないでカスタマイズしたＯＳＳにそのバージョンアップの内容を反映しようと修正すると、修正漏れが発生するおそれがある。
【０００９】
このとき、第１の技術を用いることが考えられる。第１の技術では、指定された関数を呼び出している関数を順に探索することで、すべての経路上に存在する関数を色替えにより明示している。
【００１０】
しかしながら、第１の技術では、指定された関数の影響範囲を一律に特定するだけなので、実際に修正すべき確度の高い箇所を把握することができない。また、第１の技術では、バージョン変更前後のソースコードの影響範囲は特定できても、カスタマイズしたＯＳＳにそのバージョンアップの内容を反映する場合に修正候補箇所を検出することはできない。
【００１１】
本発明の一側面として、カスタマイズした基準ソースコードに対して、その基準ソースコードのバージョン変更による変更箇所を反映する場合に、変更すべき確度に基づいて修正候補箇所を提示する技術を提供する。
【課題を解決するための手段】
【００１２】
本発明の一側面に係るソフトウェア開発支援プログラムは、コンピュータに、次の処理を実行させる。コンピュータは、第１のソースコードと、第１のソースコードをカスタマイズした第２のソースコードと、第１のソースコードとバージョンが異なる第３のソースコードとを取得する。コンピュータは、第１のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第１の呼出関係と第２のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第２の呼出関係との差分のノード対を抽出する。コンピュータは、抽出したノード対のうち呼出元のノードを第１の集合に保持する。コンピュータは、第１の呼出関係と第３のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする第３の呼出関係との差分のノード対を抽出する。コンピュータは、抽出したノード対の呼出元及び呼出先のノードを第２の集合に保持する。コンピュータは、所定のルールに基づいて、第１の呼出関係における第１の集合に含まれる各ノードと、第３の呼出関係における第２の集合に含まれる各ノードとを組み合わせたノード対のそれぞれの、ノードの同一性又は呼出関係の同一性による類似度を算出する。コンピュータは、第２の集合に含まれるノードを、類似度の高い順に、出力する。
【発明の効果】
【００１３】
本明細書に記載の技術によれば、カスタマイズした基準ソースコードに対して、その基準ソースコードのバージョン変更による変更箇所を反映する場合に、変更すべき確度に基づいて修正候補箇所を提示することができる。
【図面の簡単な説明】
【００１４】
【図１】メソッドの呼出関係について説明するための図である。
【図２】ソフトウェアの版更新に応じてカスタマイズしたソフトウェアの版を更新することについて説明するための図である。
【図３】ソースコードのカスタマイズ後に、ソースコードが更新されてメソッドの呼出元が変更されて修正漏れが発生してしまう場合について説明するための図である。
【図４】図３において本来得られるべき結果のソースコードｖ２ｃを示す。
【図５】本実施形態における処理を説明するための図である。
【図６】本実施形態におけるソフトウェア開発支援装置の一例を示す。
【図７】本実施形態における変更箇所検出装置の一例を示す。
【図８】本実施形態におけるソースコード取得部により取得されるソースコードｖ１，ｖ１ｃ，ｖ２の一例を示す。
【図９】本実施形態における呼出関係生成部により生成されるメソッドの呼出関係グラフの一例を示す。
【図１０】本実施形態における置換元抽出部の処理を説明するための図である。
【図１１】本実施形態における置換先抽出部の処理を説明するための図である。
【図１２】本実施形態における類似度算出部の処理を説明するための図である。
【図１３】本実施形態における類似度情報の一例を示す。
【図１４】本実施形態における出力結果部による出力例を示す。
【図１５】本実施形態の他の例における出力結果部による出力例を示す。
【図１６】本実施形態における全体の処理のフローチャートを示す。
【図１７】Ｓ３の処理の詳細フローチャートである。
【図１８】Ｓ４の処理の詳細フローチャートである。
【図１９】Ｓ５の処理の詳細フローチャートである。
【図２０】Ｓ５−３の処理の詳細フローチャートである。
【図２１】本実施形態におけるプログラムを実行するコンピュータのハードウェア環境の構成ブロック図の一例である。
【発明を実施するための形態】
【００１５】
図１は、メソッドの呼出関係について説明するための図である。ソースコード１を解析することにより、ソースコード１に含まれるメソッド名（２−１，２−２，２−３）をノード、メソッドから別のメソッドを呼び出す呼出関係（３−１，３−２）をエッジと捉えた有向グラフを得られることができる。
【００１６】
図２は、ソフトウェアの版更新に応じてカスタマイズしたソフトウェアの版を更新することについて説明するための図である。なお、以下では、説明の便宜上、バージョンアップを例に説明するが、用語「バージョンアップ」を「バージョンダウン」に置き換えてもよい。
【００１７】
図２において、ｖ１は、更新前のソースコースのバージョンを示す。ｖ１ｃは、ソースコードｖ１のカスタマイズ後のソースコードのバージョンを示す。ｖ２は、ソースコードｖ１の更新後のソースコードのバージョンを示す。ｖ２ｃは、カスタマイズ後のソースコードｖ１ｃに、ソースコードｖ２へのバージョンアップを反映したバージョンを示す。
【００１８】
ＯＳＳなど外部で管理されているソースコードｖ１を利用する際に、機能の追加を行うなどソースコードｖ１の中身に手を加えたカスタム版ソースコースｖ１ｃを利用することがある（Ｓ１０１）。
【００１９】
ソースコードｖ１の中身に手を加えた後でＯＳＳが更新される（Ｓ１０２）と、カスタム版ソースコードｖ１ｃもＯＳＳの更新に併せて更新される場合がある（Ｓ１０３）。
【００２０】
この時、ＯＳＳ利用者は、まず２つのファイル間の相違点を検出するdiffツール等を用いて、ソースコードｖ１とｖ２との相違点を検出することによりＳ１０２にて変更された箇所を調べる。ＯＳＳ利用者は、Ｓ１０２で変更された箇所を、Ｓ１０３にてカスタム版のソースコードｖ１ｃに反映することが考えられる。例えばgit mergetoolを用いれば、この作業を自動的に行うことができる。
【００２１】
しかしながら、git mergetoolのような既存手法では、図３で説明するように、メソッドの呼出元が変わった場合に修正の漏れが発生してしまうことがある。
【００２２】
図３は、ソースコードのカスタマイズ後に、ソースコードが更新されてメソッドの呼出元が変更されて修正漏れが発生してしまう場合について説明するための図である。
【００２３】
例えば、ソースコードｖ１について、クラスBに機能cを加えるカスタマイズを行い、そのカスタマイズしたメソッドB.cをクラスAのメソッドA.aから呼び出すように修正したとする（Ｓ１０１ａ）。
【００２４】
その後、ソースコードｖ１について、NewAという新クラスのメソッドをMainから呼び出すように更新されたとする（Ｓ１０２ａ）。このとき、Class AとClassBはv１のままであるとする。
【００２５】
git mergetoolを用いて、ソースコードｖ１とｖ２との相違点を検出することによりＳ１０２ａにて変更された箇所を検出し、検出した変更箇所をソースコードｖ１ｃに反映する（Ｓ１０３ａ）。ここで、クラスＡとクラスＢとは、ソースコードｖ１ｃのままである。
【００２６】
しかしながら、図４に示すように、本来、クラスNewAのメソッドaにメソッドB.cの機能を組み込まないといけないが、マージツールではそれを検出することが出来ない。
【００２７】
図４は、図３において本来得られるべき結果のソースコードｖ２ｃを示す。ソースコースｖ1からｖ1ｃを作成する際に手を加えたメソッドA.aからメソッドB.cを呼び出す処理を、ソースコードｖ２からｖ２ｃを作成する際のクラスNewA.aに対して反映できるようにすることが望まれる。
【００２８】
このように、ソースコードの更新に伴ってカスタマイズしたソースコードの修正が必要となるファイル（クラスやメソッド）を適切に抽出することが望まれる。
【００２９】
そこで、本実施形態では、カスタマイズした基準ソースコードに対して、その基準ソースコードのバージョン変更（バージョンのアップクレードまたはダウングレードを含む）の内容を反映する場合に、修正すべき確度に基づいて修正候補箇所を提示する技術を提供する。以下では、ソフトウェアのバージョン間の差分から修正が必要な箇所を検出し、より具体的には、差分を抽出する際にメソッドの呼出関係を利用する技術について説明する。
【００３０】
図５は、本実施形態における処理を説明するための図である。まず、本実施形態におけるソフトウェア開発支援装置は、ソースコードの各版（ｖ１，ｖ１ｃ，ｖ２）におけるメソッドの呼出関係グラフを構築する。次に、図５（Ａ）に示すように、ソフトウェア開発支援装置は、ソースコードｖ１とｖ１ｃとの呼出関係の比較から差のあるエッジの呼出元ノードを注意すべきノードとして印を付ける。
【００３１】
次に、図５（Ｂ）に示すように、ソフトウェア開発支援装置は、ソースコードｖ１とｖ２との呼出関係を比較する。ソフトウェア開発支援装置は、以下の判断手法に基づいて、新たに追加されたエッジに含まれるノード（呼出元ノード、呼出先ノード）と上記印を付けたノードとの類似度を調べる。ソフトウェア開発支援装置は、類似度の高いノードを変更箇所候補として出力する。
【００３２】
ここで、ソフトウェア開発支援装置は、以下を判断要素として類似度の高低を算出する。以下の判断要素が満たされるものが多いほど類似度が高いといえる。
【００３３】
（I）着目している各ノード（新たに追加されたエッジに含まれる呼出元ノード・呼出先ノード、印したノード）（自身のノード）に対する、呼出元のノード同士及び呼出先のノード同士それぞれが、以下のいずれかを満たす。ここで、呼出元のノード同士、または呼出先のノード同士を「比較するノード同士」と称する。
・比較するノード同士が、同一ノードである。
・比較するノード同士が、同一のインタフェースを実装したメソッドである。
・比較するノード同士のメソッド名が同じである。
【００３４】
（II）着目しているノード同士（自身のノード同士）が以下のいずれかを満たす。
・着目しているノード同士が、同一のインタフェースを実装したメソッドである。
・着目しているノード同士のメソッド名が同じである。
【００３５】
図６は、本実施形態におけるソフトウェア開発支援装置の一例を示す。ソフトウェア開発支援装置１１は、取得部１２、第１の抽出部１３、第２の抽出部１４、算出部１５、出力制御部１６を含む。
取得部１２は、第１のソースコードと、第１のソースコードをカスタマイズした第２のソースコードと、第１のソースコードとバージョンが異なる第３のソースコードとを取得する。取得部１２の一例として、ソースコード取得部２２が挙げられる。
【００３６】
第１の抽出部１３は、第１の呼出関係と第２の呼出関係との差分のノード対を抽出する。第１の呼出関係は、第１のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする呼出関係である。第２の呼出関係は、第２のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする呼出関係である。第１の抽出部１３は、抽出した該ノード対のうち呼出元のノードを第１の集合に保持する。第１の抽出部１３の一例として、置換元抽出部２４が挙げられる。
【００３７】
第２の抽出部１４は、第１の呼出関係と第３の呼出関係との差分のノード対を抽出する。第３の呼出関係は、第３のソースコードに含まれる機能の呼出元及び呼出先を対のノードとする呼出関係である。第２の抽出部１４は、抽出したノード対の呼出元及び呼出先のノードを第２の集合に保持する。第２の抽出部１４の一例として、置換先抽出部２５が挙げられる。
【００３８】
算出部１５は、所定のルールに基づいて、第１の呼出関係における第１の集合に含まれる各ノードと、第３の呼出関係における第２の集合に含まれる各ノードとを組み合わせたノード対のそれぞれの類似度を算出する。算出部１５の一例として、類似度算出部２６が挙げられる。
【００３９】
出力制御部１６は、第２の集合に含まれるノードを、類似度の高い順に、出力する。出力制御部１６の一例として、結果出力部２７が挙げられる。
【００４０】
このように構成することにより、カスタマイズした基準ソースコードに対して、その基準ソースコードのバージョン変更による変更箇所を反映する場合に、変更すべき確度に基づいて修正候補箇所を提示することができる。
【００４１】
また、算出部１５は、組み合わせたノード対毎に、組み合わせたノード対に含まれるノード同士、組み合わせたノード対の各ノードの呼出元のノード同士、及び組み合わせたノード対の各ノードの呼出先のノード同士を比較する。算出部１５は、所定のルールに基づいて、比較したノード対のそれぞれに該類似度を付与し、該比較したノード対のそれぞれに付与された類似度の合計値を前記組み合わせたノード対の類似度とする。所定のルールには、比較したノード対のそれぞれが、同一ノードであるか否か、同一のインタフェースを実装したメソッドであるか否か、またはメソッド名が同一であるか否かに応じて類似度の値が規定されている。
【００４２】
このように構成することにより、第１のソースコードを基準として、第２のソースコードと第３のソースコードとの類似性を判定することができる。
【００４３】
出力部１６は、第２の集合に含まれるノードを修正候補箇所として出力する。それと共に、出力部１６は、第１の集合のうち、組み合わせたノード対に含まれる呼出元のノードであって、第１の呼出関係と第２の呼出関係との差分のノード対のうち呼出元のノードに対応する呼出先のノードを、修正候補箇所に対する修正反映対象として出力する。
【００４４】
このように構成することにより、修正候補箇所に対する修正反映対象を出力することができる。
【００４５】
図７は、本実施形態における変更箇所検出装置の一例を示す。変更箇所検出装置２１は、入力インタフェース（Ｉ／Ｆ）２８、出力Ｉ／Ｆ２９と接続されている。入力Ｉ／Ｆ２８は、キーボード等の入力装置である。出力Ｉ／Ｆ２９は、ディスプレイ装置等の出力装置である。
【００４６】
変更箇所検出装置２１は、記憶部（不図示）を含む。記憶部（不図示）は、ｖ１呼出関係情報３１、ｖ１ｃ呼出関係情報３２、ｖ２呼出関係情報３３、ｖ１−ｖ１ｃ変更内容３４、ｖ１−ｖ２変更内容３５、置換元情報３６、置換先情報３７、類似度情報３８、閾値情報３９を格納する。
【００４７】
変更箇所検出装置２１は、ソースコード取得部２２、呼出関係生成部２３、置換元抽出部２４、置換先抽出部２５、類似度算出部２６、結果出力部２７を含む。
【００４８】
ソースコード取得部２２は、入力Ｉ／Ｆ２８により入力されたソースコードｖ１，ｖ１ｃ，ｖ２を取得する。
【００４９】
呼出関係生成部２３は、ソースコードｖ１，ｖ１ｃ，ｖ２毎に、ソースコードからメソッドの呼出関係を構築し、ｖ１呼出関係情報３１、ｖ１ｃ呼出関係情報３２、ｖ２呼出関係情報３３を生成する。
【００５０】
置換元抽出部２４は、元の版のソースコードｖ１の呼出関係（ｖ１呼出関係情報３１）とカスタマイズされた版のソースコードｖ１ｃの呼出関係（ｖ１ｃ呼出関係情報３２）の差分をｖ１−ｖ１ｃ変更内容３４として取得する。置換元抽出部２４は、ｖ１−ｖ１ｃ変更内容３４に基づいて、変更のあったエッジの呼出元を注意箇所（置換元情報３６）として記録する。
【００５１】
置換先抽出部２５は、元の版のソースコードｖ１の呼出関係（ｖ１呼出関係情報３１）と更新された版のソースコードｖ２の呼出関係との差分をｖ１−ｖ２変更内容３５として取得する。置換先抽出部２５は、ｖ１−ｖ２変更内容３５に基づいて、更新された版で追加されたメソッドを検出候補箇所（置換先情報３７）として記録する。
【００５２】
類似度算出部２６は、置換元抽出部２４と置換先抽出部２５とにより得られたメソッドの類似度を算出する。
【００５３】
結果出力部２７は、事前に設定した閾値を越えた類似度を保持する置換先情報３７が置換対象であることを通知する。さらに、結果出力部２７は、類似度が高い順に置換候補を一覧化する。
【００５４】
これにより、置換元抽出部２４で呼出関係の差分の変化を捉えてマーキングしておくことで元のソースコードｖ１の更新時に変更が無くても注意すべき箇所として認識することができる。また、置換先抽出部２５と類似度算出部２６により置換元抽出部２４で得た箇所を反映するかどうかを判別する事ができるようになる。
【００５５】
図８は、本実施形態におけるソースコード取得部により取得されるソースコードｖ１，ｖ１ｃ，ｖ２の一例を示す。ソースコード取得部２２は、入力Ｉ／Ｆ２８により入力された３つのバージョンのソースコードｖ１，ｖ１ｃ，ｖ２を取得する。
【００５６】
図９は、本実施形態における呼出関係生成部により生成されるメソッドの呼出関係グラフの一例を示す。図９では、メソッドの呼出元から呼出先に向かって矢印が示されている。
【００５７】
呼出関係生成部２３は、取得されたソースコード（ｖ１，ｖ１ｃ，ｖ２）毎に、メソッドの呼出関係グラフ（ｖ１呼出関係情報３１、ｖ１ｃ呼出関係情報３２、ｖ２呼出関係情報３３）を構築する。
【００５８】
ｖ１呼出関係情報３１は、メソッド「Main.main()」からメソッド「A.a()」が呼び出され、メソッド「A.a()」からメソッド「B.b()」が呼び出されている関係情報を保持する。
【００５９】
ｖ１ｃ呼出関係情報３２は、メソッド「Main.main()」からメソッド「A.a()」が呼び出され、メソッド「A.a()」からメソッド「B.b()」及び「B.c()」が呼び出されている関係情報を保持する。
【００６０】
ｖ２呼出関係情報３３は、メソッド「Main.main()」からメソッド「NewA.a()」が呼び出され、メソッド「NewA.a()」とメソッド「A.a()」のそれぞれからメソッド「B.b()」が呼び出されている関係情報を保持する。
【００６１】
なお、本実施形態の説明では分かりやすさのために呼出関係グラフを図として表現しているが、計算機が処理可能とするために、例えば以下のように呼出元、呼出先のペアのリストとして呼出関係グラフを保持してもよい。以下の例は、図９のｖ２呼出関係情報３３を呼出元・呼出先のペアのリストとしたものである。
[<Main.main(), NewA.a()>,
<NewA.a(), B.b()>, 
<A.a(), B.b()>]
【００６２】
図１０は、本実施形態における置換元抽出部の処理を説明するための図である。置換元抽出部２４は、生成された呼出関係（ｖ１呼出関係情報３１、ｖ１ｃ呼出関係情報３２）に基づいて、ソースコードｖ１，ｖ１ｃの呼出関係の比較を行い、内容に差のあるエッジの呼出元ノードを置換元情報３６として保持する。
【００６３】
図１０の例では、置換元抽出部２４は、ｖ１呼出関係情報３１と、ｖ１ｃ呼出関係情報３２とを比較し、ｖ１−ｖ１ｃ変更内容３４として、追加された呼出関係：A.a -> B.c、削除された呼出関係：無し、を取得する。置換元抽出部２４は、ｖ１−ｖ１ｃ変更内容３４から、内容に差のあるエッジ（A.a -> B.c）の呼出元ノードA.aを置換元情報３６として保持する。
【００６４】
図１１は、本実施形態における置換先抽出部の処理を説明するための図である。置換先抽出部２５は、ｖ１呼出関係情報３１、ｖ２呼出関係情報３３に基づいて、ソースコードｖ１，ｖ２の呼出関係の比較を行い、新たに追加されたエッジに含まれるノードを置換先情報３７として保持する。
【００６５】
置換先抽出部２５は、置換元抽出部２４によるソースコードｖ１，ｖ１ｃの呼出関係の比較と同様の手法で、ソースコードｖ１とｖ２の呼出関係の変更内容を得て、新たに追加されたエッジに含まれるノードを置換先情報として保持する。
【００６６】
図１１の例では、置換先抽出部２５は、ｖ１呼出関係情報３１と、ｖ２呼出関係情報３３とを比較し、ｖ１−ｖ２変更内容３５として、追加された呼出関係：Main.main -> NewA.a、NewA.a -> B.b、削除された呼出関係：Main.main -> A.aを取得する。
【００６７】
置換先抽出部２５は、ｖ１−ｖ２変更内容３５から、新たに追加されたエッジに含まれるノードMain.main、NewA.a、B.bを置換先情報３７として保持する。
【００６８】
図１２は、本実施形態における類似度算出部の処理を説明するための図である。類似度算出部２６は、ｖ１呼出関係情報３１における置換元情報３６の各メソッドと、ｖ２呼出関係情報３３における置換先情報３７の各メソッドとの類似度を算出し、図１３に示すように類似度情報３８として保持する。
【００６９】
類似度は、（１）呼出元のノードの比較、（２）呼出先のノードの比較、（３）自身のノードの比較の３つの観点から、算出され、その総和とする。
【００７０】
ノードの比較内容は、以下の通りである。
（i）同一ノードである（上記（３）のみ実質発生しない）
（ii）同一のインタフェースを実装したメソッドである。
（iii）メソッド名が同じである。
【００７１】
比較内容の若い番号ほど類似度が高く、例えば、それぞれ３点、２点、１点と設定されているとする。
【００７２】
図１２では、置換元情報３６はメソッド「A.a」を含む。置換先情報３７は、メソッド「Main.main」、「NewA.a」、「B.b」を含む。ここでは、ｖ１呼出関係情報３１における各ノード（A.a）と、ｖ２呼出関係情報３３における各ノード（Main.main、NewA.a、B.b）とが比較される。
【００７３】
まずは、ｖ１呼出関係情報３１におけるノード（A.a）４２とｖ２呼出関係情報３３におけるノード（Main.main）４４との比較について説明する。ｖ１呼出関係情報３１のノード（A.a）４２に着目すると、ノード（A.a）４２の呼出元ノードはノード（Main.main）４１であり、呼出先ノードはノード（B.b）４３であり、自身はノード（A.a）４２である。
【００７４】
一方、ｖ２呼出関係情報３３のノード（Main.main）４４に着目すると、ノード（Main.main）４４の呼出元ノードは存在せず、呼出先ノードはノード（NewA.a）４５であり、自身はノード（Main.main）４４である。
【００７５】
ｖ１呼出関係情報３１におけるノード（A.a）４２とｖ２呼出関係情報３３におけるノード（Main.main）４４との呼出元ノードを比較する。ノード（A.a）４２の呼出元ノードがノード（Main.main）４１であるのに対して、ノード（Main.main）４４の呼出元ノードは存在しないから、上記(i)(ii)(iii)に該当せず、加点はされない。
【００７６】
呼出先ノードを比較すると、ノード（B.b）４３とノード（NewA.a）４５であり、上記(i)(ii)(iii)に該当せず、加点はされない。
【００７７】
自身のノードを比較すると、ノード（A.a）４２とノード（Main.main）４４であり、上記(i)(ii)(iii)に該当せず、加点はされない。
【００７８】
次に、ｖ１呼出関係情報３１におけるノード（A.a）とｖ２呼出関係情報３３におけるノード（NewA.a）との比較について説明する。上述の通り、ｖ１呼出関係情報３１のノード（A.a）４２について、呼出元ノードは、ノード（Main.main）４１、呼出先ノードは、ノード（B.b）４３、自身のノードは、ノード（A.a）４２である。
【００７９】
一方、ｖ２呼出関係情報３３のノード（NewA.a）４５に着目すると、ノード（NewA.a）４５の呼出元ノードはノード（Main.main）４４であり、呼出先ノードはノード（B,b）４７であり、自身はノード（NewA.a）４５である。
【００８０】
ｖ１呼出関係情報３１におけるノード（A.a）とｖ２呼出関係情報３３におけるノード（Main.main）との呼出元ノードを比較すると、ノード（Main.main）４１とノード（Main.main）４４であり、同一ノードである（上記(i)に該当する）。この場合、３点加算される。
【００８１】
呼出先ノードを比較すると、ノード（B.b）４３とノード（B.b）４７であり、同一ノードである（上記(i)に該当する）。この場合、３点加算される。
【００８２】
自身のノードを比較すると、ノード（A.a）４２とノード（NewA.a）４５であり、同一のメソッド名である（上記(iii)に該当する）。この場合、１点加算される。
【００８３】
ｖ１呼出関係情報３１におけるノード（A.a）４２とｖ２呼出関係情報３３におけるノード（B.b）４７との比較についても、同様に行う。
【００８４】
なお、比較内容に応じた点数の妥当性はアプリケーションプログラムの領域によっても変わる可能性があり、変更しても良い。また、呼出元や呼出先が複数ある場合は、それぞれに対して算出し最も高いものを類似度とする。
【００８５】
図１３は、本実施形態における類似度情報の一例を示す。類似度情報３８は、ｖ１呼出関係情報３１における置換元情報３６の各ノードと、ｖ２呼出関係情報３３における置換先情報３７の各ノードとの組合わせ毎に、呼出元ノード同士、呼出先ノード同士、自身のノード同士の比較結果に応じて算出された類似度を保持する。
【００８６】
ｖ１呼出関係情報３１におけるノード（A.a）４２とｖ２呼出関係情報３３におけるノード（Main.main）４４について、図１２で述べたように、呼出元ノード同士、呼出先ノード同士、自身のノード同士の比較結果、いずれも上記(i)(ii)(iii)に該当せず、０点である。したがって、この場合も合計値も０点となる。
【００８７】
ｖ１呼出関係情報３１におけるノード（A.a）４２とｖ２呼出関係情報３３におけるノード（NewA.a）４５については、図１２で述べたとおりである。すなわち、呼出元ノード同士は同一ノードであり（３点加算）、呼出先ノード同士は同一ノードであり（３点加算）自身のノード同士は同一メソッド名である（１点加算）。その結果、合計値は７点となる。
【００８８】
ｖ１呼出関係情報３１におけるノード（A.a）４２とｖ２呼出関係情報３３におけるノード（B.b）４７について、図１２で述べたように、呼出元ノード同士、呼出先ノード同士、自身のノード同士の比較結果、いずれも上記(i)(ii)(iii)に該当せず、０点である。したがって、この場合も合計値も０点となる。
【００８９】
結果出力部２７は、類似度情報の合計値が予め設定された閾値以上であるペアのｖ２呼出関係情報３３側のノードを修正候補箇所とする。閾値は、閾値情報３９として予め登録されている。
【００９０】
例えば、閾値として６が設定されている。この場合、類似度情報の合計値が閾値以上のペアは、ノード（A.a）とノード（NewA.a）であり、このうちｖ２呼出関係情報３３側のノードはノード（NewA.a）である。したがって、ノード（NewA.a）が修正候補箇所となる。
【００９１】
また、図１０に示すように、ｖ１−ｖ１ｃ変更内容３４のうち、閾値以上であるペアのｖ１側のノードが含まれる呼出先側のノード（B.c）が修正反映対象となる。
【００９２】
図１４は、本実施形態における出力結果部による出力例を示す。図１４（Ａ）に示すように、結果出力部２７は、上述で得られた修正候補箇所５１ａを出力する。また、図１４（Ｂ）に示すように、結果出力部２７は、上述で得られた修正候補箇所及び修正反映対象に基づいて、図１４に示すように修正候補箇所に対して修正反映対象に関する修正が必要である旨を示す情報５２ａを出力する。なお、上記では、結果出力部２７は、類似度情報の合計値が予め設定された閾値以上であるペアのｖ２呼出関係情報３３側のノードを修正候補箇所としたが、類似度情報の合計値が最も高いペアのｖ２呼出関係情報３３側のノードを修正候補箇所としてもよい。
【００９３】
図１５は、本実施形態の他の例における出力結果部による出力例を示す。まず、出力結果部２７は、類似度情報の合計値が予め設定された閾値以上であるペアのｖ２呼出関係情報３３側の複数のノードを修正候補箇所とする。
【００９４】
それから、図１５（Ａ）に示すように、結果出力部２７は、類似度の合計値の高い順に、その複数の修正候補箇所を並べて格納した置換候補リスト５１ｂを出力する。置換候補リスト５１ｂでは、類似度が閾値以上の修正候補箇所について、より類似度の合計値の高い修正候補箇所が、より優先順位が高くなるように登録されている。なお、設計仕様によっては、類似度情報の合計値を閾値で足切りしなくてもよい。
【００９５】
また、結果出力部２７は、置換候補リスト５１ｂに登録された各修正候補箇所に対応する修正反映対象を取得する。そして、結果出力部２７は、修正候補箇所及び修正反映対象に基づいて、図１５（Ｂ）に示すように修正候補箇所に対して修正反映対象に関する修正が必要である旨を示す情報５２ｂを優先順位順に出力してもよい。
【００９６】
図１６は、本実施形態における全体の処理のフローチャートを示す。ソースコード取得部２２は、図８で説明したように、ソースコードｖ１，ｖ１ｃ，ｖ２を取得する（Ｓ１）。
【００９７】
呼出関係生成部２３は、図９で説明したように、ソースコードｖ１，ｖ１ｃ，ｖ２それぞれの呼出関係情報（ｖ１呼出関係情報３１、ｖ１ｃ呼出関係情報３２、ｖ２呼出関係情報３３）を生成する（Ｓ２）。
【００９８】
置換元抽出部２４は、図１０で説明したように、ｖ１呼出関係情報３１と、ｖ１ｃ呼出関係情報３２との比較から、置換元情報３６を抽出する（Ｓ３）。Ｓ３の詳細については、図１７で説明する。
【００９９】
置換先抽出部２５は、図１１で説明したように、ｖ１呼出関係情報３１とｖ２呼出関係情報３３との比較から置換先情報を抽出する（Ｓ４）。Ｓ４の詳細については、図１８で説明する。
【０１００】
類似度算出部２６は、図１２で説明したように、ｖ１呼出関係情報３１における置換元情報の各メソッドと、ｖ２呼出関係情報３３における置換先情報の各メソッドとの類似度を算出する（Ｓ５）。Ｓ５の詳細については、図１９、図２０で説明する。
【０１０１】
結果出力部２７は、図１５（Ａ）で説明したように、類似度が閾値以上のすべての置換先情報のメソッドを類似度の高い順に配置した置換候補リスト５１ｂを出力する（Ｓ６）。さらに、結果出力部２７は、置換候補リスト５１ｂに登録された各修正候補箇所に対応する修正反映対象を取得する。そして、結果出力部２７は、修正候補箇所及び修正反映対象に基づいて、図１５（Ｂ）に示すように修正候補箇所に対して修正反映対象に関する修正が必要である旨を示す情報５２ｂを優先順位順に出力してもよい。
【０１０２】
なお、上記Ｓ６では、図１５のケースについて出力する場合を例に説明したが、図１４のケースについて出力してもよい。
【０１０３】
図１７は、Ｓ３の処理の詳細フローチャートである。置換元抽出部２４は、ｖ１呼出関係情報３１とｖ１ｃ呼出関係情報３２とを取得する（Ｓ３−１、Ｓ３−２）。置換元抽出部２４は、ｖ１呼出関係情報３１とｖ１ｃ呼出関係情報３２とを比較する（Ｓ３−３）。
【０１０４】
置換先抽出部２５は、ｖ１呼出関係情報３１とｖ１ｃ呼出関係情報３２との差分のエッジがあるか否かを判定する（Ｓ３−４）。ｖ１呼出関係情報３１とｖ１ｃ呼出関係情報３２との差分のエッジがない場合（Ｓ３−４で「ＮＯ」）、本フローは終了する。
【０１０５】
ｖ１呼出関係情報３１とｖ１ｃ呼出関係情報３２との差分のエッジがある場合（Ｓ３−４で「ＹＥＳ」）、置換元抽出部２４は、その差分エッジをｖ１−ｖ１ｃ変更内容３４として抽出する（Ｓ３−５）。
【０１０６】
置換元抽出部２４は、抽出した差分エッジの起点側のノードを置換元情報３６として記憶部に格納する（Ｓ３−６）。
【０１０７】
図１８は、Ｓ４の処理の詳細フローチャートである。置換先抽出部２５は、ｖ１呼出関係情報３１とｖ２呼出関係情報３３とを取得する（Ｓ４−１、Ｓ４−２）。
【０１０８】
置換先抽出部２５は、ｖ１呼出関係情報３１とｖ２呼出関係情報３３を比較する（Ｓ４−３）。ｖ１呼出関係情報３１とｖ２呼出関係情報３３との差分のエッジがある場合、置換先抽出部２５は、差分エッジをｖ１−ｖ２変更内容３５として抽出する（Ｓ４−４）。
【０１０９】
置換先抽出部２５は、ｖ１−ｖ２変更内容３５において、ｖ２呼出関係情報３３にのみ存在するエッジがあるか否かを判定する（Ｓ４−５）。ｖ１−ｖ２変更内容３５において、ｖ２呼出関係情報３３にのみ存在するエッジがない場合（Ｓ４−５で「ＮＯ」）、本フローは終了する。
【０１１０】
ｖ１−ｖ２変更内容３５において、ｖ２呼出関係情報３３にのみ存在するエッジがある場合（Ｓ４−５で「ＹＥＳ」）、置換先抽出部２５は、そのｖ２呼出関係情報３３にのみ存在するエッジの起点・終点双方のノードを置換先情報３７として格納する（Ｓ４−６）。
【０１１１】
図１９は、Ｓ５の処理の詳細フローチャートである。類似度算出部２６は、置換元情報３６と置換先情報３７を取得する（Ｓ５−１）。類似度算出部２６は、置換元情報３６に含まれるノードと、置換先情報３７に含まれるノードとの直積集合を求める（Ｓ５−２）。
【０１１２】
類似度算出部２６は、直積集合の全組について、類似度の算出処理を行い（Ｓ５−３）、類似度を類似度情報３８として記憶部に格納する（Ｓ５−４）。
【０１１３】
図２０は、Ｓ５−３の処理の詳細フローチャートである。類似度算出部２６は、類似度を０で初期化する（Ｓ５−３−１）。
【０１１４】
類似度算出部２６は、１組の集合に含まれる２要素それぞれの呼出元のノード（Ａ）を取得する（Ｓ５−３−２）。類似度算出部２６は、その２要素それぞれの呼出先のノード（Ｂ）を取得する（Ｓ５−３−３）。
【０１１５】
類似度算出部２６は、２要素間、呼出元のノード（Ａ）間、呼出先のノード（Ｂ）間のそれぞれについて、ノードが同一か、インタフェースが同一か、メソッドが同一かの判定を行う（Ｓ５−３−４、Ｓ５−３−６、Ｓ５−３−８）。
【０１１６】
比較する２つのノードが同一である場合、類似度算出部２６は、類似度に３を加算する（Ｓ５−３−５）。比較する２つのノードのインタフェースが同一である場合、類似度算出部２６は、類似度に２を加算する（Ｓ５−３−７）。比較する２つのノードのメソッド名が同一である場合、類似度算出部２６は、類似度に１を加算する（Ｓ５−３−５）。
【０１１７】
図２１は、本実施形態におけるプログラムを実行するコンピュータのハードウェア環境の構成ブロック図の一例である。コンピュータ６０は、ソフトウェア開発支援装置１１，変更箇所検出装置２１として機能する。コンピュータ６０は、ＣＰＵ６２、ＲＯＭ６３、ＲＡＭ６６、通信Ｉ／Ｆ６４、記憶装置６７、出力Ｉ／Ｆ６１、入力Ｉ／Ｆ６５、読取装置６８、バス６９、出力装置７１、入力装置７２によって構成されている。
【０１１８】
ここで、ＣＰＵは、中央演算装置を示す。ＲＯＭは、リードオンリメモリを示す。ＲＡＭは、ランダムアクセスメモリを示す。Ｉ／Ｆは、インタフェースを示す。バス６９には、ＣＰＵ６２、ＲＯＭ６３、ＲＡＭ６６、通信Ｉ／Ｆ６４、記憶装置６７、出力Ｉ／Ｆ６１、入力Ｉ／Ｆ６５、及び読取装置６８が接続されている。読取装置６８は、可搬型記録媒体を読み出す装置である。出力装置７１は、出力Ｉ／Ｆ６１に接続されている。入力装置７２は、入力Ｉ／Ｆ６５に接続されている。
【０１１９】
記憶装置６７としては、ハードディスク、フラッシュメモリ、磁気ディスクなど様々な形式の記憶装置を使用することができる。記憶装置６７またはＲＯＭ６３には、ＣＰＵ６２を取得部１２、第１の抽出部１３、第２の抽出部１４、算出部１５、出力制御部１６として機能させる本実施形態に係るプログラムが格納されている。より具体的には、記憶装置６７またはＲＯＭ６３には、ソースコード取得部２２、呼出関係生成部２３、置換元抽出部２４、置換先抽出部２５、類似度算出部２６、結果出力部２７として機能させる本実施形態に係るプログラムが格納されている。また、記憶装置６７には、修正候補箇所５１ａ、置換候補リスト５１ｂ、修正候補箇所に対して修正反映対象に関する修正が必要である旨を示す情報５２ａ，５２ｂが格納されてもよい。
【０１２０】
ＲＡＭ６６には、情報が一時的に記憶される。ＲＡＭ６６は、ｖ１呼出関係情報３１、ｖ１ｃ呼出関係情報３２、ｖ２呼出関係情報３３、ｖ１−ｖ１ｃ変更内容３４、ｖ１−ｖ２変更内容３５、置換元情報３６、置換先情報３７、類似度情報３８、閾値情報３９を格納する。
【０１２１】
ＣＰＵ６２は、記憶装置６７またはＲＯＭ６３から本実施形態に係るプログラムを読み出し、当該プログラムを実行する。
【０１２２】
通信Ｉ／Ｆ６４は、ネットワークと接続して他の装置と通信するためのポート等のインタフェースである。
【０１２３】
上記実施形態で説明した処理を実現するプログラムは、プログラム提供者側から通信ネットワーク７０、および通信Ｉ／Ｆ６４を介して、例えば記憶装置６７に格納されてもよい。また、上記実施形態で説明した処理を実現するプログラムは、市販され、流通している可搬型記憶媒体に格納されていてもよい。この場合、この可搬型記憶媒体は読取装置６８にセットされて、ＣＰＵ６２によってそのプログラムが読み出されて、実行されてもよい。可搬型記憶媒体としてはＣＤ−ＲＯＭ、フレキシブルディスク、光ディスク、光磁気ディスク、ＩＣカード、ＵＳＢメモリ装置、半導体メモリカードなど様々な形式の記憶媒体を使用することができる。このような記憶媒体に格納されたプログラムが読取装置６８によって読み取られる。
【０１２４】
入力装置７２には、キーボード、マウス、電子カメラ、ウェブカメラ、マイク、スキャナ、センサ、タブレット、タッチパネルなどを用いることが可能である。また、出力装置７１には、ディスプレイ、プリンタ、スピーカなどを用いることが可能である。
【０１２５】
ネットワーク７０は、インターネット、ＬＡＮ、ＷＡＮ、専用線、有線、無線等の通信網であってよい。
【０１２６】
本実施形態によれば、更新追従時に修正が必要となるファイル（クラスやメソッド）の抽出を広範囲に行えるようになる。
【０１２７】
なお、本発明は、以上に述べた実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
【符号の説明】
【０１２８】
１１    ソフトウェア開発支援装置
１２    取得部
１３    第１の抽出部
１４    第２の抽出部
１５    算出部
１６    出力制御部
２１    変更箇所検出装置
２２    ソースコード取得部
２３    呼出関係生成部
２４    置換元抽出
２５    置換先抽出部
２６    類似度算出部
２７    結果出力部
２８    入力Ｉ／Ｆ
２９    出力Ｉ／Ｆ
３１    ｖ１呼出関係情報
３２    ｖ１ｃ呼出関係情報
３３    ｖ２呼出関係情報
３４    ｖ１−ｖ１ｃ変更内容
３５    ｖ１−ｖ２変更内容
３６    置換元情報
３７    置換先情報
３８    類似度情報
３９    閾値情報
【図１】
0006507940.tif 000002
【図２】
0006507940.tif 000003
【図３】
0006507940.tif 000004
【図４】
0006507940.tif 000005
【図５】
0006507940.tif 000006
【図６】
0006507940.tif 000007
【図７】
0006507940.tif 000008
【図８】
0006507940.tif 000009
【図９】
0006507940.tif 000010
【図１０】
0006507940.tif 000011
【図１１】
0006507940.tif 000012
【図１２】
0006507940.tif 000013
【図１３】
0006507940.tif 000014
【図１４】
0006507940.tif 000015
【図１５】
0006507940.tif 000016
【図１６】
0006507940.tif 000017
【図１７】
0006507940.tif 000018
【図１８】
0006507940.tif 000019
【図１９】
0006507940.tif 000020
【図２０】
0006507940.tif 000021
【図２１】
0006507940.tif 000022