以下に図面を参照して、本発明にかかる分析支援プログラム、分析支援装置および分析支援方法の実施の形態を詳細に説明する。
(実施の形態1)
図1は、実施の形態1にかかる分析支援方法の一実施例を示す説明図である。図1において、分析支援装置100は、ソフトウェアSWの分析を支援するコンピュータである。ソフトウェアSWは、分析対象となるコンピュータプログラムであり、複数種類に分類された複数の構成要素Cを含む。
構成要素Cは、例えば、コンポーネント、モジュール、ソースコード、クラス、関数、データベース、ファイルなどである。構成要素Cの種類とは、ソフトウェアSWの設計時に構成要素Cに与えられる種類である。構成要素Cの種類は、例えば、Java(登録商標)のパッケージ名、C言語等でのソースファイルのディレクトリ構成、ドキュメント上に記述される業務や機能を分類する命名規約などによって分類される。
ここで、ソフトウェアSWを開発・改良・保守するためにはソフトウェアSWの理解が重要となる一方で、ソフトウェアSWが大規模になればなるほど、ソフトウェアSWの構造は複雑なものとなる。このため、ソフトウェアSWの構造の把握を容易にすべく、ソフトウェアSWを小規模な部分集合に分割することが行われる場合がある。
また、長期間運用しているソフトウェアSWでは、業務に合わせてソフトウェアSW内のプログラムの修正等が行われる。この際、多くの場合、プログラム間の依存関係が変化するため、ソフトウェアSW内のプログラム群を区分する業務分類をより管理しやすく定義し直したほうが管理を効率化できることがある。
このため、長期間運用している現状のソフトウェア資産を管理する上で、設計当初等の既存の業務分類と現状の業務分類とを比較して乖離の有無や乖離の構造の相違を調べることが行われる。「乖離の構造」とは、既存の業務分類と現状の業務分類との間に存在する乖離の仕方を示す指標である。
本実施の形態では、分析支援装置100は、既存の業務分類を、ソフトウェアSW内の構成要素群Gを管理しやすい業務分類に修正する是正処置を行う方法を判断するために、既存の業務分類と現状の業務分類との乖離の構造を特定するための情報を提供する。以下、分析支援装置100の分析処理例について説明する。
(1)分析支援装置100は、ソフトウェアSW内の複数の構成要素Cから分割した構成要素群Gの構成要素間の依存関係に基づいて、構成要素列Lを作成する。ここで、構成要素間の依存関係とは、例えば、コンポーネント、モジュール、ソースコード、クラス、関数などのプログラム間の呼出関係、継承関係、包含関係やデータアクセス関係などである。
構成要素群Gは、ソフトウェアSWに含まれる複数の構成要素Cの構成要素間の依存関係に基づいて、複数の構成要素Cから分割される構成要素Cの集合である。構成要素列Lは、構成要素群Gのうちの関係元の構成要素Cを関係先の構成要素Cよりも上位に配置し、各構成要素Cにランクrを付与した配列である。
ランクrは、構成要素群Gの構成要素間の依存関係の連鎖の大本となる構成要素Cとの関係度合いを示す情報である。例えば、ランクrは、構成要素群Gにおいて、あるプログラムが、プログラム間の依存関係の連鎖の大本となる呼出元のプログラムにどれだけ近いかを示す数値である。ここでは、ランクrは、構成要素間の依存関係の連鎖の大本となる関係元の構成要素Cに近いほど大きな値となる。
図1の例では、ソフトウェアSW内の複数の構成要素Cから分割した構成要素群G1の構成要素間の依存関係に基づいて、構成要素列L1が作成されている。
(2)分析支援装置100は、作成した構成要素列Lのうちの同一ランクrの構成要素集合Aごとに、構成要素集合Aに含まれる構成要素Cの種類が構成要素集合Aの中で占める割合pを算出する。ここで、構成要素集合Aは、同一ランクrの構成要素Cの集合、例えば、プログラム間の呼出関係の連鎖の大本となるプログラムとの関係度合いが同一のプログラムの集合である。
具体的には、例えば、分析支援装置100は、構成要素集合Aに含まれる構成要素Cの種類ごとに、構成要素集合Aに含まれる当該種類の構成要素Cの数を、構成要素集合Aに含まれる構成要素Cの総数で割ることにより割合pを算出する。これにより、構成要素集合Aにおいて、ある種類の構成要素Cが支配的である、あるいは、種々の構成要素Cが混在しているといった構成要素集合Aの特性を抽出することができる。
図1の例では、構成要素列L1を同一ランクrの構成要素Cで区分けすることにより、構成要素群G1が構成要素集合A1〜A5によって階層構造化され、各構成要素集合A1〜A5の特性が抽出される。ただし、構成要素集合A1〜A5は、ランクrが降順となるように並べたものである。
これにより、階層構造化された構成要素群G1の各階層(構成要素集合A1〜A5)において、ある種類の構成要素Cが支配的である、あるいは、種々の構成要素Cが混在しているといった特性を抽出することができる。
(3)分析支援装置100は、算出した算出結果に基づいて、構成要素群Gの構造種別を決定する。具体的には、例えば、分析支援装置100は、構成要素群Gの構造種別を、単種構造、階層構造、上部単種構造、下部単種構造および混在構造いずれかの構造種別に決定する。
ここで、単種構造は、同一種類の構成要素Cにより形成される構造である。階層構造は、2種類以上の構成要素Cにより階層化される構造である。上部単種構造は、同一種類の構成要素Cにより上位層が形成され、種々の構成要素Cにより無秩序に下位層が形成される構造である。下部単種構造は、種々の構成要素Cにより無秩序に上位層が形成され、同一種類の構成要素Cにより下位層が形成される構造である。混在構造は、種々の構成要素Cにより無秩序に形成される構造である。
例えば、階層構造化された構成要素群G1の全階層(構成要素集合A1〜A5)において、ある種類の構成要素Cが支配的であるという特性が抽出された場合、分析支援装置100は、構成要素群G1の構造種別を「単種構造」に決定する。
以上説明したように、実施の形態1にかかる分析支援装置100によれば、階層構造化された構成要素群Gの各階層の特徴を抽出して構成要素群Gの構造種別を決定することができる。これにより、ソフトウェアSWから分割される構成要素群Gの構造を定量的、客観的に判断することが可能となり、既存の業務分類と現状の業務分類との乖離の構造の相違を判断しやすくしてソフトウェアSWの構造の理解を支援することができる。
(実施の形態2)
つぎに、実施の形態2にかかる分析支援装置100について説明する。実施の形態2では、ソフトウェアSWの構成要素Cとして、コンポーネント、モジュール、ソースコード、クラス、関数などのプログラムを例に挙げて説明する。また、プログラムの種類を「既存分類K」と表記する場合がある。なお、実施の形態1で説明した箇所と同様の箇所については説明を省略する。
(分析支援装置100のハードウェア構成例)
図2は、分析支援装置100のハードウェア構成例を示すブロック図である。図2において、分析支援装置100は、CPU(Central Processing Unit)201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、ディスクドライブ204と、ディスク205と、I/F(Interface)206と、キーボード207と、マウス208と、ディスプレイ209と、を有する。また、各構成部はバス200によってそれぞれ接続される。
ここで、CPU201は、分析支援装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶する。RAM203は、CPU201のワークエリアとして使用される。ディスクドライブ204は、CPU201の制御に従ってディスク205に対するデータのリード/ライトを制御する。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する。ディスク205には、例えば、磁気ディスク、光ディスクなどを採用することができる。
I/F206は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク210に接続され、ネットワーク210を介して他のコンピュータに接続される。そして、I/F206は、ネットワーク210と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。I/F206には、例えば、モデムやLANアダプタなどを採用することができる。
キーボード207は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。キーボード207は、例えば、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス208は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。
ディスプレイ209は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ209には、例えば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。なお、分析支援装置100は、上述した構成部のほか、例えば、SSD(Solid State Drive)、スキャナ、プリンタなどを有することにしてもよい。
(ソースコードDB300の記憶内容)
つぎに、分析支援装置100が有するソースコードDB(データベース)300の記憶内容について説明する。ソースコードDB300は、例えば、図2に示したRAM203、ディスク205などの記憶装置により実現される。
図3は、ソースコードDB300の記憶内容の一例を示す説明図である。図3において、ソースコードDB300は、分析対象となるソフトウェアSWと依存関係情報310を記憶する。ソフトウェアSWは、プログラム群301〜304を有する。図3では、説明の便宜上、プログラム群301〜304の各プログラムを図形により表示する。
図3の例では、ソフトウェアSWは、金融システムのソフトウェアである。ソフトウェアSWは、新規発行系のプログラム群301と、失効処理系のプログラム群302と、管理系のプログラム群303と、プログラム群301〜303に共通して利用される共通処理のプログラム群304と、に分類されている。
新規発行系、失効処理系、管理系および共通処理が業務分類に相当する。すなわち、ソフトウェアSWは、設計当初などの既存の業務分類により分類されている。具体的には、プログラム群301は、新規発行系のプログラムa1〜a15である。また、プログラム群302は、失効処理系のプログラムb1〜b32である。また、プログラム群303は、管理系のプログラムc1〜c23である。また、プログラム群304は、共通処理のプログラムd1〜d12である。
各プログラムに付した符号の先頭のアルファベットは、プログラムの先頭1文字目に出現する既存の業務分類に応じたプログラム名による命名規約を示す。例えば、「a」は新規発行系を特定する命令規約、「b」は失効処理系を特定する命令規約、「c」は管理系を特定する命令規約、「d」は共通処理を特定する命令規約を示す。
依存関係情報310は、ソフトウェアSWに含まれるプログラム間の依存関係を示す情報である。ここで、依存関係情報310の具体例について説明する。
図4は、依存関係情報310の具体例を示す説明図である。図4において、依存関係情報310は、関係元のプログラムと関係先のプログラムとを対応付けて示す情報である。例えば、依存関係が呼び出し関係を示している場合、関係元が「c1」、関係先が「c2」の例では、プログラムc1がプログラムc2を呼び出していることになる。
(既存分類情報テーブル500の記憶内容)
つぎに、分析支援装置100が有する既存分類情報テーブル500の記憶内容について説明する。既存分類情報テーブル500は、既存の業務分類に関する情報を、ソフトウェアSW内の各プログラムに関連付けるための情報である。既存分類情報テーブル500は、例えば、RAM203、ディスク205などの記憶装置により実現される。
図5は、既存分類情報テーブル500の記憶内容の一例を示す説明図である。図5において、既存分類情報テーブル500は、既存業務分類名および命名規約のフィールドを有し、各フィールドに情報を設定することで、既存分類情報500−1〜500−4をレコードとして記憶する。
既存業務分類名は、既存の業務分類の名称である。命名規約は、既存の業務分類に応じた命名規約である。ここでは、ソフトウェアSW内の各プログラムの分類基準をプログラム名による命名規約とし、各プログラムは、プログラム名の先頭1文字によって分類される。例えば、先頭1文字が「a」のプログラムは、新規発行系に分類される。
既存分類情報500−1は、新規発行系のプログラムの命名規約「a」を示す。既存分類情報500−2は、失効処理系のプログラムの命名規約「b」を示す。既存分類情報500−3は、管理系のプログラムの命名規約「c」を示す。既存分類情報500−4は、共通処理のプログラムの命名規約「d」を示す。
(役割情報600の具体例)
つぎに、分析支援装置100が用いる役割情報600の具体例について説明する。
図6は、役割情報600の具体例を示す説明図である。図6において、役割情報600は、ソフトウェアSWに含まれるプログラム群301〜304を、複数のクラスタにクラスタ化した情報である。役割G1〜G3がクラスタCL1〜CL3となる。役割とは、ソフトウェアSWに含まれるプログラム間の依存関係を分析して得られるモジュールの単位である。
例えば、役割G1〜G3のうち新規発行系のプログラム数が最も多いのは役割G2であるため、利用者は、役割G2を現状の新規発行系と解釈することができる。また、利用者は、プログラム数ではなく、重要なプログラムが存在するクラスタを、その重要なプログラムを有する分類として解釈することもできる。例えば、失効処理系のプログラムb1〜b32のうち、b28〜b32が失効処理系の機能を実現するために必要不可欠なプログラムであることが分かっている場合、利用者は、役割G3を現状の失効処理系と解釈することができる。
(分析支援装置100の機能的構成例)
図7は、分析支援装置100の機能的構成例を示すブロック図である。図7において、分析支援装置100は、取得部701と、分割部702と、作成部703と、算出部704と、決定部705と、出力部706と、を含む構成である。取得部701〜出力部706は制御部となる機能であり、具体的には、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F206により、その機能を実現する。各機能部の処理結果は、例えば、RAM203、ディスク205などの記憶装置に記憶される。
取得部701は、分析対象となるソフトウェアSWおよび依存関係情報310を取得する機能を有する。具体的には、例えば、取得部701は、図2に示したキーボード207やマウス208を用いた利用者の操作入力により、ソフトウェアSWおよび依存関係情報310を取得する。取得されたソフトウェアSWおよび依存関係情報310は、例えば、図3に示したソースコードDB300に記憶される。
また、取得部701は、ソフトウェアSWに含まれるプログラム間の依存関係を抽出することにより、依存関係情報310を取得することにしてもよい。具体的には、例えば、取得部701は、既存の構文解析技術および静的解析技術により、ソフトウェアSWのソースコードを解析することにより、プログラム間の依存関係を抽出することができる。
分割部702は、ソフトウェアSWに含まれるプログラム間の依存関係に基づいて、ソフトウェアSWに含まれる複数のプログラムからプログラム群Gを分割する機能を有する。具体的には、例えば、分割部702は、ソフトウェアSWのソースコードおよび依存関係情報310に基づいて、ソフトウェアSW内のプログラム群301〜304を複数のクラスタにクラスタ化することにより、図6に示した役割情報600を分割結果として出力する。
クラスタは、例えば、ソフトウェアSWをグラフで表現し、当該グラフを分割するクラスタリングを実行することで得られる部分グラフに属するプログラムの集合であり、プログラム群Gに相当する。クラスタ化の手法としては、既存の任意の手法を用いることができる。
以下の説明では、ソフトウェアSWから分割されるプログラム群Gを「役割G」と表記する場合がある。また、ソフトウェアSWから分割される複数の役割Gを「役割G1〜Gn」と表記し、役割G1〜Gnのうちの任意の役割Gを「役割Gi」と表記する場合がある(i=1,2,…,n)。
作成部703は、役割Gi内のプログラム間の依存関係に基づいて、プログラム列Liを作成する機能を有する。ここで、プログラム列Liは、役割Giのうちの呼出元のプログラムを呼出先のプログラムよりも上位に配置し、各プログラムにランクrを付与した配列である。
ランクrは、役割Giにおいて、あるプログラムが、プログラム間の依存関係の連鎖の大本となる呼出元のプログラムにどれだけ近いかを示す数値である。ここでは、ランクrは、プログラム間の依存関係の連鎖の大本となる呼出元のプログラムに近いほど大きな値となる。すなわち、プログラム間の依存関係の連鎖の大本となる呼出元のプログラムに付与されるランクrが最大となる。
具体的には、例えば、作成部703は、依存関係情報310および役割情報600を参照して、各役割G1〜G3内のプログラム間の依存関係に基づいて、各役割G1〜G3のプログラム列L1〜L3を作成する。なお、プログラム列Liの具体例については、図9を用いて後述する。また、プログラム列Liの作成例については、図18〜図22を用いて後述する。
以下の説明では、プログラム列Liに含まれる同一ランクrごとのプログラム集合Aを「プログラム集合A1〜Am」と表記し、プログラム集合A1〜Amのうちの任意のプログラム集合を「プログラム集合Aj」と表記する場合がある(j=1,2,…,m)。
算出部704は、作成されたプログラム列Liのうちの同一ランクrのプログラム集合Ajごとに、プログラム集合Ajに含まれる既存分類Kの占有率pを算出する機能を有する。ここで、占有率pは、プログラム集合Ajの中で既存分類Kのプログラムが占める割合である。
具体的には、例えば、算出部704は、プログラム集合Ajに含まれる既存分類Kのプログラムの数を、プログラム集合Aに含まれるプログラムの総数で割ることにより、既存分類Kごとの占有率pを算出する。なお、既存分類Kの占有率pの算出例については、図10を用いて後述する。
また、算出部704は、プログラム集合Ajの中に出現する既存分類Kを出現順に重複なく並べた既存分類列Ejを生成することにしてもよい。ここで、既存分類列Ejは、プログラム集合Ajの中に出現する既存分類K、すなわち、プログラムの種類を出現順に重複なく並べた種類列である。
また、上述した実施の形態1では、構成要素集合A(プログラム集合A)に含まれる構成要素C(プログラム)の並びを考慮しない場合について説明したが、実施の形態2では、各プログラム集合A1〜Amに含まれる同一ランクrのプログラムは、統一的な価値基準に基づき意味のある順に並べられているものとする。例えば、プログラム間の依存関係の重みに基づいて、関係の近いプログラム同士は近く、関係の遠いプログラム同士は遠くに位置するという順序が与えられる。
重みとは、関係元とその関係先との依存関係の重要度を示す指標である。重みは、その値が大きいほど重要であることを示す。重みとしては、例えば、予め、関係元のプログラム、関係先のプログラム、または、依存関係に対して付与された値が用いられる。例えば、新規発行系のプログラム群301の中で重要な機能を実現するプログラムについてはそうでないプログラムよりも重みの値が大きく設定される。
具体的には、例えば、算出部704は、プログラム集合Ajの中に出現する既存分類Kを出現順に重複なく本筋バッファMBに格納することにより既存分類列Ejを生成する。本筋バッファMBは、例えば、RAM203、ディスク205などの記憶装置により実現される。なお、既存分類列Ejの生成例については、図10を用いて後述する。
また、算出部704は、プログラム集合Ajの中に出現する既存分類Kの数に基づいて、プログラム集合Ajの混在度cを算出することにしてもよい。ここで、混在度cとは、プログラム集合Ajの中の既存分類Kの混在度合いを示す指標値である。具体的には、例えば、算出部704は、本筋バッファMBに格納された既存分類Kの数から「1」を減じた値を混在度cとして算出する。なお、混在度cの算出例については、図10を用いて後述する。
決定部705は、算出された算出結果に基づいて、役割Giの構造種別を決定する機能を有する。ここで、役割Giの構造種別とは、役割Giが、単一あるいは複数の既存分類Kのプログラムによってどのように構成されているかを判別するためのものである。
具体的には、例えば、決定部705は、役割Giの構造種別を、図8に示すような単種構造、階層構造、上部単種構造、下部単種構造、混在構造および複数種構造のいずれかの構造種別に決定する。ここで、図8を用いて、役割Giの構造種別の一例について説明する。
図8は、構造種別の一例を示す説明図である。図8において、「単種構造」は、同一種類の既存分類Kのプログラムにより形成される構造を示す。すなわち、「単種構造」は、役割Giを構成するプログラムが特定の既存分類Kからなっていることを示す。「単種構造」は、役割Giが設計当初の業務分類が実態としても機能していることを意味し、保守性の観点から望ましい状態であることを意味する。
「階層構造」は、2種類以上の既存分類Kのプログラムにより階層化される構造を示す。すなわち、「階層構造」は、既存分類間に上位下位という依存関係が発生して一つの業務分類上の機能を実現していることを示す。「階層構造」は、保守性として極端に悪いとはいえないが、設計当初の業務分類を見直す余地があることを意味する。
「上部単種構造」は、同一種類の既存分類Kのプログラムにより上位層が形成され、種々の既存分類Kのプログラムにより無秩序に下位層が形成される構造を示す。すなわち、「上部単種構造」は、役割Giの上部に位置するプログラムが処理を振り分けて下部に位置する様々なプログラムを呼び出すディスパッチ的な構造になっていることを示す。「上部単種構造」は、役割Giの上位層を基準にして設計当初の業務分類を見直すことが望ましいことを意味する。
「下部単種構造」は、種々の既存分類Kのプログラムにより無秩序に上位層が形成され、同一種類の既存分類Kのプログラムにより下位層が形成される構造を示す。すなわち、「下部単種構造」は、役割Giの下部に共通ルーチンがあり、複数の業務分類から呼び出される構造になっていることを示す。「下部単種構造」は、役割Giの下位層を基準にして設計当初の業務分類を見直すことが望ましいことを意味する。
「混在構造」は、種々の既存分類Kのプログラムにより無秩序に形成される構造を示す。すなわち、「混在構造」は、既存分類Kと無関係にプログラムが集まって機能を構成していることを示す。「混在構造」は、ソフトウェアSWの再設計を検討することが望ましいことを意味する。
「複数種構造」は、互いに依存関係の少ない2種類以上の既存分類Kのプログラムにより形成される構造を示す。すなわち、「複数種構造」は、複数の既存分類Kが同一役割内に存在しているが互いの依存関係は少ないことを示す。「複数種構造」は、複数の既存分類Kが集まって一つの役割Giを実現しているが、互いの絡み合いは少なく、「混在構造」の場合ほど保守性の懸念が大きくないことを意味する。
具体的には、例えば、まず、決定部705は、プログラム集合Ajごとに、占有率pが閾値α以上となる既存分類Kが存在するか否かを判定する。閾値αは、プログラム集合Ajにおける支配的な既存分類Kを判別するための値であり、例えば、0.8程度の値に設定される。閾値αは、予め設定されてROM202、RAM203、ディスク205などの記憶装置に記憶される。
そして、決定部705は、例えば、下記条件(i)を満たす場合に、役割Giの構造種別を単種構造に決定する。
(i)プログラム集合A1〜Amの全てに占有率pが閾値α以上となる既存分類Kが存在し、かつ、プログラム集合A1〜Amの全てで占有率pが閾値α以上となる既存分類Kが同一である。
また、決定部705は、例えば、下記条件(ii)を満たす場合に、役割Giの構造種別を階層構造に決定する。
(ii)プログラム集合A1〜Amの全てに占有率pが閾値α以上となる既存分類Kが存在し、かつ、占有率pが閾値α以上となる既存分類Kが少なくともいずれかのプログラム集合間で異なる。
また、決定部705は、例えば、下記条件(iii)を満たす場合に、役割Giの構造種別を上部単種構造に決定する。
(iii)プログラム集合A1〜Amのうち最上位のプログラム集合Aから第1のプログラム集合Aまで連続して特定の既存分類Kの占有率pが閾値α以上となり、かつ、第1のプログラム集合Aよりも下位のプログラム集合Aの全てに占有率pが閾値α以上となる既存分類Kが存在しない。
ここで、第1のプログラム集合Aは、例えば、プログラム集合A1〜Amの上位30%程度のプログラム集合Aのうちの最下位のプログラム集合Aである。上記条件(iii)によれば、プログラム集合A1〜Amの上位30%程度までは最上位と同じ既存分類Kが支配的であり、それ以降は、種々の既存分類Kが無秩序に混在していることを判別することができる。
また、決定部705は、例えば、下記条件(iv)を満たす場合に、役割Giの構造種別を下部単種構造に決定する。
(iv)プログラム集合A1〜Amのうち最上位のプログラム集合Aから第2のプログラム集合Aまで連続して占有率pが閾値α以上となる既存分類Kが存在せず、かつ、第2のプログラム集合Aよりも下位のプログラム集合Aの全てで特定の既存分類Kの占有率pが閾値α以上となる。
ここで、第2のプログラム集合Aは、例えば、プログラム集合A1〜Amの上位70%程度のプログラム集合Aのうちの最下位のプログラム集合Aである。上記条件(iv)によれば、プログラム集合A1〜Amの上位70%程度までは種々の既存分類Kが無秩序に混在しており、それ以降は、特定の既存分類Kが支配的であることを判別することができる。
また、決定部705は、例えば、下記条件(v)を満たす場合に、役割Giの構造種別を複数種構造に決定する。
(v)プログラム集合A1〜Amの少なくともいずれかのプログラム集合Aに占有率pが閾値α以上となる既存分類Kが存在せず、かつ、プログラム集合A1〜Amの全てで混在度cが閾値β以上となり、かつ、プログラム集合A1〜Amの全てで既存分類列E1〜Emが一致する。
閾値βは、予め設定されてROM202、RAM203、ディスク205などの記憶装置に記憶されている。例えば、閾値βは、2程度の値に設定される。
また、決定部705は、例えば、上記条件(i)〜(v)のいずれの条件も満たさない場合に、役割Giの構造種別を混在構造に決定する。
出力部706は、決定された決定結果を出力する機能を有する。具体的には、例えば、出力部706は、後述する図12に示すような構造種別リストLTを出力することにしてもよい。出力部706の出力形式としては、例えば、RAM203、ディスク205などの記憶装置への記憶、ディスプレイ209への表示、I/F206による外部のコンピュータへの送信、不図示のプリンタへの印刷出力などがある。
なお、上述した説明では、分割部702が、ソフトウェアSWのソースコードと依存関係情報310から役割情報600を出力することにしたが、これに限らない。具体的には、例えば、分析支援装置100は、外部のコンピュータから役割情報600を取得することにしてもよい。
また、上述した説明では、作成部703が、役割Giのプログラム列Liを作成することにしたが、これに限らない。具体的には、例えば、分析支援装置100は、外部のコンピュータから役割G1のプログラム列Li(例えば、後述する図9参照)を取得することにしてもよい。
(プログラム列Liの具体例)
ここで、プログラム列Liの具体例について説明する。ここでは、役割G1(図6参照)のプログラム列L1を例に挙げて説明する。
図9は、プログラム列Liの具体例を示す説明図である。図9において、プログラム列L1は、役割G1のうちの呼出元のプログラムを呼出先のプログラムよりも上位に配置し、各プログラムにランクrを付与した配列である。オーダーは、プログラム列L1における各プログラムの順序を示す。プログラム名は、各プログラムの名称である。ランクは、各プログラムに付与されたランクrである。
プログラム列L1では、ランクrが最大のプログラムc1とc4が呼出関係の連鎖の大本に存在する。また、ランクrが最小のプログラムa2,a3,b3,b5,b7,b11,b14,c3,c7,c8が、最も呼出先側に位置し、それ以上の呼出先が(役割G1内には)存在しない。
(プログラム集合Ajの特性値の抽出例)
つぎに、役割G1のプログラム列L1を例に挙げて、プログラム列L1に含まれる同一ランクrのプログラム集合Ajの特性値の抽出例について説明する。ここで、プログラム集合Ajの特性値とは、「既存分類Kの占有率p」、「既存分類列Ej」および「混在度c」である。
まず、算出部704は、プログラム列L1のうちの同一ランクrのプログラムを並べたプログラム集合Ajを示す配列データを、ランクrが降順となるように並べた2次元配列データ(例えば、図10に示す2次元配列データ1000)を作成する。ここで、2次元配列データの具体例について説明する。
図10は、2次元配列データの具体例を示す説明図である。図10において、2次元配列データ1000は、プログラム列L1のうちの同一ランクrのプログラム(プログラム名)を並べたプログラム集合A1〜A9を示す配列データ1000−1〜1000−9を、ランクrが降順となるように並べた情報である。
例えば、配列データ1000−1は、ランクrが最大のプログラムc1,c4を並べたプログラム集合A1を示す。また、例えば、配列データ1000−9は、ランクrが最小のプログラムa2,a3,b3,b5,b7,b11,b14,c3,c7,c8を並べたプログラム集合A9を示す。
以下の説明では、同一ランクrの要素(プログラム)が並んでいる方向を「横方向」あるいは「水平方向」と表記し、ランクrの異なる方向を「縦方向」あるいは「垂直方向」と表記する場合がある。また、記法[]は配列を表す。
つぎに、算出部704は、作成した2次元配列データ1000に含まれる配列データ1000−1〜1000−9ごとの特性値を抽出する。ここで、配列データ1000−1を例に挙げて、配列データ1000−1の特性値の抽出例について説明する。
具体的には、例えば、算出部704は、配列データ1000−1の先頭から順に要素(プログラム)を抽出して、その要素が属する既存分類KのカウンタCTをインクリメントする。カウンタCTは、既存分類K(例えば、既存分類a,b,c,d)ごとに用意される。カウンタCTの値は、初期状態では「0」である。
また、算出部704は、抽出した配列データ1000−1から抽出した要素が属する既存分類Kが本筋バッファMBにない場合は、抽出した要素が属する既存分類K(既存業務分類名)を本筋バッファMBに格納する。本筋バッファMBは、初期状態では空である。
より詳細に説明すると、算出部704は、配列データ1000−1の配列[c1,c4]の先頭の要素「c1」を抽出する。ここで、プログラムc1の既存分類Kは「c」である。このため、算出部704は、既存分類cに対応するカウンタCT(c)をインクリメントして「1」とする。また、既存分類cが本筋バッファMBに存在しないため、算出部704は、本筋バッファMBの末尾に既存分類cを格納する。これにより、本筋バッファMBの内容は、[c]となる。
つぎに、算出部704は、配列データ1000−1の配列[c1,c4]の2番目の要素「c4」を抽出する。ここで、プログラムc4の既存分類Kは「c」である。このため、算出部704は、既存分類cに対応するカウンタCT(c)をインクリメントして「2」とする。一方、既存分類cが本筋バッファMBに存在するため、算出部704は、本筋バッファMBに既存分類cを格納しない。
そして、配列データ1000−1の配列[c1,c4]から抽出されていない未抽出の要素がなくなると、算出部704は、配列データ1000−1に含まれる既存分類Kの占有率pを算出する。ここで、配列データ1000−1に含まれる既存分類Kは既存分類cのみであり、カウンタCT(c)の値は「2」である。
このため、算出部704は、配列データ1000−1に含まれる既存分類cのプログラムの数「2」を、配列データ1000−1に含まれるプログラムの総数「2」で割ることにより、既存分類cの占有率p「p=1.0」を算出する。また、算出部704は、本筋バッファMBに格納されている既存分類Kの数「1」から1を減じた値「0」を混在度cとして混在カウンタICTに格納する。
このようにして、配列データ1000−1の特性値として、各既存分類Kの占有率p、本筋バッファMB(既存分類列E1)および混在度cを抽出することができる。以下の説明では、2次元配列データに含まれる各配列データの特性値を「水平特性値」と表記する場合がある。
例えば、配列データ1000−1の水平特性値を配列[混在度c,各既存分類Kの占有率p,既存分類列E1]の形で表すと、[0,{c=>1.0},[c]]となる。ただし、{c=>1.0}という表記は、キーcに対して値1.0が対応する連想配列を意味する。
そして、算出部704は、2次元配列データ1000に含まれる配列データ1000−1〜1000−9ごとの水平特性値を抽出して順次配列に格納していくことにより水平特性値配列(例えば、図11に示す水平特性値配列1100)を作成する。ここで、水平特性値配列の具体例について説明する。
図11は、水平特性値配列の具体例を示す説明図である。図11において、水平特性値配列1100は、図10に示した2次元配列データ1000に含まれる配列データ1000−1〜1000−9ごとの水平特性値1100−1〜1100−9を順次格納した配列である。
例えば、水平特性値1100−1は、混在度c「c=0」、既存分類cの占有率p「p=1.0」および既存分類列[c]を示す。また、例えば、水平特性値1100−9は、混在度c「c=2」、既存分類aの占有率p「p=0.2」、既存分類bの占有率p「p=0.5」、既存分類cの占有率p「p=0.3」および既存分類列[a,b,c]を示す。
(役割Giの構造種別の決定例)
つぎに、役割Giの構造種別の決定例について説明する。ここでは、図11に示した水平特性値配列1100を用いて、役割G1の構造種別を決定する場合を例に挙げて説明する。
まず、決定部705は、水平特性値配列1100の先頭から水平特性値を順次選択する。つぎに、決定部705は、順次選択した水平特性値の既存分類Kの占有率pを参照して、占有率pが閾値α以上となる既存分類Kが存在するか否かを判断する。占有率pが閾値α以上となる既存分類Kが存在する場合は、水平方向に支配的な既存分類Kが存在することを意味する。
ここで、占有率pが閾値α以上となる既存分類Kが存在する場合、決定部705は、水平支配色配列の末尾に、占有率pが閾値α以上となる既存分類K(既存業務分類名)を格納するとともに、支配的カウンタRCTをインクリメントする。一方、占有率pが閾値α以上となる既存分類Kが存在しない場合、決定部705は、水平支配色配列の末尾に、水平方向に種々の既存分類Kが混在していることを示す混在印(ここでは、「*」と表記)を格納する。
水平支配色配列は、水平特性値配列(例えば、水平特性値配列1100)において、占有率pが閾値α以上となる既存分類Kがどのように分布しているかを示す配列である。支配的カウンタRCTは、占有率pが閾値α以上となる既存分類Kが存在する水平特性値の数を格納するカウンタである。
水平特性値配列1100の例では、水平支配色配列は[c,c,d,d,a,*,*,*,*]となる。また、支配的カウンタRCTの値は「5」となる。
つぎに、決定部705は、支配的カウンタRCTの値が、水平特性値配列1100の行数(水平特性値の数)と一致するか否かを判断する。ここで、水平特性値配列1100の行数と一致する場合、水平特性値配列1100の各行が何らかの既存分類Kによってほぼ占められていることを意味する。このため、決定部705は、水平支配色配列の要素が全て同一か否かに応じて、役割G1の構造種別を「単種構造」または「階層構造」に決定する。
水平特性値配列1100の例では、支配的カウンタRCTの値「5」が、水平特性値配列1100の行数「9」と一致しない。
この場合、決定部705は、順次選択した水平特性値の混在度cを参照して、水平特性値配列1100の全ての行(水平特性値1100−1〜1100−9)で混在度cが閾値β以上となるか否かを判断する。水平特性値配列1100の全ての行で混在度cが閾値β以上となる場合は、水平特性値配列1100の各行に複数の既存分類Kが存在することを意味する。
ここで、全ての行で混在度cが閾値β以上の場合、決定部705は、水平特性値配列1100の全ての行で既存分類列E(本筋バッファMB)が同じであるか否かを判断する。水平特性値配列1100の全ての行で既存分類列Eが同じである場合は、水平特性値配列1100の全ての行で本筋バッファMBの既存分類Kの並びが同じであることを意味する。そして、全ての行で既存分類列が同じ場合、決定部705は、役割G1の構造種別を「複数種構造」に決定する。
水平特性値配列1100の例では、「β=3」とすると、水平特性値1100−6のみ混在度cが閾値β以上であり、それ以外は混在度cが閾値β未満となる。
この場合、決定部705は、水平支配色配列の先頭が混在であるか否かを判断する。ここで、先頭が混在ではない場合、決定部705は、水平支配色配列の先頭からX番目まで先頭と同じ既存分類Kが連続しているか否かを判断する。水平支配色配列の先頭からX番目まで先頭と同じ既存分類Kが連続している場合は、水平支配色配列の先頭からX番目まで先頭と同じ既存分類Kが支配的であり続けていることを意味する。なお、水平支配色配列のX番目の要素は、上述した第1のプログラム集合Aに相当する。
ここで、水平支配色配列の先頭からX番目まで先頭と同じ既存分類Kが連続していない場合、決定部705は、役割G1の構造種別を「混在構造」に決定する。一方、水平支配色配列の先頭からX番目まで先頭と同じ既存分類Kが連続している場合、決定部705は、水平支配色配列の(X+1)番目から末尾まで混在が連続しているか否かを判断する。水平支配色配列の(X+1)番目から末尾まで混在が連続している場合は、水平支配色配列のX番目以降は末尾まで混在が支配的であり続けていることを意味する。
ここで、水平支配色配列の(X+1)番目から末尾まで混在が連続している場合、決定部705は、役割G1の構造種別を「上部単種構造」に決定する。一方、水平支配色配列の(X+1)番目から末尾まで混在が連続していない場合、決定部705は、役割G1の構造種別を「混在構造」に決定する。
水平特性値配列1100の例では、先頭は混在ではなく既存分類cになっているが、既存分類cが支配的である区間は上位2行であり、全体9行のうちの上位22%程度にすぎず、閾値である上位30%に達しない。このため、決定部705は、役割G1の構造種別を「混在構造」に決定する。
また、水平支配色配列の先頭が混在の場合、決定部705は、水平支配色配列の先頭からY番目まで混在が連続しているか否かを判断する。水平支配色配列の先頭からY番目まで混在が連続している場合は、水平支配色配列の先頭からY番目まで混在が支配的であり続けていることを意味する。なお、水平支配色配列のY番目の要素は、上述した第2のプログラム集合Aに相当する。
ここで、水平支配色配列の先頭からY番目まで混在が連続していない場合、決定部705は、役割G1の構造種別を「混在構造」に決定する。一方、水平支配色配列の先頭からY番目まで混在が連続している場合、決定部705は、水平支配色配列の(Y+1)番目から末尾まで特定の既存分類Kが連続しているか否かを判断する。水平支配色配列の(Y+1)番目から末尾まで特定の既存分類Kが連続している場合は、水平支配色配列のY番目以降は末尾まで特定の既存分類Kが支配的であり続けていることを意味する。
ここで、水平支配色配列の(Y+1)番目から末尾まで特定の既存分類Kが連続している場合、決定部705は、役割G1の構造種別を「下部単種構造」に決定する。一方、水平支配色配列の(Y+1)番目から末尾まで特定の既存分類Kが連続していない場合、決定部705は、役割G1の構造種別を「混在構造」に決定する。
また、例えば、役割Giの2次元配列データ(プログラム列Li)を、[[a,a,a,b,b,c,c],[a,a,a,b,b,c,c],[a,a,b,b,b,c,c],[a,a,b,b,c,c,c]]とすると、水平特性値配列は以下のようになる。ただし、ここでは既存分類Kの既存業務分類名のみを表記している。
[[2,{a=>0.43,b=>0.29,c=>0.29},[a,b,c]],[2,{a=>0.43,b=>0.29,c=>0.29},[a,b,c]],[2,{a=>0.29,b=>0.43,c=>0.29},[a,b,c]],[2,{a=>0.29,b=>0.29,c=>0.43},[a,b,c]]]
この場合、閾値βを「β=2」とすると、水平特性値配列の全ての行で混在度cが閾値β以上となる。また、水平特性値配列の全ての行で既存分類列E1〜E4(本筋バッファMB)が[a,b,c]で同じである。この場合、決定部705は、役割Giの構造種別を「複数種構造」に決定する。
なお、「ある区間において特定の既存分類K(または、混在)が支配的であり続ける」ための条件は、上述した、ある区間において特定の既存分類Kが連続する場合に限らない。例えば、決定部705は、ある区間において他の既存分類Kの割合が所定の閾値γ以下であれば、その区間において特定の既存分類Kが支配的であり続けると判断することにしてもよい。閾値γは、予め設定されてROM202、RAM203、ディスク205などの記憶装置に記憶されている。例えば、閾値γは、0.2程度の値に設定される。
例えば、閾値γを「γ=0.2」として、水平特性値配列が20行の場合に、1行目から6行目まで既存分類aが支配的であるか否かを判断する場合を想定する。この場合、1行目から6行目までのいずれかの1行が既存分類aが支配的であるという基準を満たさなくても、6行のうちの1行の割合は「0.17」であり閾値γ以下となる。このため、決定部705は、1行目から6行目まで既存分類aが支配的であると判断する。
(構造種別リストLTの具体例)
図12は、構造種別リストLTの具体例を示す説明図である。図12において、構造種別リストLTは、役割IDおよび構造種別のフィールドを有し、各フィールドに情報を設定することで、各役割G1〜G3の構造種別をレコードとして記憶する。役割IDは、役割Giの識別子である。構造種別は、役割Giの構造種別である。
構造種別リストLTによれば、ソフトウェアSWから分割された各役割G1〜G3の構造種別を判別することができる。利用者は、例えば、役割G1の構造種別が「混在構造」のため、種々の既存分類Kのプログラムが集まって役割G1を実現しており、既存分類Kが分類として機能しておらず、ソフトウェアSWの保守性の問題が高い状態であると判断することができる。
(分析支援装置100の分析支援処理手順)
つぎに、実施の形態2にかかる分析支援装置100の分析支援処理手順について説明する。
図13は、分析支援装置100の分析支援処理手順の一例を示すフローチャートである。図13のフローチャートにおいて、まず、分析支援装置100は、ソフトウェアSWに含まれるプログラム間の依存関係に基づいて、ソフトウェアSWから役割G1〜Gnを分割する(ステップS1301)。
つぎに、分析支援装置100は、役割Giの「i」を「i=1」として(ステップS1302)、役割G1〜Gnから役割Giを選択する(ステップS1303)。そして、分析支援装置100は、役割Gi内のプログラム間の依存関係に基づいて、役割Giのプログラム列Liを作成する(ステップS1304)。
つぎに、分析支援装置100は、プログラム列Liのうちの同一ランクrのプログラムを並べたプログラム集合Ajを示す配列データを、ランクrが降順となるように並べた2次元配列データを作成する(ステップS1305)。そして、分析支援装置100は、作成した2次元配列データに基づいて、水平特性値配列作成処理を実行する(ステップS1306)。水平特性値配列作成処理の具体的な処理手順については、図14を用いて後述する。
つぎに、分析支援装置100は、役割Giの構造種別を決定する構造決定処理を実行する(ステップS1307)。構造決定処理の具体的な処理手順については、図16および図17を用いて後述する。そして、分析支援装置100は、決定した役割Giの構造種別を構造種別リストLTに登録する(ステップS1308)。
つぎに、分析支援装置100は、役割Giの「i」をインクリメントして(ステップS1309)、「i」が「n」より大きくなったか否かを判断する(ステップS1310)。ここで、「i」が「n」以下の場合(ステップS1310:No)、分析支援装置100は、ステップS1303に戻る。
一方、「i」が「n」より大きくなった場合(ステップS1310:Yes)、分析支援装置100は、構造種別リストLTを出力して(ステップS1311)、本フローチャートによる一連の処理を終了する。これにより、各役割G1〜Gnの構造種別をリスト化して出力することができる。
<水平特性値配列作成処理手順>
つぎに、図13に示したステップS1306の水平特性値配列作成処理の具体的な処理手順について説明する。
図14は、水平特性値配列作成処理の具体的処理手順の一例を示すフローチャートである。図14のフローチャートにおいて、まず、分析支援装置100は、水平特性値配列を初期化する(ステップS1401)。つぎに、分析支援装置100は、図13に示したステップS1305において作成した2次元配列データの先頭から配列データを選択する(ステップS1402)。
そして、分析支援装置100は、選択した配列データの特性値抽出処理を実行する(ステップS1403)。なお、特性値抽出処理の具体的な処理手順については、図15を用いて後述する。つぎに、分析支援装置100は、配列データの特性値を水平特性値配列の末尾に格納する(ステップS1404)。
そして、分析支援装置100は、2次元配列データから選択していない未選択の配列データがあるか否かを判断する(ステップS1405)。ここで、未選択の配列データがある場合(ステップS1405:Yes)、分析支援装置100は、ステップS1402に戻って、2次元配列データから未選択の配列データを選択する。
一方、未選択の配列データがない場合(ステップS1405:No)、分析支援装置100は、本フローチャートによる一連の処理を終了し、水平特性値配列作成処理を呼び出したステップに戻る。これにより、2次元配列データに含まれる配列データごとの特性値を抽出することができる。
<特性値抽出処理手順>
つぎに、図14に示したステップS1403の特性値抽出処理の具体的な処理手順について説明する。
図15は、特性値抽出処理の具体的処理手順の一例を示すフローチャートである。図15のフローチャートにおいて、まず、分析支援装置100は、カウンタCT、本筋バッファ、混在カウンタICTを初期化する(ステップS1501)。そして、分析支援装置100は、配列データの先頭から要素を抽出する(ステップS1502)。
つぎに、分析支援装置100は、抽出した要素が属する既存分類KのカウンタCTをインクリメントする(ステップS1503)。そして、分析支援装置100は、抽出した要素が属する既存分類Kが本筋バッファMBにあるか否かを判断する(ステップS1504)。
ここで、本筋バッファMBにある場合(ステップS1504:Yes)、分析支援装置100は、ステップS1506に移行する。一方、本筋バッファMBにない場合(ステップS1504:No)、本筋バッファMBの末尾に抽出した要素が属する既存分類Kを格納する(ステップS1505)。
つぎに、分析支援装置100は、配列データから抽出していない未抽出の要素があるか否かを判断する(ステップS1506)。ここで、未抽出の要素がある場合(ステップS1506:Yes)、分析支援装置100は、ステップS1502に戻って、配列データから抽出していない未抽出の要素を抽出する。
一方、未抽出の要素がない場合(ステップS1506:No)、分析支援装置100は、各既存分類KのカウンタCTの値を、配列データに含まれる要素の総数で割ることにより、各既存分類Kの占有率pを算出する(ステップS1507)。そして、分析支援装置100は、本筋バッファMBに格納された既存分類Kの数から1を減じた値を混在カウンタICTに格納して(ステップS1508)、本フローチャートによる一連の処理を終了し、特性値抽出処理を呼び出したステップに戻る。
これにより、配列データの特性値として、各既存分類Kの占有率p、本筋バッファMB(既存分類列E)および混在度c(混在カウンタICT)を抽出することができる。
<構造決定処理手順>
つぎに、図13に示したステップS1307の構造決定処理の具体的な処理手順について説明する。
図16および図17は、構造決定処理の具体的処理手順の一例を示すフローチャートである。図16のフローチャートにおいて、まず、分析支援装置100は、水平支配色配列と支配的カウンタRCTを初期化する(ステップS1601)。
つぎに、分析支援装置100は、水平特性値配列の先頭から水平特性値を選択する(ステップS1602)。そして、分析支援装置100は、選択した水平特性値の各既存分類Kの占有率pを参照して、占有率pが閾値α以上となる既存分類Kが存在するか否かを判断する(ステップS1603)。
ここで、占有率pが閾値α以上となる既存分類Kが存在する場合(ステップS1603:Yes)、分析支援装置100は、水平支配色配列の末尾に占有率pが閾値α以上の既存分類Kを格納する(ステップS1604)。そして、分析支援装置100は、支配的カウンタRCTをインクリメントして(ステップS1605)、ステップS1607に移行する。
一方、占有率pが閾値α以上となる既存分類Kが存在しない場合(ステップS1603:No)、分析支援装置100は、水平支配色配列の末尾に混在印を格納する(ステップS1606)。つぎに、分析支援装置100は、水平特性値配列から選択していない未選択の水平特性値があるか否かを判断する(ステップS1607)。
ここで、未選択の水平特性値がある場合(ステップS1607:Yes)、分析支援装置100は、ステップS1602に戻って、水平特性値配列から選択していない未選択の水平特性値を選択する。一方、未選択の水平特性値がない場合(ステップS1607:No)、分析支援装置100は、支配的カウンタRCTの値が水平特性値配列の行数と一致するか否かを判断する(ステップS1608)。
ここで、支配的カウンタRCTの値が水平特性値配列の行数と一致する場合(ステップS1608:Yes)、分析支援装置100は、水平支配色配列の要素が全て同一か否かを判断する(ステップS1609)。
そして、水平支配色配列の要素が全て同一の場合(ステップS1609:Yes)、分析支援装置100は、役割Giの構造種別を「単種構造」に決定して(ステップS1610)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
一方、水平支配色配列の要素が同一ではない場合(ステップS1609:No)、分析支援装置100は、役割Giの構造種別を「階層構造」に決定して(ステップS1611)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
また、ステップS1608において、支配的カウンタRCTの値が水平特性値配列の行数と一致しない場合(ステップS1608:No)、分析支援装置100は、図17に示すステップS1701に移行する。
図17のフローチャートにおいて、まず、分析支援装置100は、水平特性値配列の全ての行で混在カウンタICTの値(混在度c)が閾値β以上か否かを判断する(ステップS1701)。ここで、水平特性値配列の全ての行で混在カウンタICTの値が閾値β以上ではない場合(ステップS1701:No)、分析支援装置100は、ステップS1704に移行する。
一方、水平特性値配列の全ての行で混在カウンタICTの値が閾値β以上の場合(ステップS1701:Yes)、水平特性値配列の全ての行で本筋バッファMB(既存分類列E)が同じか否かを判断する(ステップS1702)。
ここで、水平特性値配列の全ての行で本筋バッファMBが同じ場合(ステップS1702:Yes)、分析支援装置100は、役割Giの構造種別を「複数種構造」に決定して(ステップS1703)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
一方、水平特性値配列の行で本筋バッファMBが同じではない場合(ステップS1702:No)、分析支援装置100は、水平支配色配列の先頭が混在であるか否かを判断する(ステップS1704)。ここで、水平支配色配列の先頭が混在ではない場合(ステップS1704:No)、分析支援装置100は、水平支配色配列の先頭からX番目まで先頭と同じ既存分類Kが連続しているか否かを判断する(ステップS1705)。
ここで、先頭からX番目まで先頭と同じ既存分類Kが連続している場合(ステップS1705:Yes)、分析支援装置100は、水平支配色配列の(X+1)番目から末尾まで混在が連続しているか否かを判断する(ステップS1706)。
ここで、(X+1)番目から末尾まで混在が連続している場合(ステップS1706:Yes)、役割Giの構造種別を「上部単種構造」に決定して(ステップS1707)、本フローチャートによる一連の処理を終了し構造決定処理を呼び出したステップに戻る。
また、ステップS1705において、先頭からX番目まで先頭と同じ既存分類Kが連続していない場合(ステップS1705:No)、分析支援装置100は、役割Giの構造種別を「混在構造」に決定して(ステップS1708)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
また、ステップS1706において、(X+1)番目から末尾まで混在が連続していない場合(ステップS1706:No)、分析支援装置100は、役割Giの構造種別を「混在構造」に決定して(ステップS1708)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
また、ステップS1704において、水平支配色配列の先頭が混在の場合(ステップS1704:Yes)、分析支援装置100は、水平支配色配列の先頭からY番目まで混在が連続しているか否かを判断する(ステップS1709)。
ここで、先頭からY番目まで混在が連続している場合(ステップS1709:Yes)、分析支援装置100は、水平支配色配列の(Y+1)番目から末尾まで特定の既存分類Kが連続しているか否かを判断する(ステップS1710)。
ここで、(Y+1)番目から末尾まで特定の既存分類Kが連続している場合(ステップS1710:Yes)、分析支援装置100は、役割Giの構造種別を「下部単種構造」に決定して(ステップS1711)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
また、ステップS1709において、先頭からY番目まで混在が連続していない場合(ステップS1709:No)、分析支援装置100は、役割Giの構造種別を「混在構造」に決定して(ステップS1708)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
また、ステップS1710において、(Y+1)番目から末尾まで特定の既存分類Kが連続していない場合(ステップS1710:No)、分析支援装置100は、役割Giの構造種別を「混在構造」に決定して(ステップS1708)、本フローチャートによる一連の処理を終了し、構造決定処理を呼び出したステップに戻る。
これにより、役割Giの構造種別を、「単種構造」、「階層構造」、「上部単種構造」、「下部単種構造」、「複数種構造」および「混在構造」のいずれかの構造種別に決定することができる。
(プログラム列Liの作成例)
ここで、役割Giのプログラム列Liの作成例について説明する。ここでは、役割G1を例に挙げて、プログラム列L1の作成例について説明する。作成部703は、依存関係情報310を参照して、各プログラムの出次数と入次数を算出することにより、関係元のプログラムが関係先のプログラムよりも上位に配列されるプログラム列L1を作成する。
具体的には、例えば、まず、作成部703は、依存関係情報310から有向グラフを作成する。有向グラフとは、プログラムをノード、依存関係を有向なエッジとするグラフである。より詳細に説明すると、エッジの始端のノードが関係元であり、エッジの終端(矢印の先)が関係先である。この有向グラフを示す集合をGとする。また、SlとSrという順序を保持した集合を用意する。
つぎに、作成部703は、ソースコードDB300内のプログラム群から集合Gの要素である役割G1のプログラムを抽出する。作成部703は、依存関係情報310を参照して、抽出した各プログラムについて、当該プログラムが依存関係の関係元となっている数を出次数、依存関係の関係先となる数を入次数として記録する。また、作成部703は、各プログラムについて、出次数から入次数を引いた差分も記録する。
例えば、図4を参照すると、作成部703は、プログラムa1について、関係元となっている項目を調査する。この場合、プログラムa1は、プログラムc6,c7,b13,c9の4個のプログラムの関係元であることが分かる。したがって、プログラムa1の出次数は「4」である。また、プログラムa1は、プログラムd1,d2の2個のプログラムの関係先であることがわかる。したがって、プログラムa1の入次数は「2」である。また、プログラムa1について、出次数から入次数を引いた差分は、「2」である。
図18は、出次数・入次数テーブル1800の記憶内容の一例を示す説明図である。図18において、出次数・入次数テーブル1800は、プログラムごとに、出次数、入次数、出次数から入次数を引いた差分を記録するテーブルである。図18の例では、役割G1のプログラム群について記録されているが、役割G2,G3についても同様に記録される。出次数・入次数テーブル1800は、例えば、RAM203、ディスク205などの記憶装置により実現される。
つぎに、作成部703は、図18に示した出次数・入次数テーブル1800から出次数が「0」のプログラムを特定する。作成部703は、出次数が「0」のプログラムを、集合Srの先頭に追加し、集合Gから削除する。図18の例では、プログラムa2,a3,b3,b5,b7,b11,b14,c3,c7,c8の順に集合Srの先頭に追加され、集合Gから削除される。
つぎに、作成部703は、10個のプログラムa2,a3,b3,b5,b7,b11,b14,c3,c7,c8のレコードを、出次数・入次数テーブル1800から削除する。また、作成部703は、削除後の集合Gにより、出次数、入次数、差分を再計算して、削除後の出次数・入次数テーブル1800を更新する。
図19は、更新後の出次数・入次数テーブル1800の記憶内容の一例を示す説明図である。作成部703は、更新後の出次数・入次数テーブル1800から出次数が「0」のプログラムを特定する。作成部703は、出次数が「0」のプログラムを、集合Srに追加し、集合Gから削除する。図19の例では、プログラムb2,b4,b8,b9,b10,b13,c10,c11,d3の順に集合Srの先頭に追加され、集合Gから削除される。
つぎに、作成部703は、9個のプログラムb2,b4,b8,b9,b10,b13,c10,c11,d3のレコードを、図19に示した出次数・入次数テーブル1800から削除する。また、作成部703は、削除後の集合Gにより、出次数、入次数、差分を再計算して、削除後の出次数・入次数テーブル1800を更新する。このような処理を、出次数が「0」であるプログラムがなくなるまで繰り返すことになる。これにより、最終的に集合Gには、プログラムc1,c4が残される。
出次数が「0」であるプログラムがなくなった場合、作成部703は、集合Gに残されているプログラム群の各プログラムについて、最新の出次数・入次数テーブル1800から入次数が「0」のプログラムを特定する。作成部703は、入次数が「0」のプログラムを、集合Slの末尾から追加し、集合Gから削除する。
つぎに、作成部703は、入次数が「0」のプログラムのレコードを、最新の出次数・入次数テーブル1800から削除する。また、作成部703は、削除後の集合Gにより、出次数、入次数、差分を再計算して、削除後の出次数・入次数テーブル1800を更新する。この処理を繰り返すことにより、入次数が「0」のプログラムや出次数が「0」のプログラムが集合Gから順に取り除かれ、出次数、入次数のいずれも「0」にならないプログラムが集合Gに残される。
このあと、集合Gに残存するプログラムについて、作成部703は、出次数から入次数を引いた差分を計算する。そして、作成部703は、差分が最大となるプログラムを集合Slの末尾に追加し、集合Gから削除する。本例では、差分が最大となるプログラムは、プログラムc1,c4であるため、作成部703は、プログラムc1,c4を集合Slの末尾に追加し、集合Gから削除する。本例では、プログラムc1,c4が集合Gから削除されたことにより、集合Gは空集合になったとする。集合Gが空集合になると、作成部703は、集合Slの末尾に集合Srの先頭を連結して、集合Sを作成する。
以下、図20および図21を用いて、分析支援装置100が集合Sを作成する具体的な処理手順について説明する。
図20および図21は、分析支援装置100の集合作成処理手順の一例を示すフローチャートである。図20のフローチャートにおいて、まず、分析支援装置100は、依存関係情報310から有向グラフを生成し、有向グラフを集合Gとして保持する(ステップS2001)。つぎに、分析支援装置100は、出次除外回数を0、入次除外回数を0に設定する(ステップS2002)。
出次数が0のプログラムは後述のステップS2010において集合Gから削除されるが、出次数が0でないプログラムは削除対象にはならないため、出次除外回数とは、出次数が0でないために削除対象にならなかった回数である。同様に、入次数が0のプログラムは後述のステップS2010において集合Gから削除されるが、入次数が0でないプログラムは削除対象にはならないため、入次除外回数とは、入次数が0でないために削除対象にならなかった回数である。したがって、ステップS2002では、初期値として、出次除外回数を0、入次除外回数は0に設定される。
つぎに、分析支援装置100は、集合G内のプログラムごとに出次数と入次数とを算出する(ステップS2003)。算出された出次数と入次数は出次数・入次数テーブル1800に記録される。そして、分析支援装置100は、出次数・入次数テーブル1800を参照して、集合Gに出次数が「0」のプログラムがあるか否かを判断する(ステップS2004)。出次数が「0」のプログラムがある場合(ステップS2004:Yes)、分析支援装置100は、出次数0のプログラムに対して、出次除外回数と種類(out)とを対応付ける(ステップS2005)。「out」は出次除外回数であることを示す識別情報である。
例えば、図18に示した出次数・入次数テーブル1800を参照すると、出次数が「0」のプログラムa2,a3,b3,b5,b7,b11,b14,c3,c7,c8に対して、出次除外回数=0が対応付けられる。具体的には、出次数が「0」のプログラムと出次除外回数との組は、(a2,(0,Out)),(a3,(0,Out)),(b3,(0,Out)),(b5,(0,Out)),(b7,(0,Out)),(b11,(0,Out)),(b14,(0,Out)),(c3,(0,Out)),(c7,(0,Out)),(c8,(0,Out))として記憶領域に保持される。
このあと、分析支援装置100は、出次数が「0」のプログラムと出次除外回数との組を集合Srの先頭に追加して、出次数が「0」のプログラムを集合Gから削除する(ステップS2006)。上記の例では、(a2,(0,Out)),(a3,(0,Out)),(b3,(0,Out)),(b5,(0,Out)),(b7,(0,Out)),(b11,(0,Out)),(b14,(0,Out)),(c3,(0,Out)),(c7,(0,Out)),(c8,(0,Out))の順に、集合Srの先頭に追加される。
そして、分析支援装置100は、出次除外回数に1加算して(ステップS2007)、ステップS2003に戻り、削除後の集合G内のプログラムごとに、出次数と入次数の算出が実行される(ステップS2003)。出次数と入次数が再算出されると、出次数が「0」のプログラムが再度出現する可能性があるため、出次数が「0」のプログラムがなくなるまで繰り返すことになる。
例えば、出次数と入次数の再算出により、図19に示した出次数・入次数テーブル1800を参照して、出次数が「0」のプログラムb2,b4,b8,b9,b10,b13,c10,c11,d3が検出される。したがって、出次数が「0」のプログラムb2,b4,b8,b9,b10,b13,c10,c11,d3に対して、出次除外回数=1が対応付けられる。
この場合、具体的には、出次数が「0」のプログラムと出次除外回数の組は、(b2,(1,Out)),(b4,(1,Out)),(b8,(1,Out)),(b9,(1,Out)),(b10,(1,Out)),(b13,(1,Out)),(c10,(1,Out)),(c11,(1,Out)),(d3,(1,Out))として記憶領域に保持される。
このあと、出次数が「0」のプログラムと出次除外回数の組(b2,(1,Out)),(b4,(1,Out)),(b8,(1,Out)),(b9,(1,Out)),(b10,(1,Out)),(b13,(1,Out)),(c10,(1,Out)),(c11,(1,Out)),(d3,(1,Out))は、この順に、集合Srの先頭に追加される。出次除外回数(=1)に1加算されて、出次除外回数=2となる。
また、出次数が「0」のプログラムb2,b4,b8,b9,b10,b13,c10,c11,d3を集合Gから削除して、出次数と入次数を再算出すると、出次数が「0」のプログラムa5,b6,b12,c9,c13が検出されたとする。この場合の出次数が「0」のプログラムと出次除外回数の組は、(a5,(2,Out)),(b6,(2,Out)),(b12,(2,Out)),(c9,(2,Out)),(c13,(2,Out))として記憶領域に保持される。そして、(a5,(2,Out)),(b6,(2,Out)),(b12,(2,Out)),(c9,(2,Out)),(c13,(2,Out))の順に集合Srの先頭に追加され、出次除外回数(=2)に1加算されて、出次除外回数=3となる。
そして、出次数が「0」のプログラムa5,b6,b12,c9,c13を集合Gから削除して、出次数と入次数を再算出し、出次数が「0」のプログラムが検出されなくなると(ステップS2004:No)、ステップS2008に移行する。
ステップS2008において、分析支援装置100は、出次数・入次数テーブル1800を参照して、集合Gに入次数が「0」のプログラムがあるか否かを判断する(ステップS2008)。入次数が「0」のプログラムがある場合(ステップS2008:Yes)、分析支援装置100は、入次数0のプログラムに対して、入次除外回数と種類(in)とを対応付ける(ステップS2009)。「in」は入次除外回数であることを示す識別情報である。入次数0のプログラムと入次除外回数との組についても、出次数0のプログラムと出次除外回数との組と同様、(プログラム名,(入次除外回数,in))のように対応付けて記憶領域に保持される。
このあと、分析支援装置100は、入次数が「0」のプログラムと入次除外回数との組を集合Slの末尾に追加して、入次数が「0」のプログラムを集合Gから削除する(ステップS2010)。そして、分析支援装置100は、入次除外回数に1加算して(ステップS2011)、ステップS2003に戻り、削除後の集合G内のプログラムごとに、出次数と入次数の算出が実行される(ステップS2003)。出次数と入次数が再算出されると、出次数が「0」のプログラムが再度出現する可能性があるため、出次数が「0」のプログラムがなくなるまで繰り返すことになる。一方、ステップS2008において、入次数が「0」のプログラムがない場合(ステップS2008:No)、図21のステップS2101に移行する。
図21のフローチャートにおいて、まず、分析支援装置100は、集合Gが空になったか否かを判断する(ステップS2101)。集合Gが空になった場合(ステップS2101:Yes)、ステップS2108に移行する。一方、集合Gが空でない場合(ステップS2101:No)、分析支援装置100は、集合G内のプログラムごとに、出次数から入次数を引いた差分を算出する(ステップS2102)。そして、分析支援装置100は、集合Gから差分が最大となるプログラムを取得し(ステップS2103)、差分が最大となるプログラムを、入次除外回数および種類(in)に対応付ける(ステップS2104)。
そして、分析支援装置100は、ステップS2104において生成した差分が最大となるプログラムと入次除外回数との組を集合Slの末尾に追加して、差分が最大となるプログラムを集合Gから削除する(ステップS2105)。そして、分析支援装置100は、入次除外回数に1加算する(ステップS2106)。
そして、分析支援装置100は、再度集合Gが空になったか否かを判断する(ステップS2107)。空でない場合(ステップS2107:No)、図20のステップS2003に戻り、削除後の集合G内のプログラムごとに、出次数と入次数の算出が実行される。出次数と入次数が再算出されると、出次数が「0」のプログラムが再度出現する可能性があるため、出次数が「0」のプログラムがなくなるまで繰り返すことになる。また、ステップS2107において、集合Gが空になった場合(ステップS2107:Yes)、分析支援装置100は、集合Slの末尾に集合Srを連結して集合Sを生成して(ステップS2108)、本フローチャートによる一連の処理を終了する。
図22は、集合Sの一例を示す説明図である。図22において、集合Sは、図21に示したステップS2108において生成される、順序を保持している集合であり、先頭から末尾までの方向に依存関係が存在する。
この集合Sの各プログラムの除外回数に「1」を加算した値が、図9に示したプログラム列L1の各プログラムのランクrとなる。すなわち、この集合Sの各プログラムの除外回数に「1」を加算し、種別の情報(in,out)を除いたものが、図9に示したプログラム列L1となる。
以上説明したように、実施の形態2にかかる分析支援装置100によれば、ソフトウェアSWから分割した役割Giに含まれるプログラム間の依存関係に基づいて、プログラム列Liを作成することができる。プログラム列Liは、関係元のプログラムを関係先のプログラムよりも上位に配置し、プログラム間の依存関係の連鎖の大本となるプログラムとの関係度合いを示すランクrを各プログラムに付与した配列である。また、分析支援装置100によれば、プログラム列Liのうちの同一ランクのプログラム集合Ajごとに、プログラム集合Ajの中で各既存分類Kが占める割合pを算出し、算出した算出結果に基づいて、役割Giの構造種別を決定することができる。これにより、ソフトウェアSWから分割される役割G1〜Gnの構造を定量的、客観的に判断することが可能となり、ソフトウェアSWの構造の理解を支援することができる。
また、分析支援装置100によれば、プログラム集合A1〜Amの全てに占有率pが閾値α以上となる既存分類Kが存在し、かつ、プログラム集合A1〜Amの全てで占有率pが閾値α以上となる既存分類Kが同一である場合に、役割Giの構造種別を単種構造に決定することができる。これにより、利用者は、例えば、役割Giが設計当初の業務分類が実態としても機能しており、保守性の観点から望ましい状態であると判断することができる。
また、分析支援装置100によれば、プログラム集合A1〜Amの全てに占有率pが閾値α以上となる既存分類Kが存在し、かつ、占有率pが閾値α以上となる既存分類Kが少なくともいずれかのプログラム集合間で異なる場合に、役割Giの構造種別を階層構造に決定することができる。これにより、利用者は、例えば、ソフトウェアSWが保守性として極端に悪いとはいえないが、設計当初の業務分類を見直す余地があると判断することができる。
また、分析支援装置100によれば、プログラム集合A1〜Amのうち最上位のプログラム集合Aから第1のプログラム集合Aまで連続して特定の既存分類Kの占有率pが閾値α以上となり、かつ、第1のプログラム集合Aよりも下位のプログラム集合Aの全てに占有率pが閾値α以上となる既存分類Kが存在しない場合に、役割Giの構造種別を上部単種構造に決定することができる。これにより、利用者は、例えば、役割Giの上位層を基準にして設計当初の業務分類を見直すことが望ましいと判断することができる。
また、分析支援装置100によれば、プログラム集合A1〜Amのうち最上位のプログラム集合Aから第2のプログラム集合Aまで連続して占有率pが閾値α以上となる既存分類Kが存在せず、かつ、第2のプログラム集合Aよりも下位のプログラム集合Aの全てで特定の既存分類Kの占有率pが閾値α以上となる場合に、役割Giの構造種別を下部単種構造に決定することができる。これにより、利用者は、例えば、役割Giの下位層を基準にして設計当初の業務分類を見直すことが望ましいと判断することができる。
また、分析支援装置100によれば、プログラム集合A1〜Amの少なくともいずれかのプログラム集合Aに占有率pが閾値α以上となる既存分類Kが存在せず、かつ、プログラム集合A1〜Amの全てで混在度cが閾値β以上となり、かつ、プログラム集合A1〜Amの全てで既存分類列E1〜Emが一致する場合に、役割Giの構造種別を複数種構造に決定することができる。これにより、利用者は、例えば、複数の既存分類Kが集まって一つの役割Giを実現しているが、互いの絡み合いは少なく、「混在構造」の場合ほど保守性の懸念が大きくないと判断することができる。この場合、例えば、利用者は、プログラムの業務分類を見直して現状の構造を元に整理するか、あるいは、既存分類同士の依存関係を減らすように修正して、既存分類Kに沿った複数の役割Gへと分割されるように整理するといった是正処置を採ることができる。
また、分析支援装置100によれば、上述したいずれの条件も満たさない場合に、役割Giの構造種別を混在構造に決定することができる。これにより、利用者は、例えば、ソフトウェアSWの再設計を検討することが望ましいと判断することができる。
このように、分析支援装置100によれば、ソフトウェアSWの構造を定量的、客観的に判断して、ソフトウェアSWを構成するプログラムを管理しやすい業務分類に修正するために、どのような是正処置を採ればよいのかの判断を支援することができる。
具体的には、例えば、ソフトウェアSWから分割された役割G1〜Gnの6割程度が「単種構造」であれば、利用者は「約60%はプログラムの実態が既存分類Kと整合している」と評価するなど、ソフトウェア全体の傾向を数量によって把握することができる。これにより、利用者は既存分類Kの妥当性を知ることができ、保守や再設計の判断に役立てることができる。
なお、本実施の形態で説明した分析支援方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分析支援プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本分析支援プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
ソフトウェアに含まれる複数種類に分類された複数の構成要素から分割した構成要素群の構成要素間の依存関係に基づいて、前記構成要素群のうちの関係元の構成要素を関係先の構成要素よりも上位に配置し、前記構成要素間の依存関係の連鎖の大本となる構成要素との関係度合いを示すランクを各構成要素に付与した構成要素列を作成し、
作成した前記構成要素列のうちの同一ランクの構成要素集合ごとに、前記構成要素集合に含まれる構成要素の種類が前記構成要素集合の中で占める割合を算出し、
算出した算出結果に基づいて、前記構成要素群の構造種別を決定する、
処理を実行させることを特徴とする分析支援プログラム。
(付記2)前記決定する処理は、
前記同一ランクごとの構成要素集合の全てに前記割合が閾値以上となる種類が存在し、かつ、前記割合が閾値以上となる種類が前記同一ランクごとの構成要素集合の全てで同一となる条件を満たす場合、前記構成要素群の構造種別を、同一種類の構成要素により形成される単種構造に決定することを特徴とする付記1に記載の分析支援プログラム。
(付記3)前記決定する処理は、
前記同一ランクごとの構成要素集合の全てに前記割合が閾値以上となる種類が存在し、かつ、前記割合が閾値以上となる種類が少なくともいずれかの構成要素集合間で異なる条件を満たす場合、前記構成要素群の構造種別を、2種類以上の構成要素により階層化される階層構造に決定することを特徴とする付記1または2に記載の分析支援プログラム。
(付記4)前記決定する処理は、
前記同一ランクごとの構成要素集合を前記構成要素列の上位の構成要素を含む構成要素集合が上位となるように並べた場合に、最上位の構成要素集合から第1の構成要素集合まで連続して特定の種類の前記割合が閾値以上となり、かつ、前記第1の構成要素集合よりも下位の構成要素集合の全てに前記割合が閾値以上となる種類が存在しない条件を満たす場合、前記構成要素群の構造種別を、同一種類の構成要素により上位層が形成され、種々の構成要素により無秩序に下位層が形成される上部単種構造に決定することを特徴とする付記1〜3のいずれか一つに記載の分析支援プログラム。
(付記5)前記決定する処理は、
前記同一ランクごとの構成要素集合を前記構成要素列の上位の構成要素を含む構成要素集合が上位となるように並べた場合に、最上位の構成要素集合から第2の構成要素集合まで連続して前記割合が閾値以上となる種類が存在せず、かつ、前記第2の構成要素集合よりも下位の構成要素集合の全てで特定の種類の前記割合が閾値以上となる条件を満たす場合、前記構成要素群の構造種別を、種々の構成要素により無秩序に上位層が形成され、同一種類の構成要素により下位層が形成される下部単種構造に決定することを特徴とする付記1〜4のいずれか一つに記載の分析支援プログラム。
(付記6)前記コンピュータに、
前記構成要素集合の中に出現する構成要素の種類の数に基づいて、前記構成要素集合の中の構成要素の種類の混在度を算出し、
前記構成要素集合の中に出現する構成要素の種類を出現順に重複なく並べた種類列を生成する、処理を実行させ、
前記決定する処理は、
前記同一ランクごとの構成要素集合の少なくともいずれかの構成要素集合に前記割合が閾値以上となる種類が存在せず、かつ、前記同一ランクごとの構成要素集合の全てで前記混在度が閾値以上となり、かつ、前記同一ランクごとの構成要素集合の全てで前記種類列が一致する条件を満たす場合、前記構成要素群の構造種別を、互いに依存関係の少ない2種類以上の構成要素により形成された複数種構造に決定することを特徴とする付記1〜5のいずれか一つに記載の分析支援プログラム。
(付記7)前記決定する処理は、
前記条件を満たさない場合、前記構成要素群の構造種別を、種々の構成要素により無秩序に形成される混在構造に決定することを特徴とする付記2〜6のいずれか一つに記載の分析支援プログラム。
(付記8)前記構成要素間の依存関係に基づいて、前記複数の構成要素から構成要素群を分割する処理を実行させることを特徴とする付記1〜7のいずれか一つに記載の分析支援プログラム。
(付記9)ソフトウェアに含まれる複数種類に分類された複数の構成要素から分割した構成要素群の構成要素間の依存関係に基づいて、前記構成要素群のうちの関係元の構成要素を関係先の構成要素よりも上位に配置し、前記構成要素間の依存関係の連鎖の大本となる構成要素との関係度合いを示すランクを各構成要素に付与した構成要素列を作成する作成部と、
前記作成部によって作成された前記構成要素列のうちの同一ランクの構成要素集合ごとに、前記構成要素集合に含まれる構成要素の種類が前記構成要素集合の中で占める割合を算出する算出部と、
前記算出部によって算出された算出結果に基づいて、前記構成要素群の構造種別を決定する決定部と、
を有することを特徴とする分析支援装置。
(付記10)コンピュータが、
ソフトウェアに含まれる複数種類に分類された複数の構成要素から分割した構成要素群の構成要素間の依存関係に基づいて、前記構成要素群のうちの関係元の構成要素を関係先の構成要素よりも上位に配置し、前記構成要素間の依存関係の連鎖の大本となる構成要素との関係度合いを示すランクを各構成要素に付与した構成要素列を作成し、
作成した前記構成要素列のうちの同一ランクの構成要素集合ごとに、前記構成要素集合に含まれる構成要素の種類が前記構成要素集合の中で占める割合を算出し、
算出した算出結果に基づいて、前記構成要素群の構造種別を決定する、
処理を実行することを特徴とする分析支援方法。
(付記11)コンピュータに、
ソフトウェアに含まれる複数種類に分類された複数の構成要素から分割した構成要素群の構成要素間の依存関係に基づいて、前記構成要素群のうちの関係元の構成要素を関係先の構成要素よりも上位に配置し、前記構成要素間の依存関係の連鎖の大本となる構成要素との関係度合いを示すランクを各構成要素に付与した構成要素列を作成し、
作成した前記構成要素列のうちの同一ランクの構成要素集合ごとに、前記構成要素集合に含まれる構成要素の種類が前記構成要素集合の中で占める割合を算出し、
算出した算出結果に基づいて、前記構成要素群の構造種別を決定する、
処理を実行させる分析支援プログラムを記録したことを特徴とする前記コンピュータに読み取り可能な記録媒体。