(57)【特許請求の範囲】
【請求項１】
ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成する生成部と、
前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、前記生成部によって生成されたエンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように配置する配置部と、
前記配置部によって配置された配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替える入替部と、
前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、前記入替部による入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断する判断部と、
前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定する設定部と、
前記判断部により前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定する決定部と、
前記設定部によって設定された分類情報を、前記決定部によって割当対象に決定された配置結果内の各図形が示すエンティティに割り当てる割当部と、
前記割当部による割当結果を出力する出力部と、
を有することを特徴とする分析支援装置。
【請求項２】
前記入替部は、
前記決定部によって決定された配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替えることを特徴とする請求項１に記載の分析支援装置。
【請求項３】
前記生成部は、
前記分割エンティティ群からの出次数が０のエンティティの削除と当該削除後の分割エンティティ群の各エンティティの出次数および入次数の再計算とを、出次数が０のエンティティが出現しなくなるまで実行する第１の削除処理と、
前記第１の削除処理後の分割エンティティ群からの入次数が０のエンティティの削除と当該削除後の分割エンティティ群についての前記第１の削除処理の実行とを、入次数が０のエンティティが出現しなくなるまで実行する第２の削除処理と、を実行し、
前記第２の削除処理において入次数が０のエンティティが存在しない場合、残存するエンティティを上位に配列させ、前記第１の削除処理により先に削除されたエンティティほど下位に配列させることにより、前記エンティティ列を生成することを特徴とする請求項１または２に記載の分析支援装置。
【請求項４】
前記生成部は、
前記第１の削除処理または前記第２の削除処理において削除されるまでに削除から除外された除外回数をエンティティごとに計数し、計数された前記除外回数の多さに応じた前記平面に交差する第３軸の値を各エンティティに対応付け、
前記配置部は、
前記配置結果内の各図形が示すエンティティに対応付けられた前記第３軸の値に基づいて、前記各図形を前記第３軸の方向に伸ばした立体図形に変換した配置結果を生成することを特徴とする請求項３に記載の分析支援装置。
【請求項５】
前記ソフトウェアの構成要素であるエンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記ソフトウェアの対応情報を参照して、前記ソフトウェアの対応情報により特定される前記依存関係の重要度を示す重みに基づいて、前記依存関係の重要度を示す重みの第１の合計が、各エンティティが前記関係元となる場合の前記依存関係の重要度を示す重みの第２の合計と前記各エンティティが前記関係先となる場合の前記依存関係の重要度を示す重みの第３の合計とに基づいて得られる前記第１の合計の期待値よりも高くなるように、前記エンティティ群を分割することにより、前記複数の分割エンティティ群を取得する取得部を有し、
前記生成部は、
前記取得部によって取得された前記複数の分割エンティティ群のいずれかの分割エンティティ群の前記対応情報を参照し、前記各エンティティの出次数と入次数を算出することにより、前記エンティティ列を生成することを特徴とする請求項１〜４のいずれか一つに記載の分析支援装置。
【請求項６】
前記取得部は、
各々エンティティを有する部分グラフの集合の中から選ばれた複数の部分グラフを併合し、前記部分グラフの集合について各部分グラフに含まれる前記依存関係の重要度を示す重みの第１の合計と前記第１の合計の期待値との差を前記各部分グラフについて合計した評価関数の値を、併合前後の部分グラフの集合について求め、併合前よりも併合後の評価関数の値が大きくなる併合がある場合に、併合後の部分グラフの集合を前記複数の分割エンティティ群として取得することを特徴とする請求項５に記載の分析支援装置。
【請求項７】
前記ソフトウェアの対応情報を参照して、前記関係先に対して前記依存関係がある前記関係元の個数に基づいて、前記関係元が当該関係元の役割を果たすために前記依存関係がどの程度重要であるかを示す、前記関係元についての前記関係先に関する本質度を算出する本質度算出部を有し、
前記取得部は、
前記本質度算出部によって算出された本質度を前記依存関係の重要度を示す重みとして用いることにより、前記エンティティ群を分割することにより、前記複数の分割エンティティ群を取得することを特徴とする請求項５または６に記載の分析支援装置。
【請求項８】
コンピュータが、
ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を記憶する記憶装置を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成し、
前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、前記エンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように前記記憶装置に配置し、
配置された前記配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替え、
前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断し、
前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定し、
前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定し、
設定された前記分類情報を、前記割当対象に決定された配置結果内の各図形が示すエンティティに割り当て、
割当結果を出力する、
処理を実行することを特徴とする分析支援方法。
【請求項９】
ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を記憶する記憶装置を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成し、
前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、前記エンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように前記記憶装置に配置し、
配置された前記配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替え、
前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断し、
前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定し、
前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定し、
設定された前記分類情報を、前記割当対象に決定された配置結果内の各図形が示すエンティティに割り当て、
割当結果を出力する、
処理をコンピュータに実行させるための分析支援プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分析支援装置、分析支援方法、および分析支援プログラムに関する。
【背景技術】
【０００２】
ソフトウェアを開発・改良・保守するためにはソフトウェアの理解が必要となる。しかし、ソフトウェアは大規模になればなるほど、ソフトウェアの仕様は複雑なものとなり、その把握は容易ではない。そのため、ソフトウェアを理解が容易な程度に小規模な部分集合に分割する必要がある。たとえば、一度構築したコンピュータシステムでも歳月を経ることにより、改良を行う必要性やコンピュータシステム全体を見直す必要性が生じることがある。この場合、既に作成したプログラムの一部に修正を行うことがあり、既存のコンピュータシステムの仕様を理解する必要がある。
【０００３】
ソフトウェアの理解以外を目的としたソフトウェア分割技術は従来から多くの提案がなされている（たとえば、下記特許文献１を参照。）。特許文献１は、メモリ空間にロードするソフトウェアのメモリ使用量を削減するために、ソフトウェアを細かい構成要素に分割し、必要なものだけをロードする技術を開示している。
【０００４】
また、ソフトウェアの分割に必要な情報を作成する作業を省くために、ソフトウェアの分割を自動的に行う技術の提案もなされている（たとえば、下記特許文献２を参照。）。特許文献２は、複数のソフトウェアのモジュールを組み合わせて動作させるソフトウェアにおいて、メモリ空間にロードするソフトウェアのメモリ使用量の削減のため、ソフトウェアを複数のグループに分割する技術である。
【０００５】
また、一般的に、ソフトウェアの分割問題は、分割の目的によって望ましい分割が変化するため、特定の目的に対応した自動分割の手法は別の目的には適用できない。このように、分析目的によって望ましい分割が変わるために、分割過程に人が介入し分割がその人の目的に沿うように導いていく手法が開示されている（たとえば、下記非特許文献１，２を参照。）。
【０００６】
また、ソフトウェアの分割がソフトウェアの実現する機能やタスク、業務などに沿うためには、ソフトウェアの本筋の理解の妨げとなる枝葉末節のプログラムやプログラム間の依存関係を、その部分集合を形成する際に除外しなければならない場合がある。この『ソフトウェアの本筋の理解の妨げとなる枝葉末節のプログラムやプログラム間の依存関係』を除外する技術として、たとえば、下記非特許文献３が開示されている。非特許文献３は、ソフトウェア分割ではなく実行トレースログを要約する技術である。
【０００７】
また、長期間運用しているソフトウェアでは、多くの場合、業務に合わせてソフトウェア内のプログラムの修正を行う中で、プログラム間の依存関係が変化するため、業務の分類をより管理しやすく定義した方が管理を効率化できることがある。したがって、長期間運用している現状のソフトウェア資産を管理する上で、設計当初の業務分類と現状のプログラムの業務分類とを比較して、乖離を調べることが行われる。
【０００８】
また、上述したソフトウェア分割を用いて、分割前のソフトウェアにより特定される設計当初などの既存の業務分類と分割後のプログラム群により特定される現状の業務分類を取得することにより、既存の業務分類と現状の業務分類との乖離の把握が行われている。たとえば、乖離の有無を調査する方法として、下記特許文献３〜５が開示されている。
【０００９】
たとえば、特許文献３は、Ｗｅｂアプリケーションを構成するモジュールの依存関係を抽出し、設計情報抽出手段が抽出したモジュールの依存関係と一致しない場合に、双方の依存関係の差異点を抽出する技術が開示されている。特許文献３の技術は、モジュールの依存関係の差異を比較する技術であり、差異の有無を抽出して表示する。
【００１０】
また、特許文献４は、テスト実行で得られたログからオブジェクト間関係を収集し、重要度が高いオブジェクト間関係を抽出してオブジェクト図情報を生成する技術が開示されている。特許文献４の技術は、重要度の高い関係の乖離の有無のみの比較を行う。
【００１１】
また、特許文献５は、オブジェクト指向プログラムを解析し、各クラスに設定された役割に関する情報を抽出し、規約情報記憶手段から役割に対応する規約を取得し、当該クラス内において規約に対する違反を検出する技術が開示されている。特許文献５の技術は、Ｍｏｄｅｌ，ＶｉｅｗおよびＣｏｎｔｒｏｌｌｅｒという名称と処理の関係が規約として外部から与えられ、規約違反を検出することにより、乖離の有無を検出する。
【００１２】
また、Ｄｉｓｔｒｉｂｕｔｉｏｎ  Ｍａｐ技術のような、ソフトウェアに対して乖離の有無を調べる洗練された方法が開示されている（たとえば、下記非特許文献４を参照。）。Ｄｉｓｔｒｉｂｕｔｉｏｎ  Ｍａｐ技術は、自然言語処理手法を用いてクラスやソースコードを分類する手段である。Ｄｉｓｔｒｉｂｕｔｉｏｎ  Ｍａｐ技術は、パッケージ分類による業務分類とキーワード分類による業務分類を比較して表示し、乖離の有無を検出する。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００３−３０８２１６号公報
【特許文献２】特開２００９−１３４３７９号公報
【特許文献３】特開２０１０−２５０７６３号公報
【特許文献４】国際公開第２００８／０９６６３２号
【特許文献５】特開２００５−９２５１９号公報
【非特許文献】
【００１４】
【非特許文献１】S. Ducasse and D. Pollet, "Software Architecture Reconstruction: A Process-Oriented Taxonomy", IEEE Transactions on Software Engineering, vol. 35, no. 4, pp. 573-591, 2009.
【非特許文献２】L. O'Brien, D. Smith, and G. Lewis, "Supporting Migration to Services using Software Architecture Reconstruction", 13th IEEE International Workshop on Software Technology and Engineering Practice (STEP'05), pp. 81-91, 2005.
【非特許文献３】A. Hamou-Lhadj, and T. Lethbridge, "Summarizing the Content of Large Traces to Facilitate the Understanding of the Behaviour of a Software System", 14th International Conference on Program Comprehension (ICPC'06), pp. 181-190, 2006.
【非特許文献４】Stephane Ducasse, Tudor Girba, and Adrian Kuhn. "Distribution Map. In Proceedings of 22nd IEEE International Conference on Software Maintenance (ICSM '06)", p. 203-212, IEEE Computer Society, Los Alamitos CA, 2006
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しなしながら、上述した従来技術では、既存の業務分類と現状の業務分類との乖離の有無を検出することができるが、乖離の構造の相違を特定することが困難である。例えば、現状の業務分類を示すプログラム群が１種類の既存の業務分類のプログラム群である場合、当該プログラム群の呼出関係が１方向のみである構造も、プログラム間で互いに呼び出しあう構造も、いずれも乖離がないと判断される。したがって、乖離がないと判断された場合、現状の業務分類を示すプログラム群の構造にそれぞれどのような相違があるのか特定することが困難であるという問題がある。
【００１６】
また、現状の業務分類を示すプログラム群が、複数種類の既存の業務分類が混在するプログラム群である場合、当該プログラム群の呼出関係が既知の異なる業務分類間で１方向のみである構造は、乖離があると判断される。また、既知の異なる業務分類間で複数のプログラムが共通のプログラムを呼び出したり、複数のプログラムが共通のプログラムに呼び出されたりする呼出関係であっても各呼出方向が１方向である構造も、乖離があると判断される。さらに、既知の異なる業務分類間においてプログラム間で互いに呼び出しあう構造も、乖離があると判断される。
【００１７】
したがって、乖離があると判断された場合も、現状の業務分類を示すプログラム群の構造にそれぞれどのような相違があるのか特定することが困難であるという問題がある。このように、上述した従来技術では乖離の構造の特定が困難であるため、管理者は、既存の業務分類を、ソフトウェアを構成するプログラム群を管理しやすい業務分類に修正するために、どのような是正処置を採ればよいか判断することが困難である。
【００１８】
本発明は、乖離の構造を容易に特定することを目的とする。
【課題を解決するための手段】
【００１９】
本発明の一側面によれば、ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を記憶する記憶装置を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成し、前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、前記エンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように前記記憶装置に配置し、配置された前記配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替え、前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、前記入替部による入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断し、前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定し、前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定し、設定された前記分類情報を、前記割当対象に決定された配置結果内の各図形が示すエンティティに割り当て、割当結果を出力する、分析支援装置、分析支援方法、および分析支援プログラムが提案される。
【発明の効果】
【００２０】
本発明の一側面によれば、乖離の構造を容易に特定することができるという効果を奏する。
【図面の簡単な説明】
【００２１】
【図１】図１は、乖離の構造の取得例を示す説明図である。
【図２】図２は、分析支援装置のハードウェア構成例を示すブロック図である。
【図３】図３は、ソースコードＤＢの記憶内容の一例を示す説明図である。
【図４】図４は、依存関係情報３０１の一例を示す説明図である。
【図５】図５は、既存業務分類情報を示す説明図である。
【図６】図６は、分析支援装置の機能的構成例を示すブロック図である。
【図７】図７は、重み付き依存関係情報の一例を示す説明図である。
【図８】図８は、役割情報の一例を示す説明図である。
【図９】図９は、図８に示した役割１の具体例を示す説明図である。
【図１０】図１０は、分類情報の一例を示す説明図である。
【図１１】図１１は、出次数・入次数テーブルを示す説明図である。
【図１２】図１２は、更新後の出次数・入次数テーブル１１００を示す説明図である。
【図１３】図１３は、集合Ｓの一例を示す説明図である。
【図１４】図１４は、図１３に示した集合Ｓの順序番号の昇順にしたがってプログラムが配置された配置結果例を示す説明図である。
【図１５】図１５は、図１４に示した配置結果に応じた配置情報を示す説明図である。
【図１６】図１６は、スコア算出テーブルの一例を示す説明図である。
【図１７】図１７は、プログラムの入れ替え作業（１回目）を示す説明図である。
【図１８】図１８は、プログラムの入れ替え作業（２回目）を示す説明図である。
【図１９】図１９は、プログラムの入れ替え作業（３回目）を示す説明図である。
【図２０】図２０は、プログラムの入れ替え作業（４回目）を示す説明図である。
【図２１】図２１は、プログラムの入れ替え作業（５回目）を示す説明図である。
【図２２】図２２は、出力結果６１０の一例を示す説明図（その１）である。
【図２３】図２３は、出力結果６１０の一例を示す説明図（その２）である。
【図２４】図２４は、出力結果６１０の一例を示す説明図（その３）である。
【図２５】図２５は、出力結果６１０の一例を示す説明図（その４）である。
【図２６】図２６は、出力結果６１０の一例を示す説明図（その５）である。
【図２７】図２７は、出力結果６１０の一例を示す説明図（その６）である。
【図２８】図２８は、設定部６０２による設定処理手順例を示すフローチャートである。
【図２９】図２９は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（前半）である。
【図３０】図３０は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（後半）である。
【図３１】図３１は、分類処理部６０４による分類処理手順例を示すフローチャートである。
【図３２】図３２は、実施の形態２にかかる配置結果例を示す説明図である。
【図３３】図３３は、図３２に示した配置結果３２００の平面図である。
【図３４】図３４は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その１）である。
【図３５】図３５は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その２）である。
【図３６】図３６は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その３）である。
【図３７】図３７は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その４）である。
【図３８】図３８は、ステップＳ３５０８により生成された集合Ｓの一例を示す説明図である。
【図３９】図３９は、集合Ｓにおける第３軸の値の割当結果を示す説明図である。
【図４０】図４０は、グラフ化されたソフトウェアの一例を示す説明図である。
【図４１】図４１は、依存関係の一例を示す説明図である。
【図４２】図４２は、実施の形態３にかかる区画単位取得部６０１の機能的構成例を示すブロック図である。
【図４３】図４３は、ソフトウェアのグラフ表現例を示す説明図である。
【図４４】図４４は、図４３に示したソフトウェアのソースコード例を示す説明図である。
【図４５】図４５は、図４３に示したソフトウェアに関する依存関係情報４２１０の一例を示す説明図である。
【図４６】図４６は、重み付き依存関係情報４２２０の一例を示す説明図である。
【図４７】図４７は、ある有向グラフの分割例を示す説明図である。
【図４８】図４８は、図４６に示した重み付き依存関係情報４２２０を用いた場合の隣接行列Ａを示す説明図である。
【図４９】図４９は、図４６に示した重み付き依存関係情報４２２０を用いた場合のエンティティごとに、ｋINjとｋOUTiとを関連付けたパラメータテーブルを示す説明図である。
【図５０】図５０は、図４６に示した重み付き依存関係情報４２２０を用いた場合の本質度を用いたクラスタリングの処理過程を示す説明図である。
【図５１】図５１は、図５０のクラスタリングに基づく役割情報４２３０の一例を示す説明図である。
【図５２】図５２は、図５０のクラスタリングに基づく役割情報４２３０の他の例を示す説明図である。
【図５３】図５３は、実施の形態３にかかる区画単位取得部６０１による分割処理手順例を示すフローチャートである。
【図５４】図５４は、図５３に示した関係抽出処理（ステップＳ５３０１）の詳細な処理手順例を示すフローチャートである。
【図５５】図５５は、図５３に示した本質度算出処理（ステップＳ５３０２）の詳細な処理手順例を示すフローチャートである。
【図５６】図５６は、図５３に示したクラスタリング処理（ステップＳ５３０３）の詳細な処理手順例を示すフローチャートである。
【図５７】図５７は、重み付き有向モジュラリティ最大化処理（ステップＳ５６０５）の詳細な処理手順例を示すフローチャートである。
【発明を実施するための形態】
【００２２】
以下に添付図面を参照して、発明にかかる分析支援装置、分析支援方法、および分析支援プログラムの実施の形態を詳細に説明する。また、本実施の形態において、ソフトウェアを構成する要素を、「エンティティ」と称す。たとえば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどは、エンティティに該当する。本実施の形態では、エンティティとして、コンポーネント、モジュール、ソースコード、クラス、関数などのプログラムを例に挙げて説明する。
【００２３】
また、ソフトウェアは、たとえば、ドキュメント上に記述している業務の分類や、業務を分類した命名規約、ディレクトリの分類、Ｊａｖａ（登録商標）のパッケージ名による分類などにより、管理されている。このような、ソフトウェアを管理するために行っているプログラムの分類を「業務分類」と称す。
【００２４】
また、本実施の形態の分析支援装置は、既存の業務分類を、ソフトウェアを構成するプログラム群を管理しやすい業務分類に修正する是正処置を行う方法を判断するため、既存の業務分類と現状の業務分類との乖離の構造を特定する。
【００２５】
ここで、「乖離の構造」とは、既存の業務分類と現状の業務分類との間に乖離が存在するが、その乖離の仕方を示す一つの指標である。業務分類間の乖離があった場合、業務分類間の乖離の構造は、以下の３種類の違いとして得られる。
（１）業務分類の相違
（２）業務分類が保持するプログラムの相違
（３）業務分類が保持するプログラム間の依存関係の相違
【００２６】
上記（１）〜（３）の相違は同時に存在する可能性があるが、いずれか１つでも存在すれば乖離は存在する。乖離の構造は、上記（１）〜（３）の各々の相違の大きさや相互の関係を示す。具体的には、乖離の構造は、業務分類の相違の大きさや、業務分類が保持する異なるプログラムの数や、異なるプログラムが他のプログラムとどのような依存関係にあるのかという依存関係の相違を意味する。
【００２７】
たとえば、プログラム間の依存関係として、プログラム間の呼出関係を取得できた場合は、その呼出構造の呼出元が異なる場合も呼出先が異なる場合も乖離に相当する。また、この場合、乖離があるプログラムが異なる。乖離の構造は、コンポーネント、モジュール、ソースコード、クラス、関数といったプログラムに限らず、データベース、ファイルについても同様である。
【００２８】
したがって、本実施の形態の分析支援装置は、ソフトウェアをより小規模なサブモジュールに分割した上で、平面または空間上に、サブモジュール内部のプログラムを示す図形を「役割」の依存方向および重みを反映した状態で配置する。プログラムを配置する平面または空間を「区画」と称す。また、本実施の形態は、既存の分類情報を色・形・模様など（以下、「色等」）で表現することにより、ソフトウェアの現在の分類と既存の分類との乖離の構造を解釈できる状態で出力する。これにより、ソフトウェアを構成する各プログラムを示す図形の配置と当該図形に施される既知の分類との混在形態から、ソフトウェアの構造が明らかになる。
【００２９】
ここで、「役割」とは、一つの業務や機能を実現している単位である。ソフトウェアのサブモジュールである役割は、ソフトウェアを分割して得られた「業務分類」として扱われる。役割の内部の依存関係の構造は、第１軸と第２軸を利用して平面または空間上でのプログラムを示す図形の配置結果として表現される。
【００３０】
第１軸の方向は、役割の依存方向を示す。呼出元、呼出先といった呼出関係などの依存関係を把握できるように、第１軸の方向の一端側は関係元となり、他端側は関係先となる。また、第２軸の方向は、役割の重みを反映しており、重みのある依存関係があるプログラムの図形同士が、第２軸の方向に沿って近接するように配置されるようにする。
【００３１】
既存の分類と現状の分類である役割とに乖離がない場合、同一役割内のプログラムの図形同士は、第２軸の方向に沿って密集し、密集内のプログラムの図形は同一色等になる。また、第１軸の方向に沿って、役割間の依存関係が表現される。一方、分類に乖離がある場合、同一役割内に異なるプログラムの図形が混在し、同一の役割内に異なる色等のプログラムの図形が配置されることになる。このように、本実施の形態の分析支援装置は、役割の配置と既知の分類の混在形態から、ソフトウェアの内部構造の解釈をしやすいように乖離の構造を出力する。
【００３２】
（実施の形態１）
＜乖離の構造の取得例＞
図１は、乖離の構造の取得例を示す説明図である。本実施の形態では、（Ａ）複数種類に分類されている設計当初などの既存のソフトウェア１００を、（Ｂ）ソフトウェア１００の構成要素であるプログラム間の依存関係を元に役割の単位で分割し、（Ｃ）役割ごとに、既存の分類と現状の分類との乖離の構造を直感的に理解しやすく表示する技術である。
【００３３】
（Ａ）では、例として金融システムのソフトウェア１００を用いて説明する。ソフトウェア１００は、たとえば、新規発行系のプログラム群１０１と、失効処理系のプログラム群１０２と、管理系のプログラム群１０３と、プログラム群１０１〜１０３に共通して利用される共通処理のプログラム群１０４と、により分類されている。新規発行系、失効処理系、管理系、および共通処理が業務分類に相当する。すなわち、ソフトウェア１００は、設計当初などの既存の業務分類により分類されている。
【００３４】
また、ソフトウェア１００のうち、ａ１〜ａ２６は新規発行系のプログラムであり、ｂ１〜ｂ５８は、失効処理系のプログラムであり、ｃ１〜ｃ２５は管理系のプログラムであり、ｄ１〜ｄ６２は共通処理のプログラムである。
【００３５】
（Ｂ）において、クラスタＣＬ１〜ＣＬ３は、現状の分類を示す役割である。たとえば、役割１〜３のうち新規発行系のプログラム数が最も多いのは役割３であるため、利用者は、役割３を現状の新規発行系と解釈することができる。また、利用者は、プログラム数ではなく、重要なプログラムが存在するクラスタを、その重要なプログラムを有する分類として解釈することもできる。たとえば、失効処理系のプログラムｂ１〜ｂ５８のうち、ｂ１９〜ｂ２２が失効処理系の機能を実現するために必要不可欠なプログラムであることがわかっている場合、利用者は、役割２を現状の失効処理系と解釈することができる。
【００３６】
（Ｃ）では、ソフトウェア１００を構成するプログラム群１０１〜１０４が、既存の業務分類と現状の業務分類との乖離の構造がわかるように配置される。具体的には、（Ｂ）のクラスタＣＬ１〜ＣＬ３ごとに、区画Ｄ１〜Ｄ３が生成され、区画Ｄ１〜Ｄ３内にプログラムを示す図形が配置される。各区画Ｄ１〜Ｄ３は、第１軸と第２軸により張られる平面の矩形であり、乖離の構造を示す配置結果１１０，１２０，１３０として表示される。
【００３７】
ここで、第１軸は、依存関係の方向を示す軸である。たとえば、第１軸方向に並ぶプログラムの図形のうち、上の図形のプログラムが依存関係における関係元を示し、下の図形のプログラムが依存関係における関係先を示す。また、各プログラムは、業務分類ごとに色分けされる。たとえば、新規発行系は黄、失効処理系は青、管理系は緑、共通処理は赤といったように色別に表示される。なお、色ではなく、図形の形状や大きさにより区別してもよい。
【００３８】
また、第２軸は、プログラム間の依存関係の強さを示す軸である。依存関係とは、プログラム間の呼び出し関係や継承関係、包含関係、データアクセス関係などの関係をいう。たとえば、第２軸方向に隣り合うプログラムの図形は、そうでないプログラムの図形に比べて強い関係がある。
【００３９】
たとえば、配置結果１１０は、業務分類ごとに第１軸方向に階層化されている。具体的には、配置結果１１０は、第１軸方向の上から、新規発行系、失効処理系、共通処理、管理系の順に配置されている。すなわち、新規発行系と失効処理系との間には依存関係があり、新規発行系が関係元、失効処理系が関係先であることが視認できる。
【００４０】
このように、配置結果１１０により、独立している既存の業務分類間のプログラム群１０１〜１０４に依存関係があり、その依存方向が得られたことになる。したがって、ソフトウェア１００を保守、管理する上で、管理者は、４層構造に見える既存の業務分類の各々を、新規の業務分類として定義して分類を見直すか否かの判断を行うことができる。また、業務分類別に担当者が割り当てられていた場合、分類の見直しに伴って担当者の担当箇所を見直すか否かの判断を行うこともできる。
【００４１】
また、配置結果１２０は、業務分類ごとに第２軸方向に階層化されている。配置結果１２０では、依存関係の強さを示す第２軸方向に既存の業務分類を示すプログラムの図形が複数存在しているため第２軸方向に色の混在があり、業務分類の乖離が発生していることが視認できる。また、配置結果１２０では、第１軸方向には、それぞれ同一業務分類しか並んでいないため、業務分類間の依存関係は得られない。
【００４２】
ただし、依存関係の強い図形同士が近くに配置されるため、近い位置にある既存業務分類は関係が強いと解釈できる。たとえば、配置結果１２０では、共通処理と新規発行系が第２軸方向に隣接しているため、両者の間には強い依存関係があることがわかる。このように、配置結果１２０により、ソフトウェア１００を保守、管理する上で、管理者は、従来では既存の業務分類が独立であったが、現在は依存関係の強さから、隣接しあう業務分類を同一の業務分類としてグループ化するか否かの判断を行うことができる。
【００４３】
また、配置結果１３０は、業務分類に関係なく混在状態となり、既存の業務分類と現状の業務分類とは、全く異なり、その構造もわからない。既存の設計分類が利用できないほど、現状のソフトウェア１００ではプログラムが混在しているので、既存の業務分類は、プログラム群１０１〜１０４の管理を行う上で利用できていないことがわかり、品質の低下が懸念される。したがって、品質を確保するために、管理者は、再構築が必要であるという判断を行うことができる。
【００４４】
＜分析支援装置のハードウェア構成例＞
図２は、分析支援装置のハードウェア構成例を示すブロック図である。図２において、分析支援装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、磁気ディスクドライブ２０４と、磁気ディスク２０５と、光ディスクドライブ２０６と、光ディスク２０７と、ディスプレイ２０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０９と、キーボード２１０と、マウス２１１と、スキャナ２１２と、プリンタ２１３と、を備えている。また、各構成部はバス２００によってそれぞれ接続されている。
【００４５】
ここで、ＣＰＵ２０１は、分析支援装置の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される。磁気ディスクドライブ２０４は、ＣＰＵ２０１の制御にしたがって磁気ディスク２０５に対するデータのリード／ライトを制御する。磁気ディスク２０５は、磁気ディスクドライブ２０４の制御で書き込まれたデータを記憶する。
【００４６】
光ディスクドライブ２０６は、ＣＰＵ２０１の制御にしたがって光ディスク２０７に対するデータのリード／ライトを制御する。光ディスク２０７は、光ディスクドライブ２０６の制御で書き込まれたデータを記憶したり、光ディスク２０７に記憶されたデータをコンピュータに読み取らせたりする。
【００４７】
ディスプレイ２０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ２０８は、たとえば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００４８】
インターフェース（以下、「Ｉ／Ｆ」と略する。）２０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１４に接続され、このネットワーク２１４を介して他の装置に接続される。そして、Ｉ／Ｆ２０９は、ネットワーク２１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００４９】
キーボード２１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００５０】
スキャナ２１２は、画像を光学的に読み取り、分析支援装置内に画像データを取り込む。なお、スキャナ２１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ２１３は、画像データや文書データを印刷する。プリンタ２１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。なお、光ディスクドライブ２０６、光ディスク２０７、ディスプレイ２０８、キーボード２１０、マウス２１１、スキャナ２１２、およびプリンタ２１３の少なくともいずれか１つは、なくてもよい。
【００５１】
＜各種情報の記憶内容＞
図３は、ソースコードＤＢ（Ｄａｔａ  Ｂａｓｅ）の記憶内容の一例を示す説明図である。図３において、ソースコードＤＢ３００は、乖離の構造の分析対象となるソフトウェア１００が格納されている。ソースコードＤＢ３００は、記憶装置により構成される。図３では、図１に示したように、説明の便宜上、プログラム群１０１〜１０４の各プログラムを図形により示している。なお、本例では、新規発行系のプログラム群１０１の各プログラムを、プログラムａ１〜ａ１５とする。また、失効処理系のプログラム群１０２の各プログラムを、プログラムｂ１〜ｂ３２とする。また、管理系のプログラム群１０３の各プログラムを、プログラムｃ１〜ｃ２３とする。また、共通処理のプログラム群１０４の各プログラムを、プログラムｄ１〜ｄ１２とする。
【００５２】
なお、各プログラムに付した符号の先頭のアルファベットは、プログラムの先頭１文字目に出現する既存の業務分類に応じたプログラム名による命名規約を示している。たとえば、ａは新規発行系を特定する命令規約、ｂは失効処理系を特定する命令規約、ｃは管理系を特定する命令規約、ｄは共通処理を特定する命令規約を示す。また、ソースコードＤＢ３００には、ソフトウェア１００を構成するプログラムごとの依存関係を示す依存関係情報３０１が格納されている。
【００５３】
図４は、依存関係情報３０１の一例を示す説明図である。依存関係情報３０１は、関係元のプログラムと関係先のプログラムとを関連付けた情報である。たとえば、依存関係が呼び出し関係を示している場合、関係元が「ｃ１」、関係先が「ｃ２」の例では、プログラムｃ１がプログラムｃ２を呼び出していることになる。依存関係情報３０１は記憶装置に記憶される。
【００５４】
図５は、既存分類情報を示す説明図である。既存分類情報５００とは、既存の業務分類に関する情報を、ソフトウェア１００内の各プログラムに関連付けるための情報である。既存分類情報５００は記憶装置に記憶される。既存分類情報５００は、既存業務分類名項目と、命令規約項目と、色情報項目とを有し、既存の業務分類ごとにレコードを構成するテーブルである。既存業務分類名項目は、既存の業務分類名として、たとえば、「新規発行系」、「失効処理系」、「管理系」、「共通処理」を記憶する項目である。
【００５５】
命令規約項目は、既存の業務分類に応じた命令規約を記憶する項目である。本実施の形態では、ソフトウェア１００内の各プログラムの分類基準を、一例としてプログラム名による命名規約とする。したがって、たとえば、プログラム名の先頭１文字によって、分類される。ここで、たとえば、先頭１文字が「ａ」のプログラムは、新規発行系の既存業務分類名に分類される。なお、命令規約ではなく、ディレクトリ構造を採用してもよい。
【００５６】
色情報項目は、既存の業務分類に応じたプログラムを示す図形に施す色情報を記憶する項目である。本実施の形態では、上述したように、新規発行系は黄、失効処理系は青、管理系は緑、共通処理は赤といったように色別に表示される。また、図５では、色情報としたが、プログラムを示す図形の大きさや形状、図形に施される模様などでもよい。
【００５７】
＜分析支援装置の機能的構成例＞
図６は、分析支援装置の機能的構成例を示すブロック図である。分析支援装置６００は、区画単位取得部６０１と、設定部６０２と、区画配置処理部６０３と、分類処理部６０４と、を有する。区画単位取得部６０１、設定部６０２、区画配置処理部６０３、および分類処理部６０４は、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０９により、その機能を実現する。
【００５８】
区画単位取得部６０１は、ソースコードＤＢ３００内のソフトウェア１００のソースコードおよび依存関係情報３０１を入力して、重み付き依存関係情報および役割情報を出力する。ここで、重み付き依存関係情報および役割情報について、具体例を挙げて説明する。
【００５９】
図７は、重み付き依存関係情報の一例を示す説明図である。重み付き依存関係情報７００は、図４に示した依存関係情報３０１の各レコードに重みを関連付けた情報である。重みとは、関係元とその関係先との依存関係の重要度を示す指標である。重みは、その値が大きいほど重要であることを示す。重みとしては、たとえば、予め、関係元のプログラム、関係先のプログラム、または、依存関係に対して付与された値が用いられる。たとえば、新規発行系のプログラム群の中で重要な機能を実現するプログラムについてはそうでないプログラムよりも重みの値が大きく設定される。
【００６０】
また、重みとして本質度を用いることもできる。本質度とは、依存関係において、関係元が役割を果たすためにその依存関係がどれだけ重要かを示す度合いである。本質度を用いた例については後述する。なお、本実施の形態では、入力された依存関係情報３０１に対し重みを付与して、重み付き依存関係情報７００を出力することとしたが、外部装置から重み付き依存関係情報７００を受け付けることとしてもよい。
【００６１】
図８は、役割情報の一例を示す説明図である。役割情報８００は、ソフトウェア１００を構成するプログラム群１０１〜１０４を、複数のクラスタにクラスタ化した情報である。役割１〜３がクラスタＣＬ１〜ＣＬ３となる。たとえば、役割１〜３のうち新規発行系のプログラム数が最も多いのは役割２であるため、利用者は、役割２を現状の新規発行系と解釈することができる。また、利用者は、プログラム数ではなく、重要なプログラムが存在するクラスタを、その重要なプログラムを有する分類として解釈することもできる。たとえば、失効処理系のプログラムｂ１〜ｂ３２のうち、ｂ２８〜ｂ３２が失効処理系の機能を実現するために必要不可欠なプログラムであることがわかっている場合、利用者は、役割３を現状の失効処理系と解釈することができる。
【００６２】
図９は、図８に示した役割１の具体例を示す説明図である。図９では、プログラムごとに「役割１」が関連付けられている。図９では、役割情報８００のうち役割１について詳細化しているが、役割２，３についても同様に、プログラムごとに、「役割２」、「役割３」が関連付けられる。また、クラスタ化の手法としては、上述した特許文献１，２や非特許文献１〜３の技術を適用することができる。また、重み付き依存関係情報７００の重みが本質度の場合のクラスタ化については後述する。また、重み付き依存関係情報７００と同様、役割情報８００は、入力されたソフトウェア１００のソースコードから役割情報を出力することとしたが、外部装置から役割情報８００を受け付けることとしてもよい。
【００６３】
図６に戻り、設定部６０２は、役割ごとに、役割内の各プログラムに含まれる属性に応じた分類情報を設定する。具体的には、たとえば、設定部６０２は、既存分類情報５００を参照して、プログラムごとに既存の分類情報を取得する。たとえば、プログラムａ１〜ａ１２の場合、先頭１文字目には属性の一例として命令規約「ａ」が記述されているため、色情報「黄色」を分類情報として取得する。図１０は、分類情報の一例を示す説明図である。図１０は、図９に示した役割１に含まれるプログラム群についての分類情報１０００である。
【００６４】
区画配置処理部６０３は、区画単位取得部６０１によって取得された区画の分類とその区画内部の構造を区画に配置し、配置結果として出力する。具体的には、たとえば、区画配置処理部６０３は、役割１〜３ごとに区画を設定し、区画内にプログラムを示す図形を配置する。区画において、第１軸は役割の依存方向を示しているため、ある関係元とその関係先に関しては、関係元が上流、関係先が下流に位置するように、関係元のプログラムを示す図形と関係先のプログラムを示す図形を配置する。より具体的には、区画配置処理部６０３は、Ｇｒｅｅｄｙ−Ｃｙｃｌｅ−Ｒｅｍｏｖａｌ法を利用して、第１軸の上から依存関係の逆流が少ない形で配置する。また、第２軸は役割の近さを示しているため、区画配置処理部６０３は、依存関係に重みを反映して、依存関係があるプログラム同士を第２軸の方向に沿って近接して配置する。
【００６５】
区画配置処理部６０３は、生成部６３１と、配置部６３２と、入替部６３３と、判断部６３４とを有する。生成部６３１は、重み付き依存関係情報７００を参照して、各プログラムの出次数と入次数を算出することにより、関係元のプログラムが関係先のプログラムよりも上位に配列されるプログラム列を生成する。具体的には、たとえば、生成部６３１は、Ｇｒｅｅｄｙ−Ｃｙｃｌｅ−Ｒｅｍｏｖａｌ法を利用して第１軸の上流から依存関係の逆流が少ないプログラム列を生成する。
【００６６】
ここで、役割１を例に挙げてＧｒｅｅｄｙ−Ｃｙｃｌｅ−Ｒｅｍｏｖａｌ法を利用した生成部６３１の詳細な処理内容について説明する。まず、生成部６３１は、図７に示した役割１の重み付き依存関係情報７００から、有向グラフを生成する。有向グラフとは、プログラムをノード、依存関係を有向なエッジとするグラフである。具体的には、エッジの始端のノードが関係元であり、エッジの終端（矢印の先）が関係先である。この有向グラフを示す集合をＧとする。また、ＳｌとＳｒという順序を保持した集合を用意する。
【００６７】
つぎに、生成部６３１は、ソースコードＤＢ３００内のプログラム群から集合Ｇの要素である役割１のプログラムを抽出する。生成部６３１は、重み付き依存関係情報７００を参照して、抽出した各プログラムについて、当該プログラムが依存関係の関係元となっている数を出次数、依存関係の関係先となる数を入次数として記録する。また、生成部６３１は、各プログラムについて、出次数から入次数を引いた差分も記録する。
【００６８】
たとえば、図７を参照すると、生成部６３１は、プログラムａ１について、関係元となっている項目を調査する。この場合、プログラムａ１は、プログラムｃ６，ｃ７，ｂ１３，ｃ９の４個のプログラムの関係元であることがわかる。したがって、プログラムａ１の出次数は「４」である。また、プログラムａ１は、プログラムｄ１，ｄ２の２個のプログラムの関係先であることがわかる。したがって、プログラムａ１の入次数は「２」である。また、プログラムａ１について、出次数から入次数を引いた差分は、「２」である。
【００６９】
図１１は、出次数・入次数テーブルを示す説明図である。出次数・入次数テーブル１１００は、プログラムごとに、出次数、入次数、出次数から入次数を引いた差分を記録するテーブルである。図１１では、役割１のプログラム群について記録されているが、役割２，３についても同様に記録される。
【００７０】
つぎに、生成部６３１は、図１１に示した出次数・入次数テーブル１１００から出次数が「０」のプログラムを特定する。生成部６３１は、出次数が「０」のプログラムを、集合Ｓｒの先頭に追加し、集合Ｇから削除する。図１１の例では、プログラムａ２，ａ３，ｂ３，ｂ５，ｂ７，ｂ１１，ｂ１４，ｃ３，ｃ７，ｃ８の順に集合Ｓｒの先頭に追加され、集合Ｇから削除される。
【００７１】
つぎに、生成部６３１は、１０個のプログラムａ２，ａ３，ｂ３，ｂ５，ｂ７，ｂ１１，ｂ１４，ｃ３，ｃ７，ｃ８のレコードを、出次数・入次数テーブル１１００から削除する。また、生成部６３１は、削除後の集合Ｇにより、出次数、入次数、差分を再計算して、削除後の出次数・入次数テーブル１１００を更新する。
【００７２】
図１２は、更新後の出次数・入次数テーブル１１００を示す説明図である。生成部６３１は、更新後の出次数・入次数テーブル１１００から出次数が「０」のプログラムを特定する。生成部６３１は、出次数が「０」のプログラムを、集合Ｓｒに追加し、集合Ｇから削除する。図１２の例では、プログラムｂ２，ｂ４，ｂ８，ｂ９，ｂ１０，ｂ１３，ｃ１０，ｃ１１，ｄ３の順に集合Ｓｒの先頭に追加され、集合Ｇから削除される。
【００７３】
つぎに、生成部６３１は、９個のプログラムｂ２，ｂ４，ｂ８，ｂ９，ｂ１０，ｂ１３，ｃ１０，ｃ１１，ｄ３のレコードを、図１２に示した出次数・入次数テーブル１１００から削除する。また、生成部６３１は、削除後の集合Ｇにより、出次数、入次数、差分を再計算して、削除後の出次数・入次数テーブル１１００を更新する。このような処理を、出次数が「０」であるプログラムがなくなるまで繰り返すことになる。これにより、最終的に集合Ｇには、プログラムｃ１，ｃ４が残される。
【００７４】
出次数が「０」であるプログラムがなくなった場合、生成部６３１は、集合Ｇに残されているプログラム群の各プログラムについて、最新の出次数・入次数テーブル１１００から入次数が「０」のプログラムを特定する。生成部６３１は、入次数が「０」のプログラムを、集合Ｓｌの末尾から追加し、集合Ｇから削除する。つぎに、生成部６３１は、入次数が「０」のプログラムのレコードを、最新の出次数・入次数テーブル１１００から削除する。また、生成部６３１は、削除後の集合Ｇにより、出次数、入次数、差分を再計算して、削除後の出次数・入次数テーブル１１００を更新する。この処理を繰り返すことにより、入次数が「０」のプログラムや出次数が「０」のプログラムが集合Ｇから順に取り除かれ、出次数、入次数のいずれも「０」にならないプログラムが集合Ｇに残される。
【００７５】
このあと、集合Ｇに残存するプログラムについて、生成部６３１は、出次数から入次数を引いた差分を計算する。そして、生成部６３１は、差分が最大となるプログラムを集合Ｓｌの末尾に追加し、集合Ｇから削除する。本例では、差分が最大となるプログラムは、プログラムｃ１，ｃ４であるため、生成部６３１は、プログラムｃ１，ｃ４を集合Ｓｌの末尾に追加し、集合Ｇから削除する。本例では、プログラムｃ１，ｃ４が集合Ｇから削除されたことにより、集合Ｇは空集合になったとする。集合Ｇが空集合になると、生成部６３１は、集合Ｓｌの末尾に集合Ｓｒの先頭を連結して、集合Ｓを作成する。
【００７６】
図１３は、集合Ｓの一例を示す説明図である。集合Ｓのうち順序１〜２のレコードが集合Ｓｌの部分であり、順序３〜３６が集合Ｓｒの部分である。また、集合Ｓｒの部分のうち、順序２７〜３６が、図１１の例により集合Ｓｒに追加されたプログラム群であり、順序１８〜２６が図１２の例により集合Ｓｒに追加されたプログラム群である。
【００７７】
集合Ｓは、順序を保持している集合であり、先頭から末尾までの方向に依存関係が存在する。すなわち、先頭に行くほど関係元となり、末尾に行くほど関係先となる。したがって、依存関係の逆流が抑制される。
【００７８】
配置部６３２は、関係元を上流とし関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、重みを示す第２軸と、により規定される平面の区画に対し、生成部６３１によって生成されたプログラム列の各プログラムを示す図形を配置する。具体的には、配置部６３２は、プログラム列の上位からプログラムを抽出して、第２軸の方向に沿い、かつ、第２軸の方向に沿って配置される図形の列が依存方向の上流から下流に向かうように配置する。
【００７９】
具体的には、たとえば、配置部６３２は、集合Ｓの先頭から順にプログラムを取り出し、区画内に配置する。配置先となる区画の第１軸方向の長さと第２軸方向の長さは集合Ｓ内のプログラム数に応じて決定される。ただし、第１軸と第２軸により規定される区画となる矩形は、第１軸方向および第２軸方向に複数列のプログラムを示す図形が配置されるような区画とする。区画は正方形またはそれに近い矩形が好ましいため、集合Ｓ内のプログラム数をｐとすると、たとえば、（ｑ−１）2＜ｐ≦ｑ2を満たす矩形とすればよい。ｑは１以上の整数である。これにより、第１軸方向に最大ｑ個、第２軸方向にも最大ｑ個のプログラムの図形が配置可能となる。そして、第１軸と第２軸により規定される区画となる矩形内に収まるように、プログラムを示す図形が配置される。
【００８０】
図１４は、図１３に示した集合Ｓの順序番号の昇順にしたがってプログラムが配置された配置結果例を示す説明図である。配置結果１４００は、集合Ｓのプログラム数は３６個であるため、区画を規定する矩形も６行６列の矩形となっている。配置部６３２は、集合Ｓの順序番号の昇順に、プログラムを示す図形を区画に配置していく。この場合、順序番号１のプログラムｃ１を示す図形は、（ｘ，ｙ）＝（１，１）に配置され、昇順に第２軸方向に配置される。第２軸方向の末端まで配置されると、つぎのプログラムａ１を示す図形は、（ｘ，ｙ）＝（２，１）に配置され、昇順に第２軸方向に配置される。そして、昇順の最後のプログラムｂ１４を示す図形は、（ｘ，ｙ）＝（６，６）に配置される。
【００８１】
図１５は、図１４に示した配置結果１４００に応じた配置情報を示す説明図である。配置情報は、プログラムごとにｘ座標値とｙ座標値を有する。ｘ座標値は、第２軸方向の座標値であり、ｙ座標値は第１軸方向の座標値である。なお、区画の左上頂点を原点とする。また、座標値単位は、図形の個数である。たとえば、プログラムｃ４は、第２軸方向に２個目、第１軸方向に１個目であるため、（ｘ，ｙ）＝（２，１）となる。
【００８２】
また、入替部６３３は、配置部６３２によって配置された配置結果のうち第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替える。具体的には、たとえば、入替部６３３は、第２軸方向に沿った同一行について、２つのプログラムの図形を選択する。選択方法としては、たとえば、隣接しあうプログラムの図形が選択される。
【００８３】
また、判断部６３４は、依存関係の重みと、依存関係により特定される関係元のプログラムから関係先のプログラムまでの第２軸の方向に関する距離と、に基づく、依存関係の強さを示す依存関係ごとのスコアを算出する。つぎに、判断部６３４は、算出された依存関係ごとのスコアの総和を算出する。判断部６３４は、依存関係ごとのスコアの算出と、当該スコアの総和の算出を、入替部６３３による入替前後の配置結果の各々について実行する。そして、判断部６３４は、入替後の総和が入替前の総和以上であるか否かを判断する。
【００８４】
具体的には、たとえば、判断部６３４は、図１４に示した配置結果１４００を初期状態として、区画内のプログラムごとに、プログラム間の重みが大きい依存関係をより近くに配置できるようにスコアを計算し、スコアに応じて再配置を実行する。これにより、依存関係が強いプログラム同士が近接配置されるようになる。以下、具体的に説明する。
【００８５】
まず、判断部６３４は、重み付き依存関係情報７００を参照して、区画内の各プログラムの重みを取得する。つぎに、判断部６３４は、プログラムごとに、取得した重みと距離とに基づいてスコアを算出する。ここで、距離とは、算出対象となる関係元のプログラムから関係先のプログラムまでの第２軸方向の図形の個数である。たとえば、配置結果１４００において、プログラムｃ１が関係元、プログラムｃ５がその関係先である場合、距離は「３」である。また、プログラムｃ４が関係元、プログラムｃ１がその関係先である場合、距離は「１」である。また、プログラムｄ３が関係元、プログラムｃ８がその関係先である場合、距離は「３」である。また、プログラムｄ２が関係元、プログラムｄ３がその関係先である場合、距離は「４」である。そして、判断部６３４は、区画内のプログラムごとのスコアの総和を算出する。
【００８６】
図１６は、スコア算出テーブルの一例を示す説明図である。図１６のスコア算出テーブル１６００において、プログラムｃ１が関係元、プログラムｃ２がその関係先である場合、重みが「１」であり、距離が「２」であるため、スコアは、１×２＝２となる。判断部６３４は、他のプログラムについても同様にスコアを算出し、算出されたスコアの総和を求める。この場合、スコアの総和は、「９５．２」となる。
【００８７】
配置結果が示す区画は、第２軸方向に複数のプログラムの列が複数存在するため、入替部６３３による第２軸方向の入れ替え作業が実行される。上述したように、入替部６３３は、第２軸方向に沿った同一行について、２つのプログラムの図形を選択する。選択方法としては、たとえば、隣接しあうプログラムの図形が選択される。そして、判断部６３４は、選択されたプログラムの図形を入れ替えた場合のスコアを算出する。判断部６３４は、入れ替え前後のスコアを比較し、入れ替え後のスコアの総和が入れ替え前より低ければ、入れ替え後のスコアを採用する。入替部６３３は、この入れ替え作業を各プログラムに対して繰り返し実行する。
【００８８】
図１７は、プログラムの入れ替え作業（１回目）を示す説明図である。図１７では、配置結果１４００において、隣接しあうプログラムｃ１，ｃ４が選択されて、プログラムｃ１，ｃ４の図形の位置が入れ替えられた配置結果１７００となる。
【００８９】
たとえば、区画の１行目のプログラムｃ１，ｃ４が選択された場合、判断部６３４は、プログラムｃ１とプログラムｃ４との各々を関係元または関係先とする依存関係について、スコア計算を実行する。プログラムｃ１，ｃ４の場合、以下の依存関係が存在する。なお、以下の｛ｆ，ｇ｝は、ｆが関係元のプログラム、ｇが関係先のプログラムとなる依存関係である。
【００９０】
｛ｃ１，ｃ２｝
｛ｃ１，ｃ４｝
｛ｃ１，ｃ５｝
｛ｃ４，ｃ５｝
｛ｃ４，ｃ１｝
｛ｃ４，ｂ１｝
【００９１】
｛ｃ１，ｃ２｝の距離は、入れ替え前の「２」から入れ替え後の「１」に変更される。｛ｃ１，ｃ４｝の距離は、入れ替え前後でともに「１」であるため変更なしである。｛ｃ１，ｃ５｝の距離は、入れ替え前の「３」から入れ替え後の「２」に変更される。｛ｃ４，ｃ５｝の距離は、入れ替え前の「２」から入れ替え後の「３」に変更される。｛ｃ４，ｃ１｝の距離は、入れ替え前後でともに「１」であるため変更なしである。｛ｃ４，ｂ１｝の距離は、入れ替え前の「０」から入れ替え後の「１」に変更される。
【００９２】
したがって、｛ｃ１，ｃ２｝のスコアは「１」、｛ｃ１，ｃ４｝のスコアは「１」、｛ｃ１，ｃ５｝のスコアは「２」、｛ｃ４，ｃ５｝のスコアは「３」、｛ｃ４，ｃ１｝のスコアは「０．１」、｛ｃ４，ｂ１｝のスコアは「１」となる。入れ替えた依存関係のスコアと残りの依存関係のスコアの総和を求めると、図１６に示したように、入れ替え前と同じ９５．２点である。したがって、プログラムｃ１の図形とプログラムｃ４の図形とは入れ替えず、元の位置を採用する。すなわち、図１７の入れ替え後の配置結果１７００の採用は見送られ、図１４の入れ替え前の配置結果１４００が維持される。区画配置処理部６０３は、同様の処理を、第２軸方向のプログラムを１つシフトしてプログラムを選択して、実行することになる。具体的には、プログラムｃ４，ｃ２が選択される。
【００９３】
図１８は、プログラムの入れ替え作業（２回目）を示す説明図である。図１８では、配置結果１４００において、隣接しあうプログラムｃ４，ｃ２が選択されて、図１４に比べて、プログラムｃ４，ｃ２の図形の位置が入れ替えられた配置結果１８００となる。この場合の入れ替え後のスコアの総和は、図１６に示したように、９６．３点となり、入れ替え前のスコアの総和９５．２点より大きいため、図１８の配置結果１８００の採用は見送られ、図１４の入れ替え前の配置結果１４００が維持される。
【００９４】
図１９は、プログラムの入れ替え作業（３回目）を示す説明図である。図１９では、配置結果１４００において、隣接しあうプログラムｃ２，ｃ５が選択されて、図１４に比べて、プログラムｃ２，ｃ５の図形の位置が入れ替えられた配置結果１９００となる。この場合の入れ替え後のスコアの総和は、図１６に示したように、９３．３点となり、入れ替え前のスコアの総和９５．２点を下回るため、図１９の配置結果１９００が採用される。すなわち、入れ替え後の方が、全体的に距離が近くなっていることを示している。したがって、次の入れ替え作業では、図１９の配置結果１９００が基準となる。
【００９５】
図２０は、プログラムの入れ替え作業（４回目）を示す説明図である。図２０では、配置結果１９００において、隣接しあうプログラムｃ２，ｄ１が選択されて、図１９に比べて、プログラムｃ２，ｄ１の図形の位置が入れ替えられた配置結果２０００となる。この場合の入れ替え後のスコアの総和は、図１６に示したように、９３．３点となり、入れ替え前のスコアの総和９３．３点と同じであるため、図２０の配置結果２０００の採用は見送られ、図１９の入れ替え前の配置結果１９００が維持される。
【００９６】
図２１は、プログラムの入れ替え作業（５回目）を示す説明図である。図２１では、配置結果１９００において、隣接しあうプログラムｄ１，ｄ２が選択されて、図１９に比べて、プログラムｄ１，ｄ２の図形の位置が入れ替えられた配置結果２１００となる。この場合の入れ替え後のスコアの総和は、図１６に示したように、９３．３点となり、入れ替え前のスコアの総和９３．３点と同じであるため、図２１の配置結果２１００の採用は見送られ、図１９の入れ替え前の配置結果１９００が維持される。以下、同様にすべてのプログラムが選択されるまで第２軸方向の行ごとに実行される。
【００９７】
なお、図１４〜図２１の例では、隣接しあうプログラム同士を選択したが、すべてのプログラムが選択されるまで、第２軸方向の同一行であれば離間しているプログラム同士の選択を行って入れ替え作業を実行してもよい。このように、入替後のスコアの総和が入替前のスコアの総和を下回るように入れ替え作業を実行することにより、依存関係が強いプログラムほど、より近接した位置に配置されることになる。
【００９８】
図６に戻って、分類処理部６０４は、区画内の各プログラムを示す図形に対して、既存の分類情報により指定された色等を割り当てて表示する。具体的には、たとえば、分類処理部６０４は、決定部６４１と、割当部６４２と、出力部６４３と、を有する。決定部６４１は、判断部６３４により入替後の総和が入替前の総和以上である場合は入替前の配置結果を分類情報１０００の割当対象に決定し、入替後の総和が入替前の総和未満である場合は入替後の配置結果を分類情報１０００の割当対象に決定する。すなわち、決定部６４１は、判断部６３４によって採用された配置結果を、分類情報の割当対象に決定する。
【００９９】
割当部６４２は、決定部６４１によって割当対象に決定された配置結果内の各図形に対し当該図形が示すプログラムに対応する分類情報１０００を割り当てる。割当部６４２による分類情報１０００の割当ては、区画配置処理部６０３での入れ替え作業開始時でもよく、また、入れ替え作業完了後でもよい。また、出力部６４３は、割当部６４２による割当結果を出力する。出力形式としては、たとえば、ディスプレイ２０８による表示、プリンタ２１３による印刷、他の装置への送信、分析支援装置６００内の記憶装置への格納などがある。
【０１００】
これにより、既存の分類が現状の分類を示す役割の中でどのような位置に存在するかが直感的に把握し易くなり、乖離の構造の理解の容易化を図ることができる。区画配置処理部６０３および分類処理部６０４による処理が完了すると、出力結果６１０が出力される。
【０１０１】
図２２〜図２７は、出力結果６１０の一例を示す説明図である。図２２の配置結果２２００は、図１に示した配置結果１１０と同じ内容である。配置結果２２００により、ソフトウェア１００を保守、管理する上で、管理者は、４層構造に見える既存の業務分類の各々を、新規の業務分類として定義して分類を見直すか否かの判断を行うことができる。また、業務分類別に担当者が割り当てられていた場合、分類の見直しに伴って担当者の担当箇所を見直すか否かの判断を行うこともできる。
【０１０２】
図２３の配置結果２３００は、図１に示した配置結果１２０と同じ内容である。配置結果２３００により、ソフトウェア１００を保守、管理する上で、管理者は、従来では既存の業務分類が独立であったが、現在は依存関係の強さから、隣接しあう業務分類を同一の業務分類としてグループ化するか否かの判断を行うことができる。
【０１０３】
図２４の配置結果２４００は、図１に示した配置結果１３０と同じ内容である。配置結果２４００により、既存の設計分類が利用できないほど、現状のソフトウェア１００ではプログラムが混在しているので、既存の業務分類は、プログラム群の管理を行う上で利用できていないことがわかり、品質の低下が懸念される。したがって、品質を確保するために、管理者は、再構築が必要であるという判断を行うことができる。
【０１０４】
図２５の配置結果２５００は、部分的に異なる分類のプログラムが混在している構造を示している。関係元を第１軸方向の上位、関係先を第１軸方向の下位、その中間に位置するものを中位とする。配置結果２５００は、「上位が混在、下位は一色」に該当するため、下位において集約されているプログラム群を呼び出す上位のプログラム群は複数の分類が混在する構造であるため、下位において集約されているプログラム群が、上位のプログラム群に対して支配的ということが言える。
【０１０５】
配置結果２５００において、たとえば、下位のプログラム群が共通処理であれば、管理者は、上位の混在しているプログラム群を共通処理に関係するプログラム群として再分類することにより、プログラムの関係先に基づいて当該区画内のプログラム群を管理することができる。
【０１０６】
図２６の配置結果２６００は、配置結果２５００とは逆に、「上位が一色、下位が混在」に該当する構造である。配置結果２６００の場合、一種類の上位のプログラム群が、他の混在するプログラム群を下位に保持しているとみることができる。このことから、区画により規定される役割において、ディスパッチの可能性がある。したがって、管理者は、混在する下位のプログラム群をまとめて上位のプログラム群の役割として再分類（再構成）してプログラムを管理することができる。
【０１０７】
図２７の配置結果２７００は、配置結果２５００，２６００のように上位、下位といえないが、支配的な色がある構造を示している。既存の業務分類で中心的なプログラムがあるが、上位、下位という依存関係の方向がなく、依存関係の強さを示す近さの情報も得られていない。したがって、管理者は、完全混在と近いと判断して、既存の業務分類は、プログラムの管理を行う上で全く利用できていないと判断することができる。すなわち、品質の低下が懸念されるため、品質を確保するために、管理者は、再構築が必要という判断をすることができる。
【０１０８】
＜分析支援装置６００による分析支援処理手順例＞
図２８は、設定部６０２による設定処理手順例を示すフローチャートである。まず、分析支援装置６００は、既存分類情報５００を読み込み（ステップＳ２８０１）、ソースコードＤＢ３００内のプログラム群の中から、未選択のプログラムを１つ選択する（ステップＳ２８０２）。そして、分析支援装置６００は、既存分類情報５００を参照して、選択プログラムが既存業務分類に該当するか否かを判断する（ステップＳ２８０３）。既存業務分類に該当する場合（ステップＳ２８０３：Ｙｅｓ）、分析支援装置６００は、既存分類情報５００を参照して、該当する分類の色情報を選択プログラムに割り当てて（ステップＳ２８０４）、ステップＳ２８０６に移行する。一方、既存業務分類に該当しない場合（ステップＳ２８０３：Ｎｏ）、分析支援装置６００は、既存分類情報５００にはない「その他」を示す色情報を選択プログラムに割り当てて（ステップＳ２８０５）、ステップＳ２８０６に移行する。
【０１０９】
ステップＳ２８０６では、分析支援装置６００は、未選択のプログラムがあるか否かを判断する（ステップＳ２８０６）。未選択のプログラムがある場合（ステップＳ２８０６：Ｙｅｓ）、ステップＳ２８０２に戻り、未選択のプログラムを１つ選択することになる。一方、未選択のプログラムがない場合（ステップＳ２８０６：Ｎｏ）、設定部６０２による設定処理を終了する。これにより、図１０に示したような分類情報１０００が得られることになる。
【０１１０】
これにより、未選択のプログラムがなくなるまで業務分類に応じた色情報の割当てが実行されるため、ソフトウェア１００を構成する各プログラムを表示させる色が確定することになる。したがって、出力結果が表示された場合、どの分類のプログラムがどの位置にいるかを、利用者は直感的に把握することができる。
【０１１１】
図２９は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（前半）である。区画配置処理部６０３による区画配置処理は、役割ごと、すなわち、区画ごとに実行される。まず、分析支援装置６００は、重み付き依存関係情報７００から有向グラフを生成し、有向グラフを集合Ｇとして保持する（ステップＳ２９０１）。つぎに、分析支援装置６００は、集合Ｇ内のプログラムごとに出次数と入次数とを算出する（ステップＳ２９０２）。算出された出次数と入次数は出次数・入次数テーブル１１００に記録される。
【０１１２】
そして、分析支援装置６００は、出次数・入次数テーブル１１００を参照して、集合Ｇに出次数が「０」のプログラムがあるか否かを判断する（ステップＳ２９０３）。出次数が「０」のプログラムがある場合（ステップＳ２９０３：Ｙｅｓ）、分析支援装置６００は、出次数が「０」のプログラムを集合Ｓｒの先頭に追加して、集合Ｇから削除する（ステップＳ２９０４）。そして、ステップＳ２９０２に戻り、削除後の集合Ｇ内のプログラムごとに、出次数と入次数の算出が実行される（ステップＳ２９０２）。出次数と入次数が再算出されると、出次数が「０」のプログラムが再度出現する可能性があるため、出次数が「０」のプログラムがなくなるまで繰り返すことになる。
【０１１３】
また、ステップＳ２９０３において、出次数が「０」のプログラムが集合Ｇにない場合（ステップＳ２９０３：Ｎｏ）、分析支援装置６００は、出次数・入次数テーブル１１００を参照して、集合Ｇに入次数が「０」のプログラムがあるか否かを判断する（ステップＳ２９０５）。入次数が「０」のプログラムがある場合（ステップＳ２９０５：Ｙｅｓ）、分析支援装置６００は、入次数が「０」のプログラムを集合Ｓｌの末尾に追加して、集合Ｇから削除する（ステップＳ２９０６）。そして、ステップＳ２９０２に戻り、削除後の集合Ｇ内のプログラムごとに、出次数と入次数の算出が実行される（ステップＳ２９０２）。出次数と入次数が再算出されると、出次数が「０」のプログラムが再度出現する可能性があるため、出次数が「０」のプログラムがなくなるまで繰り返すことになる。
【０１１４】
一方、ステップＳ２９０５において、入次数が「０」のプログラムがない場合（ステップＳ２９０５：Ｎｏ）、分析支援装置６００は、集合Ｇが空になったか否かを判断する（ステップＳ２９０７）。集合Ｇが空になった場合（ステップＳ２９０７：Ｙｅｓ）、ステップＳ２９１２に移行する。一方、集合Ｇが空でない場合（ステップＳ２９０７：Ｎｏ）、分析支援装置６００は、集合Ｇ内のプログラムごとに、出次数から入次数を引いた差分を算出する（ステップＳ２９０８）。そして、分析支援装置６００は、集合Ｇから差分が最大となるプログラムを取得し（ステップＳ２９０９）、集合Ｓｌの末尾に追加して、集合Ｇから削除する（ステップＳ２９１０）。
【０１１５】
そして、分析支援装置６００は、再度集合Ｇが空になったか否かを判断する（ステップＳ２９１１）。空でない場合（ステップＳ２９１１：Ｎｏ）、ステップＳ２９０２に戻り、削除後の集合Ｇ内のプログラムごとに、出次数と入次数の算出が実行される（ステップＳ２９０２）。出次数と入次数が再算出されると、出次数が「０」のプログラムが再度出現する可能性があるため、出次数が「０」のプログラムがなくなるまで繰り返すことになる。また、ステップＳ２９１１において、集合Ｇが空になった場合（ステップＳ２９１１：Ｙｅｓ）、分析支援装置６００は、集合Ｓｌの末尾に集合Ｓｒを連結して集合Ｓを生成する（ステップＳ２９１２）。このあと、図３０のステップＳ３００１に移行する。
【０１１６】
図３０は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（後半）である。図２９のステップＳ２９１２により集合Ｓを生成したあと、図３０において、分析支援装置６００は、集合Ｓからプログラムを先頭から順に取り出し、区画内に第２軸方向を優先して配置する（ステップＳ３００１）。これにより、配置結果が得られることになる。つぎに、分析支援装置６００は、重み付き依存関係情報７００を参照して、依存関係ごとの重みを取得し（ステップＳ３００２）、スコア算出テーブル１６００を用いて、依存関係ごとに、重みに距離を乗じたスコアとその総和を算出する（ステップＳ３００３）。
【０１１７】
そして、分析支援装置６００は、現時点で最新の配置結果を保存する（ステップＳ３００４）。つぎに、分析支援装置６００は、プログラムに対して第２軸方向で入れ替えが可能であるか否かを判断する（ステップＳ３００５）。たとえば、入れ替えにおいて未選択のプログラムがあれば入れ替え可能と判断される。
【０１１８】
入れ替え可能でない場合（ステップＳ３００５：Ｎｏ）、区画配置処理を終了する。一方、入れ替え可能である場合（ステップＳ３００５：Ｙｅｓ）、分析支援装置６００は、第２軸方向の入れ替え対象に選ばれた行内で、２つのプログラムの図形の位置を入れ替える（ステップＳ３００６）。そして、分析支援装置６００は、ステップＳ３００３と同様、入れ替え後において、入れ替えられたプログラムを含む依存関係についてスコアを算出し、入れ替えられたプログラムを含まない依存関係のスコアとともに、スコアの総和を算出する（ステップＳ３００７）。
【０１１９】
そして、分析支援装置６００は、入れ替え前後のスコアの総和を比較して、入れ替え後のスコアの総和が入れ替え前のスコアの総和を下回ったか否かを判断する（ステップＳ３００８）。下回った場合（ステップＳ３００８：Ｙｅｓ）、分析支援装置６００は、入れ替え後の配置結果を採用して（ステップＳ３００９）、ステップＳ３０１１に移行する。一方、下回っていない場合（ステップＳ３００８：Ｎｏ）、分析支援装置６００は、入れ替え後の配置結果を採用せず、入れ替え前の配置結果を維持して（ステップＳ３０１０）、ステップＳ３０１１に移行する。
【０１２０】
ステップＳ３０１１では、分析支援装置６００は、入れ替え対象の行内において、入れ替えを試行すべきプログラムの入れ替えをすべて試行したか否かを判断する（ステップＳ３０１１）。なお、入れ替えを試行すべきプログラムは、入れ替え対象の行内の全プログラムでもよく、一部のプログラムでもよい。試行すべきプログラムが試行されていない場合（ステップＳ３０１１：Ｎｏ）、ステップＳ３００５に戻る。一方、試行すべきプログラムがすべて試行された場合（ステップＳ３０１１：Ｙｅｓ）、分析支援装置６００は、試行すべきすべての行をすべて入れ替え対象の行として試行したか否かを判断する（ステップＳ３０１２）。
【０１２１】
試行していない場合（ステップＳ３０１２：Ｎｏ）、ステップＳ３００５に戻り、分析支援装置６００は、試行すべき行を入れ替え対象の行とし、第２軸方向で入れ替え可能か否かを判断することになる。一方、試行された場合（ステップＳ３０１２：Ｙｅｓ）、ステップＳ３００４で保存された最新の配置結果と比較して、入れ替えがあったか否かを判断する（ステップＳ３０１３）。入れ替えがあった場合（ステップＳ３０１３：Ｙｅｓ）、ステップＳ３００４に戻り、分析支援装置６００は、配置結果を更新することになる。一方、入れ替えがなかった場合（ステップＳ３０１３：Ｎｏ）、区画配置処理部６０３による区画配置処理を終了する。これにより、依存関係が強いプログラムほど、より近接した位置に配置されることになる。
【０１２２】
図３１は、分類処理部６０４による分類処理手順例を示すフローチャートである。分類処理部６０４による分類処理も、区画配置処理部６０３による区画配置処理と同様、役割ごと、すなわち、区画ごとに実行される。まず、分析支援装置６００は、分類情報を取得し（ステップＳ３１０１）、分類情報からプログラムごとの色情報を取得する（ステップＳ３１０２）。そして、区画内の配置結果から順にプログラムの図形を取得し（ステップＳ３１０３）、ステップＳ３１０２で取得した色情報を設定する（ステップＳ３１０４）。
【０１２３】
このあと、分析支援装置６００は、未設定のプログラムがあるか否かを判断し（ステップＳ３１０５）、未設定のプログラムがある場合（ステップＳ３１０５：Ｙｅｓ）、分析支援装置６００は、未設定のプログラムに対し、ステップＳ３１０２で取得した色情報を設定する（ステップＳ３１０４）。一方、未設定のプログラムがない場合（ステップＳ３１０５：Ｎｏ）、分類処理部６０４による分類処理を終了する。これにより、既存の分類が現状の分類を示す役割の中でどのような位置に存在するかが直感的に把握し易くなり、乖離の構造の理解の容易化を図ることができる。
【０１２４】
このように、実施の形態１では、出次数と入次数の関係から、関係元と関係先に順序を設けることで、関係数が多く複雑なプログラム群に対して集合Ｓで示した順序を決定することができる。順序を決定した時点では、最も逆流の少なくなるように順序が定められているが、逆流がいくつか存在したり、依存関係数に関係なく、順番を飛び越えて依存があるプログラムが存在したりする可能性がある。したがって、集合Ｓで得られている順序は、依存関係が一方向に流れるとは限らない場合も含んでいる。
【０１２５】
また、順序の決定時点では、区画内の依存関係の方向は取得しているが、依存関係の重みを利用していない。そこで、一度、区画内に順に配置し、第２軸方向に限って各プログラムを順に入れ替えてスコアを計算し、区画内のスコアの総和の最小値を選択することで、依存関係の重みが強いプログラム同士を近接した距離に配置することができる。したがって、第２軸方向の距離が調整された配置が得られる。
【０１２６】
第２軸方向に入れ替えがあったとしても、関係元が多いプログラムが上位、関係元が少ないプログラムが下位となる第１軸方向の配置は保持されるため、依存関係の方向は、第１軸方向により示される。たとえば、第１軸が一列の区画に対して順に配置した場合は、依存方向のみの配置結果となる。一方、第２軸が一列の区画に対して配置した場合は、依存方向に基づいて配置した後、各プログラムに対して、入れ替え操作を行い、重みがあるプログラム同士が近くに寄せられた配置結果が得られるため、依存関係の重みの強さに応じた近さが得られる。したがって、実施の形態１の区画は、第１軸方向および第２軸方向のいずれも表現かのうな２行２列以上の区画となる。
【０１２７】
このように、実施の形態１によれば、より多くの関係先と依存関係がある関係元が第１軸の上流側に配置され、関係先との依存関係がない、または、少ない関係元であるほど第１軸の下流側に配置される。このため、管理者は、第１軸の方向により、関係元から関係先への依存関係の方向を把握することができる。また、第２軸において依存関係が強いプログラムほど、より近接した位置に配置されることになる。このため、管理者は、第２軸の方向により、依存関係のある２つのプログラム間の重要度を把握することができる。
【０１２８】
したがって、第１軸と第２軸により規定される区画上の配置によりプログラムの依存関係や重みの強さを表現し、かつ、プログラムの分類を図形の色等で表現することにより、既存の分類が現状の分類を示す役割の中でどのような位置に存在するかが直感的に把握し易くなり、乖離の構造の特定の容易化を図ることができる。また、配置結果のうち、第２軸方向に沿う行内の２つの図形を入れ替えることにより、他の行にまたがる入替を防止することができ、依存関係の方向を維持することができる。
【０１２９】
（実施の形態２）
つぎに、実施の形態２について説明する。実施の形態１では、分析支援装置が区画を平面として表示することとしたが、実施の形態２では、分析支援装置が区画を３次元の空間として表示する例である。
【０１３０】
図３２は、実施の形態２にかかる配置結果例を示す説明図である。図３２において、配置結果３２００は、図２１に示した配置結果に対し、第３軸方向にプログラムの図形を伸ばしたデータである。第３軸とは、第１軸および第２軸により規定される平面に交差する軸である。具体的には、図１３に示した集合Ｓにおけるプログラムの配列に対し、順序番号が小さい方を上流、大きい方を下流と定義する。配置結果３２００では、プログラムｃ１が最も上流に位置し、プログラムｂ１４が最も下流に位置している。そして、分析支援装置は、上流側のプログラムが下流側のプログラムよりも第３軸の値が高くなるように、グループ化することになる。
【０１３１】
図３３は、図３２に示した配置結果３２００の平面図である。図３３では、区画内のぷプログラム群が９個のグループｇ１〜ｇ９に分類される。そして、グループｇ１〜ｇ９において、分析支援装置は、上流側のグループが下流側のグループよりも第３軸の値が高くなるように、第３軸の値をグループｇ１〜ｇ９に割り当てる。本例では、グループｇ１の第３軸の値が最も高くなり、グループｇ９の第３軸の値は最も低くなる。なお、同一グループ内の第３軸の値は同一の値となる。実施の形態１のように区画が平面の場合は、依存関係において関係元になり、かつ、依存関係が強いプログラムほど、上流側に配置されることがわかるが、実施の形態２では、さらに、第３軸の値によりグループｇ１〜ｇ９のように階層化される。したがって、依存関係の強さに応じてプログラムをグループ化でき、視認性の向上を図ることができる。
【０１３２】
＜区画配置処理部６０３による区画配置処理手順例＞
つぎに、実施の形態２にかかる区画配置処理部６０３による区画配置処理手順例について図３４〜図３７を用いて説明する。実施の形態２においても、区画配置処理部６０３による区画配置処理は、役割ごと、すなわち、区画ごとに実行される。
【０１３３】
図３４は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その１）である。まず、分析支援装置６００は、重み付き依存関係情報７００から有向グラフを生成し、有向グラフを集合Ｇとして保持する（ステップＳ３４００）。つぎに、分析支援装置６００は、出次除外回数を０、入次除外回数を０に設定する（ステップＳ３４０１）。
【０１３４】
出次数が０のプログラムは後述のステップＳ３４０５において集合Ｇから削除されるが、出次数が０でないプログラムは削除対象にはならないため、出次除外回数とは、出次数が０でないために削除対象にならなかった回数である。同様に、入次数が０のプログラムは後述のステップＳ３４０９において集合Ｇから削除されるが、入次数が０でないプログラムは削除対象にはならないため、入次除外回数とは、入次数が０でないために削除対象にならなかった回数である。したがって、ステップＳ３４０１では、初期値として、出次除外回数を０、入次除外回数は０に設定される。
【０１３５】
つぎに、分析支援装置６００は、集合Ｇ内のプログラムごとに出次数と入次数とを算出する（ステップＳ３４０２）。算出された出次数と入次数は出次数・入次数テーブル１１００に記録される。そして、分析支援装置６００は、出次数・入次数テーブル１１００を参照して、集合Ｇに出次数が「０」のプログラムがあるか否かを判断する（ステップＳ３４０３）。出次数が「０」のプログラムがある場合（ステップＳ３４０３：Ｙｅｓ）、分析支援装置６００は、出次数０のプログラムに対して、出次除外回数と種類（ｏｕｔ）とを対応付ける（ステップＳ３４０４）。「ｏｕｔ」は出次除外回数であることを示す識別情報である。
【０１３６】
たとえば、図１１に示した出次数・入次数テーブル１１００を参照すると、出次数が「０」のプログラムａ２，ａ３，ｂ３，ｂ５，ｂ７，ｂ１１，ｂ１４，ｃ３，ｃ７，ｃ８に対して、出次除外回数＝０が対応付けられる。具体的には、出次数が「０」のプログラムと出次除外回数との組は、（ａ２，（０，Ｏｕｔ）），（ａ３，（０，Ｏｕｔ）），（ｂ３，（０，Ｏｕｔ）），（ｂ５，（０，Ｏｕｔ）），（ｂ７，（０，Ｏｕｔ）），（ｂ１１，（０，Ｏｕｔ）），（ｂ１４，（０，Ｏｕｔ）），（ｃ３，（０，Ｏｕｔ）），（ｃ７，（０，Ｏｕｔ）），（ｃ８，（０，Ｏｕｔ））として記憶領域に保持される。
【０１３７】
このあと、分析支援装置６００は、出次数が「０」のプログラムと出次除外回数との組を集合Ｓｒの先頭に追加して、出次数が「０」のプログラムを集合Ｇから削除する（ステップＳ３４０５）。上記の例では、（ａ２，（０，Ｏｕｔ）），（ａ３，（０，Ｏｕｔ）），（ｂ３，（０，Ｏｕｔ）），（ｂ５，（０，Ｏｕｔ）），（ｂ７，（０，Ｏｕｔ）），（ｂ１１，（０，Ｏｕｔ）），（ｂ１４，（０，Ｏｕｔ）），（ｃ３，（０，Ｏｕｔ）），（ｃ７，（０，Ｏｕｔ）），（ｃ８，（０，Ｏｕｔ））の順に、集合Ｓｒの先頭に追加される。そして、分析支援装置６００は、出次除外回数に１加算して（ステップＳ３４０６）、ステップＳ３４０２に戻り、削除後の集合Ｇ内のプログラムごとに、出次数と入次数の算出が実行される（ステップＳ３４０２）。出次数と入次数が再算出されると、出次数が「０」のプログラムが再度出現する可能性があるため、出次数が「０」のプログラムがなくなるまで繰り返すことになる。
【０１３８】
たとえば、出次数と入次数の再算出により、図１２に示した出次数・入次数テーブル１１００を参照して、出次数が「０」のプログラムｂ２，ｂ４，ｂ８，ｂ９，ｂ１０，ｂ１３，ｃ１０，ｄ３が検出される。したがって、出次数が「０」のプログラムｂ２，ｂ４，ｂ８，ｂ９，ｂ１０，ｂ１３，ｃ１０，ｄ３に対して、出次除外回数＝１が対応付けられる。
【０１３９】
この場合、具体的には、出次数が「０」のプログラムと出次除外回数の組は、（ｂ２，（１，Ｏｕｔ）），（ｂ４，（１，Ｏｕｔ）），（ｂ８，（１，Ｏｕｔ）），（ｂ９，（１，Ｏｕｔ）），（ｂ１０，（１，Ｏｕｔ）），（ｂ１３，（１，Ｏｕｔ）），（ｃ１０，（１，Ｏｕｔ）），（ｄ３，（１，Ｏｕｔ））として記憶領域に保持される。
【０１４０】
このあと、出次数が「０」のプログラムと出次除外回数の組（ｂ２，（１，Ｏｕｔ）），（ｂ４，（１，Ｏｕｔ）），（ｂ８，（１，Ｏｕｔ）），（ｂ９，（１，Ｏｕｔ）），（ｂ１０，（１，Ｏｕｔ）），（ｂ１３，（１，Ｏｕｔ）），（ｃ１０，（１，Ｏｕｔ）），（ｄ３，（１，Ｏｕｔ））は、この順に、集合Ｓｒの先頭に追加される。出次除外回数（＝１）に１加算されて、出次除外回数＝２となる。
【０１４１】
また、出次数が「０」のプログラムｂ２，ｂ４，ｂ８，ｂ９，ｂ１０，ｂ１３，ｃ１０，ｄ３を集合Ｇから削除して、出次数と入次数を再算出すると、出次数が「０」のプログラムａ５，ｂ６，ｂ１２，ｃ９，ｃ１３が検出されたとする。この場合の出次数が「０」のプログラムと出次除外回数の組は、（ａ５，（２，Ｏｕｔ）），（ｂ６，（２，Ｏｕｔ）），（ｂ１２，（２，Ｏｕｔ）），（ｃ９，（２，Ｏｕｔ）），（ｃ１３，（２，Ｏｕｔ））として記憶領域に保持される。そして、（ａ５，（２，Ｏｕｔ）），（ｂ６，（２，Ｏｕｔ）），（ｂ１２，（２，Ｏｕｔ）），（ｃ９，（２，Ｏｕｔ）），（ｃ１３，（２，Ｏｕｔ））の順に集合Ｓｒの先頭に追加され、出次除外回数（＝２）に１加算されて、出次除外回数＝３となる。
【０１４２】
そして、出次数が「０」のプログラムａ５，ｂ６，ｂ１２，ｃ９，ｃ１３を集合Ｇから削除して、出次数と入次数を再算出し、出次数が「０」のプログラムは検出されなくなると（ステップＳ３４０３：Ｎｏ）、ステップＳ３４０７に移行する。
【０１４３】
ステップＳ３４０７において、分析支援装置６００は、出次数・入次数テーブル１１００を参照して、集合Ｇに入次数が「０」のプログラムがあるか否かを判断する（ステップＳ３４０７）。入次数が「０」のプログラムがある場合（ステップＳ３４０７：Ｙｅｓ）、分析支援装置６００は、入次数０のプログラムに対して、入次除外回数と種類（ｉｎ）とを対応付ける（ステップＳ３４０８）。「ｉｎ」は出次除外回数であることを示す識別情報である。入次数０のプログラムと入次除外回数との組についても、出次数０のプログラムと出次除外回数との組と同様、（プログラム名，（入次除外回数，ｉｎ））のように対応付けて記憶領域に保持される。
【０１４４】
このあと、分析支援装置６００は、入次数が「０」のプログラムと入次除外回数との組を集合Ｓｌの末尾に追加して、入次数が「０」のプログラムを集合Ｇから削除する（ステップＳ３４０９）。そして、分析支援装置６００は、入次除外回数に１加算して（ステップＳ３４１０）、ステップＳ３４０２に戻り、削除後の集合Ｇ内のプログラムごとに、出次数と入次数の算出が実行される（ステップＳ３４０２）。出次数と入次数が再算出されると、出次数が「０」のプログラムが再度出現する可能性があるため、出次数が「０」のプログラムがなくなるまで繰り返すことになる。一方、ステップＳ３４０７において、入次数が「０」のプログラムがない場合（ステップＳ３４０７：Ｎｏ）、図３５のステップＳ３５０１に移行する。
【０１４５】
図３５は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その２）である。ステップＳ３５０１において、分析支援装置６００は、集合Ｇが空になったか否かを判断する（ステップＳ３５０１）。集合Ｇが空になった場合（ステップＳ３５０１：Ｙｅｓ）、ステップＳ３５０８に移行する。一方、集合Ｇが空でない場合（ステップＳ３５０１：Ｎｏ）、分析支援装置６００は、集合Ｇ内のプログラムごとに、出次数から入次数を引いた差分を算出する（ステップＳ３５０２）。そして、分析支援装置６００は、集合Ｇから差分が最大となるプログラムを取得し（ステップＳ３５０３）、差分が最大となるプログラムを、入次除外回数および種類（ｉｎ）に対応付ける（ステップＳ３５０４）。
【０１４６】
そして、分析支援装置６００は、ステップＳ３５０４において生成した差分が最大となるプログラムと入次除外回数との組を集合Ｓｌの末尾に追加して、差分が最大となるプログラムを集合Ｇから削除する（ステップＳ３５０５）。そして、分析支援装置６００は、入次除外回数に１加算する（ステップＳ３５０６）。
【０１４７】
そして、分析支援装置６００は、再度集合Ｇが空になったか否かを判断する（ステップＳ３５０７）。空でない場合（ステップＳ３５０７：Ｎｏ）、図３４のステップＳ３４０２に戻り、削除後の集合Ｇ内のプログラムごとに、出次数と入次数の算出が実行される（ステップＳ３４０２）。出次数と入次数が再算出されると、出次数が「０」のプログラムが再度出現する可能性があるため、出次数が「０」のプログラムがなくなるまで繰り返すことになる。また、ステップＳ３５０７において、集合Ｇが空になった場合（ステップＳ３５０７：Ｙｅｓ）、分析支援装置６００は、集合Ｓｌの末尾に集合Ｓｒを連結して集合Ｓを生成する（ステップＳ３５０８）。
【０１４８】
図３８は、ステップＳ３５０８により生成された集合Ｓの一例を示す説明図である。集合Ｓは、順序を保持している集合であり、先頭から末尾までの方向に依存関係が存在する。ステップＳ３５０８のあと、図３６のステップＳ３６０１に移行する。
【０１４９】
図３６は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その３）である。図３６の処理は、図３８の集合Ｓの各プログラムに対応付けられている入次除外回数および出次除外回数から第３軸の値を設定する処理である。ステップＳ３６０１において、分析支援装置６００は、まず、集合Ｓ内のプログラムを順序番号の末尾から取得する（ステップＳ３６０１）。取得したプログラムは第３軸の値の割当対象となる。以降、取得したプログラムを割当対象プログラムと称す。ステップＳ３６０８で取得される場合も同様である。
【０１５０】
つぎに、分析支援装置６００は、割当対象プログラムに対応付けられている除外回数とその種類（ｉｎまたはｏｕｔ）を保持する（ステップＳ３６０２）。現時点で保持されている最新のプログラムの除外回数とその種類は、割当対象プログラムと比較される。以降、保持されたプログラムを比較対象プログラムと称す。ステップＳ３６０５で更新された場合も同様である。
【０１５１】
そして、分析支援装置６００は、第３軸の値を０に設定する（ステップＳ３６０３）。つぎに、分析支援装置６００は、割当対象プログラムの除外回数とその種類のいずれかが、ステップＳ３６０２またはＳ３６０５において現時点で保持されている最新のプログラムとその種類と異なるか否かを判断する（ステップＳ３６０４）。
【０１５２】
同一である場合（ステップＳ３６０４：Ｎｏ）、現時点で保持されている最新のプログラムとその種類はそのまま保持され、ステップＳ３６０６に移行する。一方、異なる場合（ステップＳ３６０４：Ｙｅｓ）、分析支援装置６００は、比較対象プログラムの除外回数とその種類を、割当対象プログラムの除外回数とその種類に更新し、第３軸の値に１を加算する（ステップＳ３６０５）。
【０１５３】
そして、分析支援装置６００は、ステップＳ３６０５において１加算された最新の第３軸の値を、割当対象プログラムに割り当てる（ステップＳ３６０６）。このあと、分析支援装置６００は、集合Ｓ内において、未割当のプログラムがあるか否かを判断する（ステップＳ３６０７）。未割当のプログラムがある場合（ステップＳ３６０７：Ｙｅｓ）、分析支援装置６００は、集合Ｓから未割当のプログラムを１つ取得して（ステップＳ３６０８）、ステップＳ３６０４に移行する。これにより、未割当のプログラムがなくなるまで、第３軸の値の割当が実行されることになる。一方、未割当のプログラムがない場合（ステップＳ３６０７：Ｎｏ）、図３７のステップＳ３７０１に移行する。
【０１５４】
図３６に示した処理では、図３８を参照すると、末尾から（０，Ｏｕｔ），（１，Ｏｕｔ），（２，Ｏｕｔ），（３，Ｏｕｔ），（４，Ｏｕｔ），（５，Ｏｕｔ），（６，Ｏｕｔ），（７，Ｏｕｔ），（８，Ｉｎ）が除外回数として得られる。したがって、図３６に示した処理では、第３軸の値として、（０，Ｏｕｔ)に「１」、（１，Ｏｕｔ）に「２」、（２，Ｏｕｔ）に「３」、（３，Ｏｕｔ）に「４」、（４，Ｏｕｔ）に「５」、（５，Ｏｕｔ）に「６」、（６，Ｏｕｔ）に「７」、（７，Ｏｕｔ）に「８」、（８，Ｉｎ）に「９」が割り当てられる。
【０１５５】
図３９は、集合Ｓにおける第３軸の値の割当結果を示す説明図である。なお、第３軸の値である第３軸方向の高さは、第２軸方向の重みを伴う入れ替え手順の中では変更されない。つぎに、図３７の処理について説明する。
【０１５６】
図３７は、区画配置処理部６０３による区画配置処理手順例を示すフローチャート（その４）である。図３６において未割当のプログラムがない場合（ステップＳ３６０７：Ｎｏ）、図３７において、分析支援装置６００は、集合Ｓからプログラムを先頭から順に取り出し、区画内に第２軸方向を優先して配置する（ステップＳ３７０１）。これにより、配置結果が得られることになる。つぎに、分析支援装置６００は、重み付き依存関係情報７００を参照して、依存関係ごとの重みを取得し（ステップＳ３７０２）、スコア算出テーブル１６００を用いて、依存関係ごとに、重みに距離を乗じたスコアとその総和を算出する（ステップＳ３７０３）。
【０１５７】
そして、分析支援装置６００は、現時点で最新の配置結果を保存する（ステップＳ３７０４）。つぎに、分析支援装置６００は、プログラムに対して第２軸方向で入れ替えが可能であるか否かを判断する（ステップＳ３７０５）。たとえば、入れ替えにおいて未選択のプログラムがあれば入れ替え可能と判断される。
【０１５８】
入れ替え可能でない場合（ステップＳ３７０５：Ｎｏ）、区画配置処理を終了する。一方、入れ替え可能である場合（ステップＳ３７０５：Ｙｅｓ）、分析支援装置６００は、第２軸方向の入れ替え対象に選ばれた行内で、２つのプログラムの図形の位置を入れ替える（ステップＳ３７０６）。そして、分析支援装置６００は、ステップＳ３７０３と同様、入れ替え後において、入れ替えられたプログラムを含む依存関係についてスコアを算出し、入れ替えられたプログラムを含まない依存関係のスコアとともに、スコアの総和を算出する（ステップＳ３７０７）。
【０１５９】
そして、分析支援装置６００は、入れ替え前後のスコアの総和を比較して、入れ替え後のスコアの総和が入れ替え前のスコアの総和を下回ったか否かを判断する（ステップＳ３７０８）。下回った場合（ステップＳ３７０８：Ｙｅｓ）、分析支援装置６００は、入れ替え後の配置結果を採用して（ステップＳ３７０９）、ステップＳ３７１１に移行する。一方、下回っていない場合（ステップＳ３７０８：Ｎｏ）、分析支援装置６００は、入れ替え後の配置結果を採用せず、入れ替え前の配置結果を維持して（ステップＳ３７１０）、ステップＳ３７１１に移行する。
【０１６０】
ステップＳ３７１１では、分析支援装置６００は、入れ替え対象の行内において、入れ替えを試行すべきプログラムの入れ替えをすべて試行したか否かを判断する（ステップＳ３７１１）。なお、入れ替えを試行すべきプログラムは、入れ替え対象の行内の全プログラムでもよく、一部のプログラムでもよい。試行すべきプログラムが試行されていない場合（ステップＳ３７１１：Ｎｏ）、ステップＳ３７０５に戻る。一方、試行すべきプログラムがすべて試行された場合（ステップＳ３７１１：Ｙｅｓ）、分析支援装置６００は、試行すべきすべての行をすべて入れ替え対象の行として試行したか否かを判断する（ステップＳ３７１２）。
【０１６１】
試行していない場合（ステップＳ３７１２：Ｎｏ）、ステップＳ３７０５に戻り、分析支援装置６００は、試行すべき行を入れ替え対象の行とし、第２軸方向で入れ替え可能か否かを判断することになる。一方、試行された場合（ステップＳ３７１２：Ｙｅｓ）、ステップＳ３７０４で保存された最新の配置結果と比較して、入れ替えがあったか否かを判断する（ステップＳ３７１３）。入れ替えがあった場合（ステップＳ３７１３：Ｙｅｓ）、ステップＳ３７０４に戻り、分析支援装置６００は、配置結果を更新することになる。一方、入れ替えがなかった場合（ステップＳ３７１３：Ｎｏ）、区画配置処理部６０３による区画配置処理を終了する。これにより、依存関係が強いプログラムほど、より近接した位置に配置されることになる。さらに、第３軸の値により区画内のプログラムが入次数および出次数により階層化される。したがって、依存関係の強さに応じてプログラムをグループ化でき、視認性の向上を図ることができる。したがって、実施の形態２においても乖離の構造の特定の容易化を図ることができる。
【０１６２】
（実施の形態３）
つぎに、実施の形態３について説明する。実施の形態３は、実施の形態１，２の区画単位取得部６０１において、重み付き依存関係情報７００を用いてソフトウェア１００のソースコードをクラスタ化する例である。
【０１６３】
図４０は、グラフ化されたソフトウェアの一例を示す説明図である。図４０中、□の図形は、ソフトウェアの構成要素であるエンティティを示している。実施の形態１の冒頭で説明したように、エンティティには、たとえば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどが含まれる。実施の形態１，２では、コンポーネント、モジュール、ソースコード、クラス、関数などのプログラムをエンティティの一例として説明した。また、図４０において、エンティティ間の矢印は、依存関係を示している。矢印の始端が関係元エンティティ、矢印の終端（矢印の先）が関係先エンティティとする。たとえば、依存関係が呼び出し関係を示す場合、関係元エンティティが関係先エンティティを呼び出すことになる。
【０１６４】
実施の形態３の区画単位取得部６０１でのソフトウェア分割は、以下の性質（１）〜（３）を有する。
（１）ソフトウェア分割は、エンティティの集合であるソフトウェアにおいて、ソフトウェアの処理の本筋となるエンティティや依存関係を重視してエンティティをグループ化することにより実行される。
（２）ソフトウェア分割は、ユーティリティのような理解の妨げとなるエンティティや依存関係を軽視し、必要ならば分割されたグループから外すように実行される。
（３）ただし、ソフトウェア分割は、一見軽視されるようなエンティティであっても、分割されたグループを特徴付けるようなエンティティならば、当該グループに包含させるように実行される。
【０１６５】
このようにして、実施の形態３の区画単位取得部６０１は、図４０に示したようなエンティティの集合であるソフトウェアを理解が容易な程度の部分集合に分割することになる。なお、ソフトウェアをグラフで表現し、当該グラフを部分グラフに分割したとき、部分グラフまたは部分グラフに属するエンティティの集合のことを、グループまたはクラスタと呼ぶ。グラフをクラスタに分割することをクラスタリングと呼ぶ。
【０１６６】
＜依存関係の一例＞
図４１は、依存関係の一例を示す説明図である。実施の形態１において説明した本質度は、依存関係ごとに与えられ、依存関係に対応する辺の重みとして用いられる。本例では、本質度は、たとえば、下記式（１）のように表現される。
【０１６７】
【数１】
0005783063.tif 000002
【０１６８】
上記式（１）において、左辺のＥ（Ａ，Ｂ）は、エンティティＡからエンティティＢへの依存関係の本質度を示している。右辺の分母のｄin（Ｂ）は、エンティティＢの入次数（Ｂが関係先エンティティとなる辺の数、または被依存関係数）を意味する。右辺はここでは式（１）の形態を用いているが、たとえばエンティティＢの相対サイズ値や予め与えた重要度数値など別の形態であってもよい。
【０１６９】
図４１の（ａ）は、本質度の一例を示している。エンティティＡ１，Ａ２において、エンティティＡ１は関係先エンティティであり、エンティティＡ２は関係元エンティティである。エンティティＡ１がエンティティＡ２のみから依存されるため、エンティティＡ２にとってエンティティＡ１との依存関係は、複数のエンティティから依存される場合よりも重要であるとして高い値になる。その理由は、エンティティＡ２が役割を果たすためにエンティティＡ１が作成されている可能性が高く、エンティティＡ１はエンティティＡ２にとって重要であるとみなせるからである。具体的には、たとえば、辺の数は１本（入次数＝１）であるため、エンティティＡ１にとってエンティティＡ２との依存関係がどれだけ重要かを示す本質度は「１」である。
【０１７０】
図４１の（ｂ）は、関係元エンティティが複数存在する場合の本質度の一例を示している。エンティティＤ１〜Ｄ４は、関係元エンティティであり、エンティティＢは、エンティティＤ１〜Ｄ４に共通の関係先エンティティである。この場合、エンティティＤ１にとってエンティティＢとの依存関係は重要ではないとして低い値となる。その理由は、エンティティＤ１が役割を果たすためにエンティティＢが作成されているという可能性は低く、エンティティＢはエンティティＤ１にとって重要とは言い難いからである。エンティティＤ２〜Ｄ４についても同様である。具体的には、たとえば、エンティティＢを関係元エンティティとする辺の数は４本（入次数＝４）であるため、エンティティＤ１〜Ｄ４の各々にとってエンティティＢとの依存関係がどれだけ重要かを示す本質度は「１／４」である。
【０１７１】
図４１の（ｃ）は、（ｂ）の場合において、エンティティＢをエンティティＤ１〜Ｄ４が属するグループＤに含めるか否かを示している。エンティティＤ１からエンティティＢへの本質度は１／４と低いが、エンティティＤ１〜Ｄ４からなるグループＤからエンティティＢへの本質度の合計は「１」となるため、高い値となる。一方、グループＥの各エンティティＥ１〜Ｅ３からエンティティＢへの本質度は、いずれも「０」であるため、グループＥからエンティティＢへの本質度の合計も「０」であり、グループＤに比べて低い値となる。この場合、エンティティＢは、グループＥよりもグループＤに包含させるべきであり、上記性質（３）を満たすことになる。
【０１７２】
＜区画単位取得部６０１の機能的構成例＞
図４２は、実施の形態３にかかる区画単位取得部６０１の機能的構成例を示すブロック図である。区画単位取得部６０１は、関係抽出部４２０１と、本質度算出部４２０２と、分割部４２０３と、を有する。関係抽出部４２０１、本質度算出部４２０２、および分割部４２０３は、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０９により、その機能を実現する。
【０１７３】
関係抽出部４２０１は、ソフトウェア内のエンティティ間の依存関係を抽出する。具体的には、たとえば、関係抽出部４２０１は、ソースコードＤＢ３００からソフトウェアのソースコードを読み込んで、既存の構文解析技術および静的解析技術により、ソースコードを解析する。ソースコードＤＢ３００は、ソフトウェアのソースコードを記憶する。ソースコードＤＢ３００は、記憶装置により構成される。
【０１７４】
図４３は、ソフトウェアのグラフ表現例を示す説明図である。図４３のソフトウェアは、説明の便宜上、エンティティの数を１６個としている。各エンティティは、たとえば、Ｊａｖａ（登録商標）言語のクラスを示しており、エンティティの番号は図４４のクラスの番号に対応する。たとえば、エンティティ＃（＃は数字の意味）は、クラスＣ＃に対応する。
【０１７５】
図４４は、図４３に示したソフトウェアのソースコード例を示す説明図である。図４４では、Ｊａｖａ言語のソースコードを例に挙げて説明している。図４４の（ａ）は、クラスＣ２がクラスＣ５，Ｃ９，Ｃ１４，Ｃ１を呼び出すことを示すソースコードである。
【０１７６】
図４２に戻り、関係抽出部４２０１は、解析されたソースコードからエンティティを抽出する。たとえば、関係抽出部４２０１は、図４４の（ａ）のソースコードから、クラスＣ２を関係元エンティティとして抽出する。また、関係抽出部４２０１は、図４４の（ａ）のソースコード４４０１から、クラスＣ２の呼び出し先となるクラスＣ５，Ｃ９，Ｃ１４，Ｃ１を、クラスＣ２の関係先エンティティとして抽出する。これにより、関係元エンティティの依存関係が抽出されることになる。図４４の（ｂ）のソースコード４４０２についても同様に、関係抽出部４２０１は、クラスＣ５を関係元エンティティとして抽出し、クラスＣ１を関係先エンティティとして抽出する。
【０１７７】
関係抽出部４２０１は、抽出した関係元エンティティとその関係先エンティティとの組を、依存関係情報４２１０のレコードとして格納する。たとえば、関係抽出部４２０１は、図４４の（ａ）の場合、｛２，５｝，｛２，９｝，｛２，１４｝，｛２，１｝を依存関係情報４２１０に格納する。｛ａ，ｂ｝は、関係元エンティティの番号ａとその関係先エンティティの番号ｂとの組を示す。これにより、依存関係情報４２１０が生成される。
【０１７８】
図４５は、図４３に示したソフトウェアに関する依存関係情報４２１０の一例を示す説明図である。依存関係情報４２１０は、関係元エンティティとその関係先エンティティとを関連付けて記憶するテーブルである。依存関係情報４２１０は記憶装置に記憶される。
【０１７９】
本質度算出部４２０２は、関係元エンティティからその関係先エンティティへの本質度を算出する。具体的には、たとえば、本質度算出部４２０２は、上述した式（１）により算出する。そして、本質度算出部４２０２は、依存関係情報４２１０の各レコードの依存関係に、対応する本質度を関連付けた重み付き依存関係情報４２２０を生成する。
【０１８０】
図４６は、重み付き依存関係情報４２２０の一例を示す説明図である。重み付き依存関係情報４２２０は記憶装置に記憶される。重み付き依存関係情報４２２０において、本質度は、一例として、関係先エンティティへの入次数の逆数で表現される。重み付き依存関係情報４２２０において、たとえば、１行目の例では、関係元エンティティがＣ２、関係先エンティティがＣ１である。関係先エンティティであるＣ１の入次数となる辺の数は１５本であるため、本質度は「１／１５」となる。
【０１８１】
分割部４２０３は、本質度を用いてソフトウェアをクラスタリングする。分割部４２０３は、本質度を用いてソフトウェアのグラフを部分グラフに分割するクラスタリングを実行し、ソフトウェアの分割結果を役割情報４２３０として出力する。また、分割部４２０３は、上述した性質（１）〜（３）を満たすために、クラスタ内の辺の本質度の合計がその期待値より大きくなるように（または、部分グラフに属さない辺の本質度の合計が小さくなるように）クラスタリングを行う。性質（１）〜（３）を満たせば、クラスタを特徴付ける（すなわち、そのクラスタへの合計本質度が高い）エンティティはクラスタ内に含まれることになる。
【０１８２】
分割部４２０３では、性質（１）〜（３）を満たすクラスタリングアルゴリズムとして、つぎに示す技術を拡張したものを用いる。
【０１８３】
（参考文献） M. E. J. Newman (2004). "Fast algorithm for detecting community structure in networks". Physical Review E 69 (6): 066133.
【０１８４】
上記参考文献は、「Ｎｅｗｍａｎのグラフクラスタリングアルゴリズム」または「モジュラリティ最大化アルゴリズム」と呼ばれるアルゴリズムを提案している文献である。当該アルゴリズムは、グラフのクラスタリングの良さを示す尺度であるモジュラリティ評価関数（モジュール性とも呼ばれる）を用い、モジュラリティ評価関数が最大となるクラスタリング（クラスタへの分割）を貪欲法にて探索する。
【０１８５】
ただし、上記アルゴリズムは、モジュラリティ評価関数が「重み無し」「無向」グラフを対象にしたアルゴリズムであるため、そのままでは本実施の形態では利用できない。そこで本実施の形態では、「重み付き」「有向」グラフに利用できるように拡張したモジュラリティ評価関数ＱDWが下記式（２）で定義される。
【０１８６】
【数２】
0005783063.tif 000003
【０１８７】
上記式（２）において、Ａijは、グラフの隣接行列Ａの要素である。添え字のｉは関係元エンティティである頂点の番号、添え字のｊは関係先エンティティである頂点の番号を示す。隣接行列Ａの要素の値は辺の重みであり、非負であり、０より大きい場合は辺有り、０の場合は辺無しを意味する。有向グラフであるため、隣接行列Ａは非対称行列である。
【０１８８】
また、ｋiOUTは、頂点ｉが関係元エンティティとなる辺の重みの合計である。具体的には、下記式（３）により表される。
【０１８９】
ｋOUTi＝ΣjＡij・・・・・・・・・・（３）
【０１９０】
また、ｋjINは、頂点ｊが関係先エンティティとなる辺の重みの合計である。具体的には、下記式（４）により表される。
【０１９１】
ｋjIN＝ΣiＡij・・・・・・・・・・（４）
【０１９２】
また、ｍは、辺の重み（要素Ａij）の合計であり、隣接行列Ａの要素Ａijの総和である。具体的には、下記式（５）により表される。
【０１９３】
ｍ＝ΣiΣjＡij・・・・・・・・・・（５）
【０１９４】
また、ｃiは、頂点ｉが属するクラスタを示す。すべての頂点はいずれかのクラスタに属するものとする。
【０１９５】
δ（ｃi，ｃj）は、クロネッカーのデルタ関数である。すなわち、クラスタｃiとクラスタｃjが同じならばδ（ｃi，ｃj）＝１、異なるならδ（ｃi，ｃj）＝０となる。
【０１９６】
モジュラリティ評価関数ＱDWの値域は［−１，１］となり、大きいほどよいクラスタリングであることを意味し、小さいほど悪いクラスタリングであることを意味する。ただし、実際の上限値と下限値はグラフに依存し、実際には上限値が１近くになることはめったに無い。
【０１９７】
上記式（２）の意図を説明する。クロネッカーのデルタ関数δ（ｃi，ｃj）は、クラスタ内の辺のみを考慮しクラスタ外の辺を無視するための関数である。クロネッカーのデルタ関数δ（ｃi，ｃj）は、各クラスタ内にある辺についての式となる。すなわち、クラスタｃiとクラスタｃjが異なるならδ（ｃi，ｃj）＝０となるため、モジュラリティ評価関数ＱDWへの寄与は０となる。
【０１９８】
隣接行列Ａijは頂点ｉから頂点ｊへの辺の重みである。頂点ｉから辺が出る重み付き確率の期待値はｋiOUT／ｍであり、頂点ｊへ辺が入る重み付き確率の期待値はｋjIN／ｍであるため、エンティティｉからエンティティｊへの辺の重みの期待値は、下記式（６）で表される。
【０１９９】
ｍ・（ｋiOUT／ｍ）・（ｋjIN／ｍ）＝ｋiOUT・ｋjIN／ｍ・・・（６）
【０２００】
上記式（６）の右辺は式（２）の一部である。すなわち、式（２）のモジュラリティ評価関数ＱDWは、各クラスタに属する辺の本質度の合計とその期待値との差をクラスタについて合計したものを、値域が［１，−１］になるように正規化したものである。
【０２０１】
より直観的な表現で表すと、モジュラリティ評価関数ＱDWは、クラスタ内の辺の本質度の合計がその期待値より大きい場合に高くなると言える。言い換えれば、クラスタ内の辺の本質度の密度が高い場合に高くなる、また、クラスタ外の辺の本質度の合計が少ない場合に高くなると言える。
【０２０２】
図４７は、ある有向グラフの分割例を示す説明図である。図４７では、説明を単純化するため、６個の頂点からなる有向グラフを用いて説明する。なお、説明を単純化するため、すべての辺の重みは「１」である。分割例（１）は、グラフを全く分割しない場合で、このとき、ＱDW＝０である。また、分割例（２）は、最適な分割を行った場合で、ＱDW＝０．３６７であり、直感的な分割と一致している。分割例（３）は最適ではないがそれに近い分割で、ＱDW＝０．１２２と最適値からの若干の悪化を示している。
【０２０３】
分割例（４）と分割例（５）は敢えて非合理的な分割を行った例で、この場合、ＱDWは負値となり、数値の悪さと直感が一致している。分割例（６）は完全分割でこのとき、ＱDW＝−０．１６３となり、過度の分割がかえって悪い結果となることが数値として表れている。分割例（１）〜（６）から、直感とモジュラリティ評価関数ＱDWとが整合することがわかる。
【０２０４】
図４８は、図４６に示した重み付き依存関係情報４２２０を用いた場合の隣接行列Ａを示す説明図である。隣接行列Ａの要素Ａijは、関係元エンティティである頂点ｉから関係先エンティティである頂点ｊへの本質度を示している。
【０２０５】
図４９は、図４６に示した重み付き依存関係情報４２２０を用いた場合のエンティティごとに、ｋINjとｋOUTiとを関連付けたパラメータテーブルを示す説明図である。パラメータテーブル４９００は、モジュラリティ評価関数ＱDWの計算途中で生成されるテーブルである。なお、本例では、ｍ＝１０となる。
【０２０６】
本質度を用いたクラスタリングの処理過程について説明する。まず、本質度を用いたクラスタリングの処理過程で用いる記号の定義と表記法について説明する。グラフのすべての頂点の集合をＶとする。頂点はエンティティを示す。頂点は１以上の連番の整数で表し、頂点数をｎとする。すなわち、Ｖ＝｛１，２，…，ｎ｝である。Ｖのある分割をＤで表す。Ｄは、空集合でない互いに素なＶの部分集合Ｓiを要素とする集合であり、Ｄ＝｛Ｓ1，Ｓ2，…，Ｓ|D|｝と表す。｜Ｄ｜は分割Ｄの要素数を意味する。
【０２０７】
このとき、集合Ｖは、下記式（７）によって表される。
【０２０８】
Ｓ1∪Ｓ2∪…∪Ｓ|D|＝Ｖ・・・・・（７）
【０２０９】
頂点ｉがＳxの要素である場合、頂点ｉのクラスタｃiはｘと求まる。すなわち、分割Ｄを定めるとモジュラリティ評価関数ＱDWの値が定まる。この場合、ＱDW（Ｄ）と表す。また、分割Ｄ内の異なる２つの要素Ｓi，Ｓjを併合させたＤ［ｉ，ｊ］を下記式（８）で定義する。
【０２１０】
Ｄ［ｉ，ｊ］＝（Ｄ−｛Ｓi｝−｛Ｓj｝）∪｛Ｓi∪Ｓj｝・・・・・・（８）
【０２１１】
ここで、式（８）中、Ａ−Ｂは集合Ａから集合Ｂの要素を除いた差集合を意味する。ある状態ｋのときの分割Ｄを、Ｄ(k)＝｛Ｓ(k)1，Ｓ(k)2，…，Ｓ(k)|D(k)|｝とする。たとえば、Ｄ＝｛Ｓ1，Ｓ2，Ｓ3，Ｓ4｝において、部分集合Ｓ1，Ｓ2を併合する場合、併合後の分割Ｄ［ｉ，ｊ］は、Ｄ［ｉ，ｊ］＝Ｄ［１，２］＝｛Ｓ1∪Ｓ2，Ｓ3，Ｓ4｝となる。Ｓ1∪Ｓ2は、部分集合Ｓ1，Ｓ2の和集合である。
【０２１２】
図５０は、図４６に示した重み付き依存関係情報４２２０を用いた場合の本質度を用いたクラスタリングの処理過程を示す説明図である。なお、状態ｋでの分割Ｄのモジュラリティ評価関数ＱDWをＱDW（Ｄ(k)）とする。
【０２１３】
（Ａ）は、初期状態（ｋ＝０）の分割Ｄ(0)を示している。初期状態では、１つの頂点が１つのクラスタとなる。この場合のモジュラリティ評価関数ＱDW（Ｄ(0)）は、ＱDW（Ｄ(0)）＝−０．０４５である。この状態から、総当りで２つの部分集合が併合され、併合後のＱDWが最も高くなる併合が採用され、次状態（ｋ＝１）とする。この場合、部分集合｛６｝と｛１４｝の併合が、ＱDWが最も高くなる併合である。
【０２１４】
（Ｂ）は、（Ａ）の次状態（ｋ＝１）の分割Ｄ(1)を示している。この場合のモジュラリティ評価関数ＱDW（Ｄ(1)）は、ＱDW（Ｄ(1)）＝０．０７５である。この状態から、総当りで２つの部分集合が併合され、併合後のＱDWが最も高くなる併合が採用され、次状態（ｋ＝２）とする。この場合、部分集合｛６，１４｝と｛１１｝の併合がＱDWが最も高くなる併合である。
【０２１５】
（Ｃ）は、（Ｂ）の次状態（ｋ＝２）の分割Ｄ(2)を示している。この場合のモジュラリティ評価関数ＱDW（Ｄ(2)）は、ＱDW（Ｄ(2)）＝０．１３８である。この状態から、総当りで２つの部分集合が併合され、併合後のＱDWが最も高くなる併合が採用され、次状態（ｋ＝３）とする。このような処理が繰り返し行われる。
【０２１６】
（Ｄ）は、初期状態から１３回反復された場合のｋ＝１３のときの状態の分割Ｄ(13)を示している。ＱDW（Ｄ(13)）＝０．４８１である。この状態から、総当りで２つの部分集合が併合される。ｋ＝１３では、部分集合｛２，５，６，１１，１４｝と｛１，７，９，１０，１５，１６｝との併合、部分集合｛２，５，６，１１，１４｝と｛３，４，８，１２，１３｝との併合、部分集合｛１，７，９，１０，１５，１６｝と｛３，４，８，１２，１３｝との併合がある。いずれの併合も、ＱDW（Ｄ(13)）＝０．４８１を下回るため、分割Ｄ(13)でクラスタリングが終了する。これにより、ソフトウェアは、３個の部分集合｛２，５，６，１１，１４｝，｛１，７，９，１０，１５，１６｝，｛３，４，８，１２，１３｝に分割されたことになる。
【０２１７】
図５１は、図５０のクラスタリングに基づく役割情報４２３０の一例を示す説明図である。図５０では、３個の部分集合に分割されているため、部分集合｛２，５，６，１１，１４｝はクラスタ番号：１、部分集合｛１，７，９，１０，１５，１６｝にはクラスタ番号：２、部分集合｛３，４，８，１２，１３｝にはクラスタ番号：３が割り当てられている。これにより、たとえば、１行目では、頂点１はクラスタ２に属していることがわかる。なお、役割情報４２３０は、図４９のような表データに限らず、図４８に示した併合過程を木構造表現したデータでもよい。
【０２１８】
図５２は、図５０のクラスタリングに基づく役割情報４２３０の他の例を示す説明図である。図５２のグラフは、図５１の役割情報４２３０による自動分割に従って整理を行った図４３のグラフと同一論理構造のグラフである。図５２において、太い破線の囲みがソフトウェアの分割である。矢印が、太い直線、中間の点線、細い一点鎖線の３種の線で描かれているが、依存関係を本質度の強中弱で分別したものである。図５２のグラフを見ることにより、ユーザは、ソフトウェアの構造が容易に見て取れることがわかる。また、ユーザは、得られた３つの分割が合理的であることもわかる。このように、本実施の形態によれば、上述した性質（１）〜（３）を満たすソフトウェアの分析が実現できる。
【０２１９】
＜分割処理手順例＞
図５３は、実施の形態３にかかる区画単位取得部６０１による分割処理手順例を示すフローチャートである。分析支援装置６００は、関係抽出部４２０１による関係抽出処理（ステップＳ５３０１）、本質度算出部４２０２による本質度算出処理（ステップＳ５３０２）、分割部４２０３によるクラスタリング処理（ステップＳ５３０３）を実行する。これにより、図５１に示したような役割情報４２３０が得られることになる。
【０２２０】
図５４は、図５３に示した関係抽出処理（ステップＳ５３０１）の詳細な処理手順例を示すフローチャートである。まず、分析支援装置６００は、ソフトウェアのソースコードをソースコードＤＢ３００から読み込む（ステップＳ５４０１）。つぎに、分析支援装置６００は、読み込んだソースコードを構文解析技術および静的解析技術を用いて解析する（ステップＳ５４０２）。そして、分析支援装置６００は、解析されたソースコードからエンティティを抽出するとともに（ステップＳ５４０３）、エンティティ間の依存関係を抽出する（ステップＳ５４０４）。
【０２２１】
このあと、分析支援装置６００は、抽出により得られた関係元エンティティと関係先エンティティの組を依存関係情報４２１０のレコードとして格納して（ステップＳ５４０５）、関係抽出処理（ステップＳ５３０１）を終了する。これにより、依存関係情報４２１０が生成される。
【０２２２】
図５５は、図５３に示した本質度算出処理（ステップＳ５３０２）の詳細な処理手順例を示すフローチャートである。まず、分析支援装置６００は、依存関係情報４２１０を読み込み（ステップＳ５５０１）、未選択の関係先エンティティがあるか否かを判断する（ステップＳ５５０２）。未選択の関係先エンティティがある場合（ステップＳ５５０２：Ｙｅｓ）、分析支援装置６００は、未選択の関係先エンティティを１つ選択する（ステップＳ５５０３）。
【０２２３】
そして、分析支援装置６００は、式（１）を用いて、選択エンティティの辺ごとに、本質度を算出する（ステップＳ５５０４）。そして、分析支援装置６００は、辺ごとに算出された本質度を、重み付き依存関係情報４２２０に格納して（ステップＳ５５０５）、ステップＳ５５０２に戻る。ステップＳ５５０２において、分析支援装置６００は、未選択の関係先エンティティがないと判断された場合（ステップＳ５５０２：Ｎｏ）、本質度算出処理（ステップＳ５３０２）を終了する。これにより、重み付き依存関係情報４２２０が生成される。
【０２２４】
図５６は、図５３に示したクラスタリング処理（ステップＳ５３０３）の詳細な処理手順例を示すフローチャートである。まず、分析支援装置６００は、依存関係情報４２１０および重み付き依存関係情報４２２０を読み込み（ステップＳ５６０１）、隣接行列Ａを生成する（ステップＳ５６０２）。また、分析支援装置６００は、隣接行列Ａの要素Ａｉｊである辺の重みを合計することにより、モジュラリティ評価関数ＱDWのパラメータｍの値を算出する（ステップＳ５６０３）。また、分析支援装置６００は、モジュラリティ評価関数ＱDWのパラメータｋiOUT，ｋjIN＝も算出する（ステップＳ５６０４）。
【０２２５】
このあと、分析支援装置６００は、重み付き有向モジュラリティ最大化処理を実行する（ステップＳ５６０５）。重み付き有向モジュラリティ最大化処理（ステップＳ５６０５）では、分析支援装置６００は、モジュラリティ評価関数ＱDWを用いてモジュラリティ評価関数ＱDWの値が最大となるように部分集合を併合していく。重み付き有向モジュラリティ最大化処理（ステップＳ５６０５）の詳細は図５７で説明する。
【０２２６】
そして、分析支援装置６００は、重み付き有向モジュラリティ最大化処理（ステップＳ５６０５）で得られた分割結果を、役割情報４２３０として出力する（ステップＳ５６０６）。たとえば、分析支援装置６００は、役割情報４２３０を重み付き依存関係情報４２２０とともに区画配置処理部６０３に渡す。これにより、クラスタリング処理（ステップＳ５３０３）を終了する。
【０２２７】
図５７は、重み付き有向モジュラリティ最大化処理（ステップＳ５６０５）の詳細な処理手順例を示すフローチャートである。まず、分析支援装置６００は、状態ｋをｋ＝０に設定し、分割Ｄ(k)＝Ｄ(0)＝｛Ｓ(0)1，Ｓ(0)2，…，Ｓ(0)n｝を設定する（ステップＳ５７０１）。つぎに、分析支援装置６００は、｜Ｄ(k)｜＝１であるか否かを判断する（ステップＳ５７０２）。
【０２２８】
｜Ｄ(k)｜＝１でない場合（ステップＳ５７０２：Ｎｏ）、分析支援装置６００は、分割Ｄ(k)に対し、モジュラリティ評価関数ＱDWの値が最大となるｉとｊの組を求め、そのときの分割Ｄ(k)［ｉ，ｊ］をＤ(k+1)とする（ステップＳ５７０３）。そして、分析支援装置６００は、ＱDW（Ｄ(k)）とＱDW（Ｄ(k+1)）とを比較する（ステップＳ５７０４）。そして、ＱDW（Ｄ(k+1)）＞ＱDW（Ｄ(k)）の場合（ステップＳ５７０４：Ｙｅｓ）、まだ、ＱDWが増加できる余地があるとして、分析支援装置６００は、ｋをインクリメントして（ステップＳ５７０５）、ステップＳ５７０２に戻る。図１２に示した内容が、ステップＳ５７０２〜Ｓ５７０５のループに相当する。
【０２２９】
そして、ステップＳ５７０２において、｜Ｄ(k)｜＝１である場合（ステップＳ５７０２：Ｙｅｓ）、これ以上分割する必要がないため、ステップＳ５７０６に移行する。また、ステップＳ５７０４において、ＱDW（Ｄ(k+1)）＞ＱDW（Ｄ(k)）でない場合（ステップＳ５７０４：Ｎｏ）、ＱDWが増加できる余地がないとして、ステップＳ５７０６に移行する。
【０２３０】
ステップＳ５７０６では、分析支援装置６００は、分割Ｄ(k)による分割処理を行う（ステップＳ５７０６）。たとえば、分析支援装置６００は、分割Ｄ(k)を用いて図１３や図１４に示した役割情報４２３０を生成する。これにより、重み付き有向モジュラリティ最大化処理（ステップＳ５６０５）を終了する。
【０２３１】
このように、実施の形態３によれば、ソフトウェアをその構成要素となるエンティティの集合として扱い、ソフトウェアを理解が容易な程度の部分集合に分割することができ、分割精度の向上を図ることができる。また、分割前の既存の業務分類のソフトウェア内のプログラム群が、分割後の各クラスタに含まれることになり、管理者は、既存の業務分類を構成するプログラム群と現状の業務分類を構成するプログラム群との違いを把握することができる。そして、このような役割情報４２３０を用いることにより、役割ごと（クラスタごと）に、構造の乖離を表現した出力結果を得ることができる。したがって、実施の形態３においても乖離の構造の特定の容易化を図ることができる。
【０２３２】
以上説明したように、実施の形態１によれば、より多くの関係先と依存関係がある関係元が第１軸の上流側に配置され、関係先との依存関係がない、または、少ない関係元であるほど第１軸の下流側に配置される。このため、管理者は、第１軸の方向により、関係元から関係先への依存関係の方向を把握することができる。また、第２軸において依存関係が強いプログラムほど、より近接した位置に配置されることになる。このため、管理者は、第２軸の方向により、依存関係のある２つのプログラム間の重要度を把握することができる。
【０２３３】
このように、第１軸と第２軸により規定される区画上の配置によりプログラムの依存関係や重みの強さを表現し、かつ、プログラムの分類を図形の色等で表現することにより、既存の分類が現状の分類を示す役割の中でどのような位置に存在するかが直感的に把握し易くなり、乖離の構造の特定の容易化を図ることができる。また、配置結果のうち、第２軸方向に沿う行内の２つの図形を入れ替えることにより、他の行にまたがる入替を防止することができ、依存関係の方向を維持することができる。
【０２３４】
また、実施の形態２によれば、第３軸の値により区画内のプログラムが入次数および出次数により階層化される。したがって、依存関係の強さに応じてプログラムをグループ化でき、視認性の向上を図ることができる。
【０２３５】
また、実施の形態３によれば、既存の業務分類により区分けされているソフトウェアを、現状の役割にあったクラスタに分割することができるため、管理者は、既存の業務分類を構成するプログラム群と現状の業務分類を構成するプログラム群との違いを把握することができる。そして、このような役割情報を用いることにより、役割ごと（クラスタごと）に、実施の形態１，２で示したように、構造の乖離を表現した出力結果を得ることができる。以上のことから、本発明は、乖離の構造の特定の容易化を図ることができる。
【０２３６】
なお、本実施の形態で説明した方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分析支援プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。
【０２３７】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２３８】
（付記１）ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成する生成部と、
前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、前記生成部によって生成されたエンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように配置する配置部と、
前記配置部によって配置された配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替える入替部と、
前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、前記入替部による入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断する判断部と、
前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定する設定部と、
前記判断部により前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定する決定部と、
前記設定部によって設定された分類情報を、前記決定部によって割当対象に決定された配置結果内の各図形が示すエンティティに割り当てる割当部と、
前記割当部による割当結果を出力する出力部と、
を有することを特徴とする分析支援装置。
【０２３９】
（付記２）前記入替部は、
前記決定部によって決定された配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替えることを特徴とする付記１に記載の分析支援装置。
【０２４０】
（付記３）前記入替部は、
未選択の図形がなくなるまで入れ替えを行うことを特徴とする付記２に記載の分析支援装置。
【０２４１】
（付記４）前記生成部は、
前記分割エンティティ群からの出次数が０のエンティティの削除と当該削除後の分割エンティティ群の各エンティティの出次数および入次数の再計算とを、出次数が０のエンティティが出現しなくなるまで実行する第１の削除処理と、
前記第１の削除処理後の分割エンティティ群からの入次数が０のエンティティの削除と当該削除後の分割エンティティ群についての前記第１の削除処理の実行とを、入次数が０のエンティティが出現しなくなるまで実行する第２の削除処理と、を実行し、
前記第２の削除処理において入次数が０のエンティティが存在しない場合、残存するエンティティを上位に配列させ、前記第１の削除処理により先に削除されたエンティティほど下位に配列させることにより、前記エンティティ列を生成することを特徴とする付記１〜３のいずれか一つに記載の分析支援装置。
【０２４２】
（付記５）前記生成部は、
前記第１の削除処理または前記第２の削除処理において削除されるまでに削除から除外された除外回数をエンティティごとに計数し、計数された前記除外回数の多さに応じた前記平面に交差する第３軸の値を各エンティティに対応付け、
前記配置部は、
前記配置結果内の各図形が示すエンティティに対応付けられた前記第３軸の値に基づいて、前記各図形を前記第３軸の方向に伸ばした立体図形に変換した配置結果を生成することを特徴とする付記４に記載の分析支援装置。
【０２４３】
（付記６）前記ソフトウェアの構成要素であるエンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記ソフトウェアの対応情報を参照して、前記ソフトウェアの対応情報により特定される前記依存関係の重要度を示す重みに基づいて、前記依存関係の重要度を示す重みの第１の合計が、各エンティティが前記関係元となる場合の前記依存関係の重要度を示す重みの第２の合計と前記各エンティティが前記関係先となる場合の前記依存関係の重要度を示す重みの第３の合計とに基づいて得られる前記第１の合計の期待値よりも高くなるように、前記エンティティ群を分割することにより、前記複数の分割エンティティ群を取得する取得部を有し、
前記生成部は、
前記取得部によって取得された前記複数の分割エンティティ群のいずれかの分割エンティティ群の前記対応情報を参照し、前記各エンティティの出次数と入次数を算出することにより、前記エンティティ列を生成することを特徴とする付記１〜５のいずれか一つに記載の分析支援装置。
【０２４４】
（付記７）前記取得部は、
各々エンティティを有する部分グラフの集合の中から選ばれた複数の部分グラフを併合し、前記部分グラフの集合について各部分グラフに含まれる前記依存関係の重要度を示す重みの前記第１の合計と前記第１の合計の期待値との差を前記各部分グラフについて合計した評価関数の値を、併合前後の部分グラフの集合について求め、併合前よりも併合後の評価関数の値が大きくなる併合がある場合に、併合後の部分グラフの集合を前記複数の分割エンティティ群として取得することを特徴とする付記６に記載の分析支援装置。
【０２４５】
（付記８）前記ソフトウェアの対応情報を参照して、前記関係先に対して前記依存関係がある前記関係元の個数に基づいて、前記関係元が当該関係元の役割を果たすために前記依存関係がどの程度重要であるかを示す、前記関係元についての前記関係先に関する本質度を算出する本質度算出部を有し、
前記取得部は、
前記本質度算出部によって算出された本質度を前記依存関係の重要度を示す重みとして用いることにより、前記エンティティ群を分割することにより、前記複数の分割エンティティ群を取得することを特徴とする付記６または７に記載の分析支援装置。
【０２４６】
（付記９）コンピュータが、
ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成し、
前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、生成された前記エンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように配置し、
配置された前記配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替え、
前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断し、
前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定し、
前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定し、
設定された前記分類情報を、前記割当対象に決定された配置結果内の各図形が示すエンティティに割り当て、
割当結果を出力する、
処理を実行することを特徴とする分析支援方法。
【０２４７】
（付記１０）ソフトウェアの構成要素であるエンティティ群から分割された複数の分割エンティティ群のいずれかの分割エンティティ群について関係元のエンティティが関係先のエンティティに依存する依存関係と当該依存関係の重要度を示す重みとを対応付けた前記分割エンティティ群の対応情報を参照して、各エンティティの出次数と入次数を算出することにより、前記関係元のエンティティが前記関係先のエンティティよりも上位に配列されるエンティティ列を生成し、
前記関係元を上流とし前記関係先を下流とした場合に上流から下流に向かう依存方向を示す第１軸と、前記重みを示す第２軸と、により規定される平面の区画に対し、生成された前記エンティティ列の各エンティティを示す図形を、前記エンティティ列の上位から抽出して、前記第２軸の方向に沿い、かつ、前記第２軸の方向に沿って配置される図形の列が前記依存方向の上流から下流に向かうように配置し、
配置された前記配置結果のうち前記第２軸の方向に配置されている図形の列の中から選ばれた２つの図形を入れ替え、
前記依存関係の重要度を示す重みと、前記依存関係により特定される前記関係元のエンティティから前記関係先のエンティティまでの前記第２軸の方向に関する距離と、に基づく、前記依存関係の強さを示す依存関係ごとのスコアの総和を、入替前後の配置結果の各々について求め、入替後の総和が入替前の総和を下回ったか否かを判断し、
前記分割エンティティ群の各エンティティに含まれる属性に応じた分類情報を設定し、
前記入替後の総和が前記入替前の総和を下回った場合は入替後の配置結果を前記分類情報の割当対象に決定し、前記入替後の総和が前記入替前の総和を下回っていない場合は入替前の配置結果を前記分類情報の割当対象に決定し、
設定された前記分類情報を、前記割当対象に決定された配置結果内の各図形が示すエンティティに割り当て、
割当結果を出力する、
処理をコンピュータに実行させるための分析支援プログラム。
【符号の説明】
【０２４８】
１００  ソフトウェア
３０１  依存関係情報
５００  既存分類情報
６００  分析支援装置
６０１  区画単位取得部
６０２  設定部
６０３  区画配置処理部
６０４  分類処理部
６１０  出力結果
６３１  生成部
６３２  配置部
６３３  入替部
６３４  判断部
６４１  決定部
６４２  割当部
６４３  出力部
７００  依存関係情報
８００  役割情報
１０００  分類情報
１１００  出次数・入次数テーブル
１６００  スコア算出テーブル
４２０１  関係抽出部
４２０２  本質度算出部
４２０３  分割部
【図１】
0005783063.tif 000004
【図２】
0005783063.tif 000005
【図３】
0005783063.tif 000006
【図４】
0005783063.tif 000007
【図５】
0005783063.tif 000008
【図６】
0005783063.tif 000009
【図７】
0005783063.tif 000010
【図８】
0005783063.tif 000011
【図９】
0005783063.tif 000012
【図１０】
0005783063.tif 000013
【図１１】
0005783063.tif 000014
【図１２】
0005783063.tif 000015
【図１３】
0005783063.tif 000016
【図１４】
0005783063.tif 000017
【図１５】
0005783063.tif 000018
【図１６】
0005783063.tif 000019
【図１７】
0005783063.tif 000020
【図１８】
0005783063.tif 000021
【図１９】
0005783063.tif 000022
【図２０】
0005783063.tif 000023
【図２１】
0005783063.tif 000024
【図２２】
0005783063.tif 000025
【図２３】
0005783063.tif 000026
【図２４】
0005783063.tif 000027
【図２５】
0005783063.tif 000028
【図２６】
0005783063.tif 000029
【図２７】
0005783063.tif 000030
【図２８】
0005783063.tif 000031
【図２９】
0005783063.tif 000032
【図３０】
0005783063.tif 000033
【図３１】
0005783063.tif 000034
【図３２】
0005783063.tif 000035
【図３３】
0005783063.tif 000036
【図３４】
0005783063.tif 000037
【図３５】
0005783063.tif 000038
【図３６】
0005783063.tif 000039
【図３７】
0005783063.tif 000040
【図３８】
0005783063.tif 000041
【図３９】
0005783063.tif 000042
【図４０】
0005783063.tif 000043
【図４１】
0005783063.tif 000044
【図４２】
0005783063.tif 000045
【図４３】
0005783063.tif 000046
【図４４】
0005783063.tif 000047
【図４５】
0005783063.tif 000048
【図４６】
0005783063.tif 000049
【図４７】
0005783063.tif 000050
【図４８】
0005783063.tif 000051
【図４９】
0005783063.tif 000052
【図５０】
0005783063.tif 000053
【図５１】
0005783063.tif 000054
【図５２】
0005783063.tif 000055
【図５３】
0005783063.tif 000056
【図５４】
0005783063.tif 000057
【図５５】
0005783063.tif 000058
【図５６】
0005783063.tif 000059
【図５７】
0005783063.tif 000060