(57)【要約】【課題】効果的に、プログラムに関する複雑度を算出することができる複雑度算出装置、複雑度算出方法および複雑度算出プログラムを提供する。【解決手段】複雑度算出装置２１（一例として、サーバ装置１１に備えられたもの）は、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値（例えば、外部複雑性の値、内部複雑性の値、統合的な複雑度の値）を算出する複雑度算出部３１を備える、ことを特徴とする。【選択図】図１
2014032466.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出する複雑度算出部を備える、
ことを特徴とする複雑度算出装置。
【請求項２】
前記複雑度算出部は、
前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた外部複雑性を算出すること、
または、
前記複数の複雑度に関するメトリクスの値として循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた内部複雑性を算出すること、
または、
前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値と循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値と利用ライブラリ複雑度に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた統合的な複雑度を算出すること、
のうちの少なくとも１つを実行する、
ことを特徴とする請求項１に記載の複雑度算出装置。
【請求項３】
前記複雑度算出部は、前記プログラムのソースコードのモジュール群に含まれるモジュール毎の複雑度に関する値に基づいて、あらかじめ定められた当該モジュール群毎の複雑度に関する値を算出する、
ことを特徴とする請求項１または請求項２に記載の複雑度算出装置。
【請求項４】
モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、記号の大きさを規模に応じて異ならせて表示するように制御すること、または、記号の色を複雑度に関する情報に応じて異ならせて表示するように制御すること、のうちの一方または両方を行う表示制御部を備える、
ことを特徴とする請求項１から請求項３までのいずれか１項に記載の複雑度算出装置。
【請求項５】
前記表示制御部は、モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、あらかじめ定められた実質的なロジックが有るものと無いものとで、表示の形態を異ならせるように制御する、
ことを特徴とする請求項４に記載の複雑度算出装置。
【請求項６】
複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出するステップを有する、
ことを特徴とする複雑度算出方法。
【請求項７】
複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出する手順を、
コンピュータに実行させるための複雑度算出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複雑度算出装置、複雑度算出方法および複雑度算出プログラムに関する。
【背景技術】
【０００２】
特許文献１に係る「アプリケーション改造支援プログラム、アプリケーション改造支援方法およびアプリケーション改造支援装置」では、アプリケーションを修正する際に与える影響の大きさを表わす尺度（「インパクトスケール」）により、構造の接続関係の複雑度を定量的に求める技術が記載されている。これにより、アプリケーションの修正による影響が大きく保守しにくい箇所を正確に把握して、障害の予防に役立たせることが図られる（特許文献１参照。）。
【０００３】
ここで、特許文献１では、パッケージに関しては、パッケージをクラスとして扱うこともできるとのみ記述してあり、詳細な記述は無い。実務的には機能単位にグルーピングされたパッケージ単位に作業が行われる事が多いと想定できる。このため、クラス単位での複雑度の比較のみではなく、パッケージ単位での複雑度の比較手段が必要である。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２００９／０１１０５６号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
従来では、プログラムに関する複雑度を算出する点で、未だに不十分な面があった。
【０００６】
本発明は、このような状況に鑑みてなされたもので、効果的に、プログラムに関する複雑度を算出することができる複雑度算出装置、複雑度算出方法および複雑度算出プログラムを提供する。
【課題を解決するための手段】
【０００７】
上述した課題を解決するために、本発明は、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出する複雑度算出部を備える、ことを特徴とする複雑度算出装置である。
【０００８】
また、本発明は、前記複雑度算出部は、前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた外部複雑性を算出すること、または、前記複数の複雑度に関するメトリクスの値として循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた内部複雑性を算出すること、または、前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値と循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値と利用ライブラリ複雑度に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた統合的な複雑度を算出すること、のうちの少なくとも１つを実行する、ことを特徴とする複雑度算出装置である。
【０００９】
また、本発明は、前記複雑度算出部は、前記プログラムのソースコードのモジュール群に含まれるモジュール毎の複雑度に関する値に基づいて、あらかじめ定められた当該モジュール群毎の複雑度に関する値を算出する、ことを特徴とする複雑度算出装置である。
【００１０】
また、本発明は、モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、記号の大きさを規模に応じて異ならせて表示するように制御すること、または、記号の色を複雑度に関する情報に応じて異ならせて表示するように制御すること、のうちの一方または両方を行う表示制御部を備える、ことを特徴とする複雑度算出装置である。
【００１１】
また、本発明は、前記表示制御部は、モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、あらかじめ定められた実質的なロジックが有るものと無いものとで、表示の形態を異ならせるように制御する、ことを特徴とする複雑度算出装置である。
【００１２】
また、本発明は、複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出するステップを有する、ことを特徴とする複雑度算出方法である。
【００１３】
また、本発明は、複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出する手順を、コンピュータに実行させるための複雑度算出プログラムである。
【発明の効果】
【００１４】
以上説明したように、本発明によれば、効果的に、プログラムに関する複雑度を算出することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の一実施形態による複雑度算出システムの構成例を示すブロック図である。
【図２】本発明の一実施形態による複雑度算出部がｍ１〜ｍ８のメトリクスをクラス毎に取得する処理の手順の一例を示す図である。
【図３】本発明の一実施形態による測定メトリクスの取得終了時における複雑度の計算テーブルの一例を示す図である。
【図４】本発明の一実施形態による外部複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
【図５】本発明の一実施形態による内部複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
【図６】本発明の一実施形態による利用機能の複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
【図７】本発明の一実施形態によるクラス毎の複雑度の算出終了時における複雑度の計算テーブルの一例を示す図である。
【図８】（Ａ）はクラスの数が１であるパッケージの一例を示す図であり、（Ｂ）はクラスの数が２であるパッケージの一例を示す図である。
【図９】本発明の一実施形態によるパッケージの複雑度の計算テーブルの一例を示す図である。
【図１０】本発明の一実施形態による複雑度に関する情報を表示する画面の一例を示す図である。
【発明を実施するための形態】
【００１６】
以下、本発明の一実施形態について、図面を参照して説明する。
［本実施形態におけるシステムの概要］
図１は、本発明の一実施形態による複雑度算出システム１の構成例を示すブロック図である。
本実施形態に係る複雑度算出システム１は、サーバ装置１１と、端末装置１２を備える。
サーバ装置１１と端末装置１２は、有線または無線のネットワークを介して接続される。
サーバ装置１１および端末装置１２は、それぞれ、コンピュータを用いて構成されている。
端末装置１２は、例えば、利用者（ユーザ）により操作される端末（利用者端末）の装置であり、ブラウザを搭載している。
【００１７】
なお、サーバ装置１１や端末装置１２としては、それぞれ、様々な種類のものが用いられてもよい。
また、例えば、１個のサーバ装置１１に対して、複数個の端末装置がネットワークを介して接続されてもよい。
また、複雑度（複雑性）の算出としては、例えば、複雑度に関する値を算出する構成ばかりでなく、他の構成例として、複雑度の度合いを表す複数の範囲（例えば、複雑度が大、中、小などの範囲）をあらかじめ用意しておいて、複雑度に関する値を算出して、その複雑度がいずれの範囲に含まれるかを判定するような構成が用いられてもよい。
また、複雑度を「算出」するという語の代わりに、複雑度を「推定」するなどの語が使用されても、本発明に含まれ得る。
【００１８】
サーバ装置１１は、複雑度算出装置２１を備える。複雑度算出装置２１は、複雑度算出部３１と、表示制御部３２と、記憶部３３を備える。
端末装置１２は、ブラウザ部４１と、操作部４２と、表示部４３と、出力部４４と、記憶部４５を備える。記憶部４５には、プログラムのソースコード５１が記憶される。
【００１９】
端末装置１２の概略を説明する。
端末装置１２は、ネットワークを介して、サーバ装置１１へ情報を送信する機能や、サーバ装置１１から情報を受信する機能を有する。例えば、ブラウザ部４１は、サーバ装置１１から提供される情報を利用者により閲覧することを可能とする。
操作部４２は、例えば、キーボードやマウスなどを用いて構成され、利用者により操作される内容を受け付ける。
表示部４３は、液晶などの画面を用いて構成され、利用者に対して情報を画面に表示する。
出力部４４は、情報を外部へ出力する機能を有しており、例えば、情報を外部の印刷装置（プリンタ）などに出力する。
記憶部４５は、各種のメモリなどを用いて構成され、様々な情報を記憶する。本実施形態では、複雑度を算出する対象となるプログラムのソースコード５１が記憶部４５に記憶される。
【００２０】
サーバ装置１１の概略を説明する。
サーバ装置１１は、ネットワークを介して、端末装置１２へ情報を送信する機能や、端末装置１２から情報を受信する機能を有する。
複雑度算出装置２１において、複雑度算出部３１は、プログラムに関する複雑度を算出する。
複雑度算出装置２１において、表示制御部３２は、プログラムに関する複雑度について情報の表示を制御する。
複雑度算出装置２１において、記憶部３３は、各種のメモリなどを用いて構成され、様々な情報を記憶する。
【００２１】
サーバ装置１１と端末装置１２の動作の一例を示す。
端末装置１２では、利用者が操作部４２を操作することにより、記憶部４５に記憶されたプログラムのソースコード５１を、複雑度の算出対象として、ネットワークを介してサーバ装置１１へ送信する。
サーバ装置１１では、端末装置１１から受信したプログラムのソースコード５１に関して、複雑度算出部３１が複雑度を算出し、表示制御部３２が算出された複雑度について端末装置１２における表示の制御を行う。具体的には、表示制御部３２は、算出された複雑度について端末装置１２における表示を行うための情報（表示情報）を、ネットワークを介して端末装置１２へ送信する。
端末装置１２では、サーバ装置１１から受信した表示情報に基づいて、ブラウザ部４１のブラウザ機能により、当該表示情報の内容を表示部４３の画面に表示する。また、端末装置１２では、当該表示情報の内容を出力部４４から印刷装置などに出力することができる。
【００２２】
また、端末装置１２では、利用者が操作部４２を操作することで、表示部４３の画面の表示内容について各種の指示を入力することができる。端末装置１２では、入力された指示を、ネットワークを介してサーバ装置１１へ送信する。
サーバ装置１１では、端末装置１２から受信した指示に応じて、表示制御部３２が、端末装置１２における表示の制御（例えば、当該指示に応じて表示内容を変更する制御）を行う。
【００２３】
［本実施形態における複雑度の算出の詳細］
次に、サーバ装置１１に備えられた複雑度算出装置２１の複雑度算出部３１により、プログラムに関する複雑度を算出する処理の詳細について説明する。
通常、プログラムは複数のモジュールで構成され、仕様上の機能など意味のあるまとまり毎に複数のモジュールがまとめられている。本実施形態では、個々のモジュール、および複数のモジュール（モジュール群）について、それぞれ、統合的で定量化した複雑度を算出して表示する。
本実施形態では、オブジェクト指向のプログラム言語を対象としており、一例として、オブジェクト指向言語の一つであるＪａｖａ（登録商標）言語を例に説明する。Ｊａｖａ（登録商標）言語では、モジュールに相当するプログラムの最小単位はクラスであり、クラスには情報の操作を行うメソッドが含まれる。また、Ｊａｖａ（登録商標）言語では、機能的に関連する複数のクラスをまとめたものがパッケージとなり、モジュール群に相当する。
つまり、Ｊａｖａ（登録商標）言語では、「クラス」が「モジュール」に相当し、「パッケージ」が「モジュール群」に相当する。
【００２４】
なお、例えば、Ｃ＋＋やＣ＃など、Ｊａｖａ（登録商標）以外のプログラム言語に本実施形態に係る技術を適用することも可能であり、この場合には、Ｊａｖａ（登録商標）言語におけるクラスおよびパッケージに相当する単位（すなわち、モジュールおよびモジュール群に相当する単位）で次のような処理を行うようにする。
【００２５】
本実施形態では、次のような４つの処理を行う。
すなわち、＜１：メトリクス（品質尺度）を測定する処理＞、＜２：メトリクスを導出する処理＞、＜３：クラス毎に複雑度を算出する処理＞、＜４：パッケージ毎に複雑度を算出する処理＞を行う。
以下で、これらの処理を順に説明する。
【００２６】
＜１：メトリクス（品質尺度）を測定する処理＞
複雑度算出部３１は、複雑度を算出する対象とするプログラムのソースコードを対象として、本実施形態において基本的なメトリクスとするｍ１〜ｍ８のメトリクス（測定メトリクス）を、所定の処理手順（本実施形態では、図２に示される処理手順）にしたがって、クラス毎に取得する。
ｍ１〜ｍ７のメトリクスは、複雑度を決める材料として使用し、また、ｍ８のメトリクスは、プログラムの規模を示す材料として使用する。
【００２７】
｛ｍ１のメトリクス｝
記号ｍ１で示すメトリクスとして、「結合度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、０以上の値（０〜）となる。
「結合度」のメトリクスは、ソフトウェア工学でＣｏｕｐｌｉｎｇ  Ｂｅｔｗｅｅｎ  Ｏｂｊｅｃｔｓ（ＣＢＯ）と呼ばれる、一般的なメトリクスである。このメトリクスは、計測対象となるクラスと結合している他のクラスの数を示す。このメトリクスの値が大きいほど、他のクラスに依存する可能性が高いため、他のクラスからの変更の影響が大きい。
【００２８】
｛ｍ２のメトリクス｝
記号ｍ２で示すメトリクスとして、「メソッド数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、０以上の値（０〜）となる。
「メソッド数」のメトリクスは、計測対象となるクラスの継承を含むメソッドのうち、他のクラスからの呼び出しが可能なメソッドの総和を示す。このメトリクスの値が大きいほど、他のクラスに対する変更の影響が大きい。
なお、このメトリクスは、一般的なものである。
【００２９】
｛ｍ３のメトリクス｝
記号ｍ３で示すメトリクスとして、「凝集度の欠如」というメトリクス名のメトリクスを用いる。このメトリクスの値は、０以上１以下の値（０〜１）となる。
「凝集度の欠如」のメトリクスは、ソフトウェア工学でＬａｃｋ  ｏｆ  Ｃｏｈｅｓｉｏｎ  ｉｎ  Ｍｅｔｈｏｄｓ（ＬＣＯＭ）と呼ばれる、一般的なメトリクスである。このメトリクスは、測定対象となるクラスの内のメソッド（機能）とフィールド（情報）が結び付いていない度合いを示す。このメトリクスの値が大きいほど、機能と情報の自己完結性が低い。
【００３０】
｛ｍ４のメトリクス｝
記号ｍ４で示すメトリクスとして、「循環的複雑度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、１以上の値（１〜）となる。
「循環的複雑度」のメトリクスは、ソフトウェア工学でＣｙｃｌｏｍａｔｉｃ  ｃｏｍｐｌｅｘｉｔｙと呼ばれる、一般的なメトリクスである。このメトリクスは、分岐（例えば、Ｊａｖａ（登録商標）言語では、ｉｆ）や繰り返し（例えば、Ｊａｖａ（登録商標）言語では、ｆｏｒ）などの制御文によって生じる実行上の経路の数を示す。このメトリクスの値が大きいほど、構造の複雑性が高い。このメトリクスの値に関しては、クラスの全てのメソッドに対して測定し、測定した結果の合計値をクラスの代表値とする。
【００３１】
｛ｍ５のメトリクス｝
記号ｍ５で示すメトリクスとして、「最大ネスト合計数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、０以上の値（０〜）となる。
「最大ネスト合計数」のメトリクスは、分岐（例えば、Ｊａｖａ（登録商標）言語では、ｉｆ）や繰り返し（例えば、Ｊａｖａ（登録商標）言語では、ｆｏｒ）などの制御文の中に制御文が存在するネスト（入れ子）で繰り返される最大数をメソッド毎にカウントし、クラスの内の全てのメソッド毎の値を合計した値を示す。このメトリクスの値が大きいほど、複雑度が高い。
なお、このメトリクスは、一般的なものである。
【００３２】
｛ｍ６のメトリクス｝
このメトリクスは、本発明において、独自に検討して採用するものである。
記号ｍ６で示すメトリクスとして、「利用ライブラリ複雑度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、１以上３以下の値（１〜３）となり、本実施形態では、１、２、３のうちのいずれかとなる。
「利用ライブラリ複雑度」のメトリクスは、利用ライブラリ（機能）の個々の複雑度を示す。このメトリクスの値が大きいほど、利用する機能を実装する側（計測対象となるクラス）の複雑性が高い。
なお、測定対象となるクラスの利用ライブラリが２以上ある場合には、それぞれの利用ライブラリの複雑度のうちで最も大きい値を、当該クラスの「利用ライブラリ複雑度」のメトリクスの値とする。
【００３３】
ここで、本実施形態では、次の（定義概念１）〜（定義概念３）により、「利用ライブラリ複雑度」のメトリクスの値を決定する。
なお、いずれの機能をいずれの値とするかについては、任意に設定されてもよい。具体的には、例えば、それぞれの利用ライブラリ（機能）とその複雑度の値との対応が格納されたデータベース（ＤＢ）などがあらかじめ設けられ、複雑度算出部３１は、利用ライブラリ（機能）の複雑度を取得するときには、毎回、当該データベースなどに格納された当該対応の内容を参照して、利用ライブラリ（機能）の複雑度を決定（取得）する。ここで、このデータベースなどは、例えば、サーバ装置１１の外部に設けられてもよく、または、サーバ装置１１の内部であって複雑度算出装置２１の外部に設けられてもよく、または、複雑度算出装置２１の内部であって複雑度算出部３１の外部に設けられてもよく、または、複雑度算出部３１に設けられてもよい。
（定義概念１）利用ライブラリが、言語依存で外部環境に強く依存しない機能である場合には、当該利用ライブラリの複雑度を１（低）とする。このような機能としては、例えば、ユーザインタフェース（ＵＩ）機能や、算術演算機能などを用いることができる。
（定義概念２）利用ライブラリが、言語依存で外部のデバイスの制御を行う機能である場合、あるいは、セキュリティ確保を行う機能である場合には、当該利用ライブラリの複雑度を２（中）とする。このような機能としては、例えば、入出力機能や、セキュリティ機能などを用いることができる。
（定義概念３）利用ライブラリが、言語非依存の機能である場合、あるいは、言語仕様の根幹に関わる機能である場合には、当該利用ライブラリの複雑度を３（高）とする。このような機能としては、例えば、通信機能や、多言語連携機能などを用いることができる。
【００３４】
｛ｍ７のメトリクス｝
このメトリクスは、本発明において、独自に検討して採用するものである。
記号ｍ７で示すメトリクスとして、「単純処理フラグ」というメトリクス名のメトリクスを用いる。このメトリクスの値は、真、または、偽となる。
「単純処理フラグ」のメトリクスは、実質的なロジックの有無を判定（判断）した結果を示す。このメトリクスの値は、単純処理である場合（実質的なロジックが無い場合には真の値（ＴＲＵＥ）となり、単純処理ではない場合（実質的なロジックが有る場合）には偽の値（ＦＡＬＳＥ）となる。
【００３５】
ここで、本実施形態では、次の（条件１）〜（条件３）により、「単純処理フラグ」のメトリクスの値を決定する。具体的には、測定対象のクラスが（条件１）〜（条件３）のうちの少なくとも１つを満たす場合には、当該クラスを単純処理であるもの（実質的なロジックが無いもの）であると判定し、一方、測定対象のクラスが（条件１）〜（条件３）のいずれも満たさない場合には、当該クラスを単純処理ではないもの（実質的なロジックが有るもの）であると判定する。
（条件１）新しいインスタンスを作成しておらず（例えば、Ｊａｖａ（登録商標）言語では、ｎｅｗキーワードによるインスタンスの作成を行っておらず）、且つ、制御構文（例えば、Ｊａｖａ（登録商標）言語では、ｉｆやｓｗｉｔｃｈなど）が含まれていないという条件。
（条件２）新しいインスタンスを作成しておらず（例えば、Ｊａｖａ（登録商標）言語では、ｎｅｗキーワードによるインスタンスの作成を行っておらず）、且つ、四則演算を行っていないという条件。
（条件３）制御構文（例えば、Ｊａｖａ（登録商標）言語では、ｉｆやｓｗｉｔｃｈなど）が含まれておらず、且つ、四則演算が行われていないという条件。
【００３６】
｛ｍ８のメトリクス｝
記号ｍ８で示すメトリクスとして、「ステップ数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、０以上の値（０〜）となる。
「ステップ数」のメトリクスは、ソフトウェア工学でＬＯＣと呼ばれる、一般的なメトリクスである。本実施形態では、このメトリクスは、プログラムコードの数をカウントしたものを、クラス毎に集計した結果の値となる。なお、この値の計算方法としては、任意の方法が用いられてもよい。
【００３７】
図２は、本実施形態による複雑度算出部３１がｍ１〜ｍ８のメトリクスをクラス毎に取得する処理の手順の一例を示す図である。
ここで、測定対象として１以上のクラスがあり、その１以上のクラス（通常は、複数のクラス）によりパッケージが構成されているとする。
【００３８】
まず、複雑度算出部３１は、計測対象となるクラスについて、そのパッケージの名称（パッケージ名）およびそのクラスの名称（クラス名）を取得する（ステップＳ１）。
次に、複雑度算出部３１は、ｍ７で示す「単純処理フラグ」のメトリクスの値を取得する（ステップＳ２）。
そして、複雑度算出部３１は、取得した「単純処理フラグ」のメトリクスの値に基づいて、実質的なロジックの有無（単純処理ではないか、または、単純処理であるか）を判定する（ステップＳ３）。
【００３９】
ステップＳ３の処理の結果、複雑度算出部３１は、単純処理ではないこと（偽：ＦＡＬＳＥ）を判定した場合には、複雑度の算出を行うために、ｍ８およびｍ１〜ｍ６のメトリクスの値を取得して（ステップＳ４）、ステップＳ５の処理へ移行する。
一方、ステップＳ３の処理の結果、複雑度算出部３１は、単純処理であること（真：ＴＲＵＥ）を判定した場合には、複雑度の算出を行わないこととして、ステップＳ５の処理へ移行する。
【００４０】
ステップＳ５の処理では、複雑度算出部３１は、測定対象となるクラスの全てについて処理（ステップＳ１〜ステップＳ４の処理）が終了したか否かを判定する（ステップＳ５）。
ステップＳ５の処理の結果、複雑度算出部３１は、測定対象となるクラスの全てについて処理が終了していないと判定した場合には、ステップＳ１の処理へ移行して、未だに処理していない測定対象のクラスについて、ステップＳ１〜ステップＳ４の処理を行う。
一方、ステップＳ５の処理の結果、複雑度算出部３１は、測定対象となるクラスの全てについて処理が終了したと判定した場合には、クラス毎の複雑度の算出の処理へ移行する。
【００４１】
図３は、本実施形態による測定メトリクスの取得終了時における複雑度の計算テーブルの一例を示す図である。
本実施形態では、複雑度算出装置２１において、複雑度算出部３１は、複雑度の算出処理を行う際に、このような複雑度の計算テーブルの情報を記憶部３３に記憶し、処理の進みにしたがって、その情報を更新していく。
なお、図３などに示される複雑度の計算テーブルの情報は模式的に示したものであり、実際の情報の記憶のさせ方は、任意のものであってもよい。
【００４２】
図３に示される複雑度の計算テーブルでは、“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる“ｓａｍｐｌｅ１”というクラス名のクラスについて、ｍ７のメトリクスにより実質的なロジックが有ること（偽：ＦＡＬＳＥ）が判定され、これに応じて、ｍ１〜ｍ６およびｍ８のメトリクスの値が取得されている。具体的には、図３の例では、ｍ１＝１７、ｍ２＝１０８、ｍ３＝０．９４、ｍ４＝６６、ｍ５＝６、ｍ６＝３、ｍ８＝２５２となっている。
一方、図３に示される複雑度の計算テーブルでは、前記と同じ“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる他の“ｓａｍｐｌｅ２”というクラス名のクラスについて、ｍ７のメトリクスにより実質的なロジックが無いこと（真：ＴＲＵＥ）が判定され、これに応じて、ｍ１〜ｍ６のメトリクスの値は取得されない。なお、図３の例では、このクラスについて、ｍ８のメトリクスの値を取得した場合を示しているが、このメトリクスの値は取得されなくてもよい。具体的には、図３の例では、ｍ８＝７８となっている。
【００４３】
＜２：メトリクスを導出する処理＞
本実施形態では、クラスの複雑度には、外部複雑性、内部複雑性、利用機能の複雑性、という３つの側面の要素を持たせている。これらは、本発明において、独自に検討して採用するものである。複雑度算出部３１は、外部複雑性、内部複雑性、利用機能の複雑性を算出する。
外部複雑性、内部複雑性の一部については、ｍ１〜ｍ７の中で対応する測定メトリクスを材料として計算して、統合した値を導き出す。なお、測定メトリクスから計算により導き出されるメトリクスを導出メトリクスと呼ぶ。
外部複雑性の導出には、ｍ１〜ｍ３のメトリクスを用いる。
内部複雑性の導出には、ｍ４〜ｍ５のメトリクスを用いる。
利用機能の複雑性には、ｍ６のメトリクスをそのまま用いる。
共通的な複雑性には、ｍ７のメトリクスをそのまま用いる。
【００４４】
｛１：外部複雑性｝
計測対象となるクラスの外部複雑性は、変更作業や仕様理解を行おうとした場合に、他のクラスの変更や仕様が、計測対象となるクラスへ与える影響の可能性の大きさに着目したメトリクスである。
外部複雑性を構成する指標としては、次に示す指標Ａ、指標Ｂという２つの指標がある。これら２つの指標Ａ、Ｂを次の式で１つの値にまとめて、外部複雑性のメトリクスの値とする。
【００４５】
外部複雑性のメトリクス（Ｍ１）＝指標Ａ＋指標Ｂ−１  （−１〜１の値を取る）
【００４６】
ここで、例えば、外部複雑性のメトリクスの値Ｍ１＝−１である場合には、外部のクラスの複雑性の影響が小さい。
一方、外部複雑性のメトリクスの値Ｍ１＝１である場合には、外部のクラスの複雑度に強く影響を受ける。
【００４７】
指標Ａは、外部のクラスからの変更の影響を示す。具体的には、指標Ａは、計測対象となるクラスが参照している他のクラスの数の多さによる、他のクラスの変更により影響される数（＝ｍ１）と、計測対象となるクラスが他のクラスから呼び出し可能なメソッドを提供する数の多さによる、変更が他のクラスへ影響を与える数（＝ｍ２）のうち、他のクラスの変更に影響される度合いを示す。
測定対象となるクラスについて、「結合度」のメトリクスの値をｍ１とし、継承を含んで他のクラスから呼び出し可能なメソッドの数（「メソッド数」）のメトリクスの値をｍ２とすると、指標Ａは次の式で表される。
【００４８】
指標Ａ＝ｍ１／（ｍ１＋ｍ２）  （０〜１の値を取る）
【００４９】
指標Ｂは、測定対象となるクラスについて、外部のクラスからの被参照性を示し、一般的に知られているものである。
指標Ｂは、測定対象となるクラスの内で定義されたフィールド（情報）が当該クラスの内で定義されたメソッドから参照された、メソッド（機能）とフィールド（情報）が結び付いていない度合いを示す。これにより、フィールド（情報）が外部から参照される可能性が高いとみなすものである。
指標Ｂは、次の式で表される。
測定対象となるクラスについて、「凝集度の欠如」のメトリクスの値をｍ３とする。
【００５０】
指標Ｂ＝ｍ３  （０〜１の値を取る）
【００５１】
図４は、本実施形態による外部複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
図４に示される複雑度の計算テーブルでは、“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる“ｓａｍｐｌｅ１”というクラス名のクラスについて、記号Ｍ１で示す外部複雑性の値が取得されている。具体的には、図４の例では、Ｍ１＝０．０７５９９となっている。
一方、図４に示される複雑度の計算テーブルでは、前記と同じ“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる他の“ｓａｍｐｌｅ２”というクラス名のクラスについて、図４の例では、記号Ｍ１で示す外部複雑性の値は、算出されず、“０．０００００”となっている。
【００５２】
｛２：内部複雑性｝
内部複雑性は、構造面からみた複雑性を表し、次の式により、２つのメトリクス（内部複雑性のメトリクス１および内部複雑性のメトリクス２）で表現する。複雑度算出部３１は、内部複雑性のメトリクス１および内部複雑性のメトリクス２を算出する。
測定対象となるクラスについて、「循環的複雑度」のメトリクスの値をｍ４とし、「最大ネスト合計数」のメトリクスの値をｍ５とする。
【００５３】
内部複雑性のメトリクス１（Ｍ２）＝ｍ４
【００５４】
内部複雑性のメトリクス２（Ｍ３）＝ｍ５／ｍ４
なお、ｍ５はｍ４と相関が高いことから、事前処理として、この式の演算を行っている。
【００５５】
図５は、本実施形態による内部複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
図５に示される複雑度の計算テーブルでは、“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる“ｓａｍｐｌｅ１”というクラス名のクラスについて、記号Ｍ２で示す内部複雑性のメトリクス１の値および記号Ｍ３で示す内部複雑性のメトリクス２の値が取得されている。具体的には、図５の例では、Ｍ２＝６６、Ｍ３＝０．０９１となっている。
一方、図５に示される複雑度の計算テーブルでは、前記と同じ“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる他の“ｓａｍｐｌｅ２”というクラス名のクラスについて、図５の例では、記号Ｍ２で示す内部複雑性のメトリクス１の値および記号Ｍ３で示す内部複雑性のメトリクス２の値は、算出されず、いずれも“０”となっている。
【００５６】
｛３：利用機能の複雑性｝
複雑度算出部３１は、次の式により、利用機能の複雑性のメトリクスを算出する。
測定対象となるクラスについて、「利用ライブラリ複雑度」のメトリクスの値をｍ６とする。
【００５７】
利用機能の複雑性のメトリクス（Ｍ４）＝ｍ６
【００５８】
図６は、本実施形態による利用機能の複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
図６に示される複雑度の計算テーブルでは、“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる“ｓａｍｐｌｅ１”というクラス名のクラスについて、記号Ｍ４で示す利用機能の複雑性のメトリクスの値が取得されている。具体的には、Ｍ４＝３となっている。
一方、図６に示される複雑度の計算テーブルでは、前記と同じ“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる他の“ｓａｍｐｌｅ２”というクラス名のクラスについて、図６の例では、記号Ｍ４で示す利用機能の複雑性のメトリクスの値は、算出されず、“０”となっている。
【００５９】
＜３：クラス毎に複雑度を算出する処理＞
複雑度算出部３１は、クラス毎の複雑度を算出する。
本実施形態では、外部複雑性のメトリクスの値（Ｍ１）、内部複雑性のメトリクスの値（Ｍ２、Ｍ３）、利用機能の複雑性のメトリクスの値（Ｍ４）を説明変数（材料）として重回帰分析で得た次の式（回帰式）により、クラス毎の複雑度を求める。
なお、目的変数は、有識者により行った被験者評価による実測値である（難しい＝３、中程度＝２、簡単＝１）。Ｍ１〜Ｍ４のそれぞれの係数としては、例えば、他の値が用いられてもよい。
【００６０】
クラス毎の複雑度
＝Ｍ１×０．１１８２＋Ｍ２×０．０１２０
＋Ｍ３×０．４３８９＋Ｍ４×０．０１１３＋０．９４１２
【００６１】
ここで、Ｍ１〜Ｍ４は、「結合度」のメトリクスの値ｍ１、「メソッド数」のメトリクスの値ｍ２、「凝集度の欠如」のメトリクスの値ｍ３、「循環的複雑度」のメトリクスの値ｍ４、「最大ネスト合計数」のメトリクスの値ｍ５、「利用ライブラリ複雑度」のメトリクスの値ｍ６を用いて算出される。
このため、クラス毎の複雑度は、Ｍ１〜Ｍ４を用いて算出されるとも言え、また、ｍ１〜ｍ６を用いて算出されるとも言える。例えば、複雑度算出部３１は、ｍ１〜ｍ６を用いて、Ｍ１〜Ｍ４を算出せずに、クラス毎の複雑度を算出することも可能である。
【００６２】
図７は、本実施形態によるクラス毎の複雑度の算出終了時における複雑度の計算テーブルの一例を示す図である。
図７に示される複雑度の計算テーブルでは、“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる“ｓａｍｐｌｅ１”というクラス名のクラスについて、クラス毎の複雑度（複雑度（クラス））の値が、Ｍ１〜Ｍ４を用いて算出されて、取得されている。具体的には、図７の例では、複雑度（クラス）の値＝１．８２となっている。
一方、図７に示される複雑度の計算テーブルでは、前記と同じ“ａａ．ｂｂ．ｃｃｃ”というパッケージ名のパッケージに含まれる他の“ｓａｍｐｌｅ２”というクラス名のクラスについて、図７の例では、クラス毎の複雑度の算出は行われないが、実質的なロジックが無いことから、複雑度算出部３１により、簡単であることを示す値（この例では、１）がクラス毎の複雑度（複雑度（クラス））の値として設定される。
【００６３】
＜４：パッケージ毎に複雑度を算出する処理＞
複雑度算出部３１は、パッケージ毎の複雑度を算出する。
本実施形態では、プログラムの試験やレビューにおいてパッケージ単位での複雑度（パッケージ毎の複雑度）を比較する場合に、算術平均値は同じであっても、プログラムの試験では、複雑度の高いクラスが多く存在するパッケージの方により高いリスクが潜在すると考える。このため、パッケージを比較する場合に、パッケージに含まれるクラスの数が多いほど、パッケージの複雑度を表す値が高くなるように、また、同じクラスの数であればクラスの複雑度の合計が大きいほど、パッケージの複雑度を表す値が高くなるように、パッケージの複雑度を定義した。
【００６４】
図８（Ａ）および図８（Ｂ）を参照して具体例を示す。
図８（Ａ）は、クラスの数が１であるパッケージ１０１の一例を示す図である。
このパッケージ１０１（“パッケージα”）には、複雑度が２である１個のクラス１１１が含まれている。このパッケージ１０１に関し、当該パッケージ１０１に含まれるクラス１１１の複雑度の算術平均値は２である。
図８（Ｂ）は、クラスの数が２であるパッケージ１０２の一例を示す図である。
このパッケージ１０２（“パッケージβ”）には、複雑度が２である２個のクラス１２１、１２２が含まれている。このパッケージ１０２に関し、当該パッケージ１０２に含まれるクラス１２１、１２２の複雑度の算術平均値は２である。
【００６５】
このように、パッケージ１０１とパッケージ１０２とは複雑度の算術平均値は同じになるが、本実施形態では、パッケージ１０１の複雑度よりもパッケージ１０２の複雑度を高くする。
一例として、次のような式で各パッケージ１０１、１０２（パッケージα、β）の複雑度を算出すると、クラスの構成数の違いを表現することができる。
パッケージαの複雑度＝（１／３）×２≒０．６７
パッケージβの複雑度＝（２／３）×２≒１．３３
【００６６】
複雑度算出部３１は、次の式により、パッケージ毎の複雑度を算出する。
この式では、パッケージＰｉの複雑度ｄｉを算出する。
任意のＸについて、｜Ｘ｜をＸの要素数とする。具体的には、｜Ｐｉ｜はパッケージＰｉに含まれるクラスの数を表す。ＰｉのｉやＰｋのｋはパッケージの番号（例えば、１、２、３、・・・）を表し、｜ＵＰｋ｜は全てのパッケージＰｋに含まれるクラスの数（総数）を表す。
ｃはクラスを表し、ｃｃｏｍｐｌｅｘｉｔｙはクラスｃの複雑度を表す。
パッケージＰｉに含まれるクラスｃに関するΣｃｃｏｍｐｌｅｘｉｔｙの部分は、パッケージＰｉに含まれる全てのクラスｃについてクラス毎の複雑度ｃｃｏｍｐｌｅｘｉｔｙを総和した結果を表す。
【００６７】
【数１】
2014032466.tif 000003
【００６８】
この式により得られる値は、パッケージＰｉ内にあるクラスｃの複雑度ｃｃｏｍｐｌｅｘｉｔｙの平均値（１クラス当たりの複雑度）に、システム全体におけるクラスの数（全てのパッケージＰｋに含まれるクラスの総数）に対する当該パッケージＰｉが保有するクラスの数の比率を乗じた結果の値である。この値は、例えば、パッケージ単位で相対的な複雑度の大小（相対的なリスクの大小）を把握したい場合に参照する数値として用いることができる。
【００６９】
ここで、この式で算出されるパッケージＰｉの複雑度ｄｉは、パッケージＰｉに含まれるクラスの数が相対的に極端に少ないような場合には、極めて小さい値となり識別しづらい（例えば、実例では１万倍の差が生じることもある）。また、この式で得られる値については、パッケージ単位で複雑度の大小を把握することが目的であるため、大小関係を保持しさえすればよい。
このため、複雑度算出部３１は、パッケージＰｉの複雑度ｄｉについて、数値の比較をしやすいように、例えば、次の式により、スケールを変換してもよい。
ここで、この式では、パッケージＰｉの複雑度ｄｉについて、スケール変換後におけるパッケージＰｉの複雑度Ｄｉを算出する。Ｌｏｇは、自然対数を表す。
【００７０】
【数２】
2014032466.tif 000004
【００７１】
この式により得られる値は、パッケージＰｉ内にあるクラスｃの複雑度ｃｃｏｍｐｌｅｘｉｔｙの平均値（１クラス当たりの複雑度）に、システム全体におけるクラスの数（全てのパッケージＰｋに含まれるクラスの総数）に対する当該パッケージＰｉが保有するクラスの数の比率を乗じ、この乗算結果を対数変換などした結果の値である。この値は、例えば、複雑度を比較するための指標値（例えば、最小と最大との差が１０倍程度のもの）であり、パッケージ単位で相対的な複雑度の大小（相対的なリスクの大小）を把握したい場合に参照する数値として用いることができる。
【００７２】
図９は、本実施形態によるパッケージの複雑度の計算テーブルの一例を示す図である。
本実施形態では、複雑度算出装置２１において、複雑度算出部３１は、パッケージの複雑度の算出処理を行う際に、このようなパッケージの複雑度の計算テーブルの情報を記憶部３３に記憶する。
なお、図９に示されるパッケージの複雑度の計算テーブルの情報は模式的に示したものであり、実際の情報の記憶のさせ方は、任意のものであってもよい。
【００７３】
図９に示されるパッケージの複雑度の計算テーブルでは、パッケージの名称（パッケージ名）と、パッケージに含まれるクラスの数（クラス数）と、１クラス当たりの複雑度つまり平均値（複雑度／１クラス）と、全てのクラスの複雑度の合計（複雑度（クラス）合計）と、パッケージの複雑度ｄｉ（パッケージ複雑度）と、スケール変換におけるｂａｓｅの値（スケール変換におけるｂａｓｅ）と、スケール変換後のパッケージの複雑度Ｄｉ（スケール変換におけるパッケージ複雑度）が対応付けられる。また、図９に示されるパッケージの複雑度の計算テーブルでは、全てのパッケージのクラス数の合計値も記述される。
【００７４】
ここで、図９の例では、複雑度の算出対象となるプログラムのソースコード５１に、４個のパッケージ（それぞれ、「パッケージＡ」、「パッケージＢ」、「パッケージＣ」、「パッケージＤ」という名称のパッケージ）が含まれるとしている。
【００７５】
具体的には、図９の例では、「パッケージＡ」という名称のパッケージについて、クラス数＝２０、複雑度／１クラス＝１．０、複雑度（クラス）合計＝２０、パッケージ複雑度＝０．０８３、スケール変換におけるｂａｓｅ＝６．４８、スケール変換におけるパッケージ複雑度＝４．９９６となっている。また、「パッケージＢ」という名称のパッケージについて、クラス数＝２０、複雑度／１クラス＝３．０、複雑度（クラス）合計＝６０、パッケージ複雑度＝０．２５０、スケール変換におけるｂａｓｅ＝６．４８、スケール変換におけるパッケージ複雑度＝６．０９４となっている。また、「パッケージＣ」という名称のパッケージについて、クラス数＝１００、複雑度／１クラス＝１．０、複雑度（クラス）合計＝１００、パッケージ複雑度＝０．４１７、スケール変換におけるｂａｓｅ＝６．４８、スケール変換におけるパッケージ複雑度＝６．６０５となっている。また、「パッケージＤ」という名称のパッケージについて、クラス数＝１００、複雑度／１クラス＝３．０、複雑度（クラス）合計＝３００、パッケージ複雑度＝１．２５０、スケール変換におけるｂａｓｅ＝６．４８、スケール変換におけるパッケージ複雑度＝７．７０４となっている。また、（全てのパッケージのクラス数の合計値）＝２４０となっている。
【００７６】
［本実施形態における複雑度に関する表示の詳細］
次に、サーバ装置１１に備えられた複雑度算出装置２１の表示制御部３２により、複雑度算出部３１により算出された複雑度に関する情報の表示を行う処理の詳細について説明する。
サーバ装置１１に備えられた複雑度算出装置２１の表示制御部３２は、複雑度算出部３１により算出された複雑度に関する情報を表示する画面を作成して、その画面の情報をネットワークを介して端末装置１２のブラウザ部４１のブラウザ機能へ送信する。端末装置１２のブラウザ部４１のブラウザ機能は、この画面の情報を受信して、表示部４３に表示出力する。
【００７７】
図１０は、本実施形態による複雑度に関する情報を表示する画面２０１の一例を示す図である。
なお、図１０では、画面２０１の外側に、画面２０１の内側の模式的な記号などの見方を記述してある。
この画面２０１の例では、大別すると、アイコンのツリー形式の表示と、スライダーの表示が行われている。
【００７８】
＜アイコンのツリー形式の表示＞
画面２０１では、頂点をシステム全体として、パッケージおよびパッケージに配置されたクラスを階層的にアイコンで描画して、ツリー形式で表示する。
“ＡＡＡ”や“ＢＢＢ”や“ａａａ”などは、システムやパッケージやクラスの名称を表す。
｛アイコンの形状｝
二重の四角のアイコンは、システムを表す。
四角（通常の四角）のアイコンは、パッケージを表す。
丸のアイコンは、クラスを表す。
このように、本実施形態では、アイコンの形状により、対称の種類（本実施形態では、システム、パッケージ、クラス）を区別して表示する。なお、他のアイコンの形状が用いられてもよい。
【００７９】
｛アイコンの大きさ｝
画面２０１では、パッケージやクラスについて、コードの規模に応じて、アイコンの大きさを異ならせる。
本実施形態では、コードの規模が大きい方から小さい方への順で、アイコンの大きさを大・中・小の３段階に区別して描画する。具体的には、パッケージやクラスについて、アイコンの大きさを特定する方法としては、測定した「ステップ数」のメトリクスの値ｍ８を用いて、その最大値から最小値までの範囲を３分割（例えば、等分割、または、所定の方法で分割）して、大きい方から３つの範囲をそれぞれ、コード規模が大の範囲、コード規模が中の範囲、コード規模が小の範囲と判定する。
【００８０】
ここで、クラスについては、各クラスのコード規模（本実施形態では、「ステップ数」のメトリクスの値ｍ８）を用いる。そして、全てのクラスを対象として、「ステップ数」のメトリクスの値ｍ８の最大値から最小値までの範囲を３分割する。
また、パッケージについては、一例として、各パッケージのコード規模（本実施形態では、各パッケージに含まれる全てのクラスについての「ステップ数」のメトリクスの値ｍ８の総和）を用いることができる。この場合、前記したクラスのコード規模に関する処理と同様な処理を、クラスをパッケージに置き換えて、行うことが可能である。
【００８１】
なお、パッケージやクラスについて、そのコードの規模に応じて、アイコンの大きさを３段階（または、他の複数の段階）で区別する他の方法として、「ステップ数」のメトリクスの値ｍ８に関する平均値（μ）と標準偏差（σ）を使用する方法を用いることもできる。
具体的には、３段階の例では、パッケージまたはクラスの値が｛平均値（μ）＋標準偏差（σ）｝以上の値である場合（正規分布においては、全体の１５．９％に相当する場合）には、コード規模が大きい（大である）とする。また、パッケージまたはクラスの値が｛平均値（μ）＋標準偏差（σ）｝未満であって｛平均値（μ）−標準偏差（σ）｝以上である場合（正規分布においては、全体の６８．２％に相当する場合）には、コード規模が中であるとする。また、パッケージまたはクラスの値が｛平均値（μ）−標準偏差（σ）｝未満であって０以上である場合（正規分布においては、全体の１５．９％に相当する場合）には、コード規模が小さい（小である）とする。
【００８２】
｛アイコンの色｝
画面２０１では、パッケージやクラスについて、複雑度に応じて、アイコンに着色する色を異ならせる。なお、図１０では、各色の代わりに、各色に対応する模様を用いて区別している。
具体的には、クラスについては、「単純処理フラグ」のメトリクスの値ｍ７に基づいて、単純処理ではないもの（実質的なロジックが有るもの）だけについて、複雑度が高いクラスのアイコンを赤色で表し、複雑度が中程度のクラスのアイコンを黄色で表し、複雑度が低いクラスのアイコンを青色で表す。また、単純処理である（実質的なロジックが無い）クラスについては、灰色で表す。
また、単純処理ではない（実質的なロジックが有る）クラスについて、クラス毎の複雑度の値が第１の閾値（例えば、２．６）以上である場合には複雑度が高い（赤色）と判定し、クラス毎の複雑度の値が第１の閾値（例えば、２．６）未満であって第２の閾値（例えば、１．６）以上である場合には複雑度が中程度である（黄色）と判定し、クラス毎の複雑度の値が第２の閾値（例えば、１．６）未満である場合には複雑度が低い（青色）と判定する。
【００８３】
また、パッケージについては、本実施形態では、当該パッケージに含まれるクラスの複雑度の中で最大のもの（最大値）を用いて、アイコンの色を決定する。この理由は、リファクタリングの対象を把握しやくするするためである。
一例として、パッケージについては、当該パッケージに含まれるクラスの中で、１つでも赤色のクラスがあればパッケージのアイコンを赤色とし、赤色のクラスが無くて１つでも黄色のクラスがあればパッケージのアイコンを黄色とし、赤色のクラスと黄色のクラスが無くて１つでも青色のクラスがあればパッケージのアイコンを青色とし、また、全てのクラスが灰色であればパッケージのアイコンを灰色とする。
【００８４】
なお、他の構成例として、パッケージについては、パッケージ毎の複雑度の値を用いて、アイコンの色を決定してもよい。この場合、前記したクラスのアイコンの色分けに関する処理と同様な処理を、クラスをパッケージに置き換えて、行うことが可能である。
【００８５】
＜スライダーの表示＞
画面２０１では、閾値群３０１と、スライダー３０２を表示する。
閾値群３０１は、複雑度に応じたアイコンの色分けを行うために使用される閾値（例えば、第１の閾値、第２の閾値）により決定される複数（この例では、３つ）の範囲を示す。具体的には、０．１を最小単位として、第１の閾値以上（例えば、２．６以上）の範囲、第１の閾値未満（例えば、２．５以下）であって第２の閾値以上（例えば、１．６以上）の範囲、第２の閾値未満（例えば、１．５以下）の範囲を示す。
【００８６】
また、端末装置１２では、利用者は、操作部４２を操作することにより、スライダー３０２の中央値に対応する位置（図１０では、“１．０”と示されている位置）を上下に移動させることが可能である。
スライダー３０２の位置と閾値群３０１の閾値とは１対１で対応しており、利用者の要求などにしたがって、閾値群３０１の閾値を調整することが可能である。
これにより、例えば、複雑度の尺度の中央付近（この例では、黄色に対応するもの）に位置するクラス群に対して、高（赤色）、中（黄色）、低（青色）を決定するための閾値（例えば、第１の閾値、第２の閾値）をスライダー３０２の移動によって変動させることなどができる。具体例として、複雑度が比較的高いクラスを詳しく区別するように可視化することや、複雑度が比較的低いクラスを詳しく区別するように可視化することなどが可能である。
【００８７】
［本実施形態のまとめ］
以上のように、本実施形態に係る複雑度算出システム１におけるサーバ装置１１に備えられた複雑度算出装置２１では、プログラムのソースコードを解析することにより、プログラムの複雑度を算出することができる。
本実施形態に係る複雑度算出装置２１では、複雑度算出部３１は、プログラムのソースコードに対して、メトリクス（品質尺度）を計測し、プログラムの最小単位であるクラス（モジュールの一例）毎に、および、複数のクラスで構成される機能単位であるパッケージ（モジュール群の一例）毎に、統合的な複雑度を定量化して算出し、表示制御部３２は、算出された複雑度に関する情報を表示する。
【００８８】
具体例として、本実施形態に係る複雑度算出装置２１では、複雑度算出部３１は、プログラムのソースコードに対して、あらかじめ定められた複数のメトリクスの値ｍ１〜ｍ８を測定（検出）し、これに基づいて、あらかじめ定められた３つの側面（外部複雑性、内部複雑性、利用機能の複雑性）に関するメトリクス（品質尺度）の値を測定（検出）する。また、複雑度算出部３１は、プログラムの最小単位であるクラス毎に、測定したメトリクスを用いて定量化した統合的な複雑度（クラス毎の複雑度）を計測（検出）する。また、複雑度算出部３１は、複数のクラスから構成されるパッケージ毎に、当該パッケージを構成する個々のクラスの複雑度に基づいて、複雑度（パッケージ毎の複雑度）を測定（検出）する。
このように、複雑度算出部３１は、ソースコードを解析対象として、３つの側面（外部複雑性、内部複雑性、利用機能の複雑性）から既存および独自のメトリクスを測定し、それらを計算材料として、クラスやパッケージの複雑度の度合いを統合された代表値としてまとめる。
【００８９】
また、具体例として、表示制御部３２は、クラスおよびパッケージを、形（例えば、対象の種類に対応する）や大きさ（例えば、コード規模に対応する）や色（例えば、複雑度の度合いに対応する）に意味を持たせたアイコンとして扱い、アイコンを用いてプログラムの構造を、パッケージの階層に合わせて展開可能なツリー形状で視覚的に表示し、求められたクラスの複雑度やパッケージの複雑度を把握可能な形式で表示する。また、表示制御部３２は、利用者により行われる操作などにしたがって、表示の際に使用する閾値（例えば、色分けのための複雑度に関する閾値）などを変更する。
【００９０】
以上のように、本実施形態に係る複雑度算出システム１におけるサーバ装置１１に備えられた複雑度算出装置２１によると、次のような効果を得ることができる。
本実施形態に係る複雑度算出装置２１によると、例えば、ソースコード（ソースコード群でもよい）の処理の詳細や、従来技術で表示に用いられてきたメトリクス群（例えば、凝集度の欠如や、循環的複雑度など）について、さらに複雑性を解釈や判定することがなくても、プロジェクトマネージャや管理者により、直感的にリスク（複雑度）の存在箇所を把握することができる。
【００９１】
このような本実施形態に係る技術を利用して活用することが可能なシーン（場面）の例としては、次のような（利用シーン１）〜（利用シーン５）が考えられる。なお、勿論、本実施形態に係る技術は、他のシーンで利用されて活用されてもよい。
（利用シーン１）ある会社（Ａ社）のパッケージと他の会社（Ｂ社）のパッケージについて、複雑性（複雑度）を比較する品質の比較を行うシーン。
（利用シーン２）プログラムについて、リスクが高い箇所から集中的な試験を行うことにより早期段階でのバグ摘出を行うシーン。
（利用シーン３）プログラムについて、クラス（モジュールの一例）をリファクタリングすることの必要性を判断するシーン。
（利用シーン４）プログラムについて、限られた期間内で試験の優先順付けを行うシーン。
（利用シーン５）自社以外で開発したシステムの保守を引き受ける際にリスク（複雑度）を把握するシーン。
【００９２】
また、本実施形態に係る複雑度算出装置２１によると、例えば、パッケージ毎の複雑度として、システム全体におけるクラスの数に対する該当するパッケージに含まれるクラスの数の比を考慮した代表値を求めているため、システム全体におけるパッケージという意味合いの単位で、リスク（複雑度）の高低を比較しやすい。
【００９３】
また、本実施形態に係る複雑度算出装置２１によると、例えば、複雑度が高いクラス（モジュールの一例）が位置するパッケージがどこにあるのかを特定しやすくなる。具体例として、図１０に示されるような画面２０１において、赤色（複雑度が高いもの）のパッケージのアイコンを階層的に辿る操作により、複雑度が高いクラスが位置するパッケージを特定することができる。
【００９４】
また、本実施形態に係る複雑度算出装置２１によると、例えば、複雑度に基づく色分け表示で使用される閾値を、利用者が変動させることができるようにしてあり、これにより、値の中央付近に集中するクラス群を視覚的に分解することなどによって、利用者の直感的な理解を支援することができる。具体例として、図１０に示されるような画面２０１において、スライダー３０２の移動により、閾値群３０１の閾値を変化させることができる。
【００９５】
＜本実施形態に関する構成例＞
一構成例として、複雑度算出装置２１では、複雑度算出部３１が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した２つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する１つの値を算出する。
ここで、前記した複数の複雑度に関するメトリクスの値、前記した２つ以上の複雑度に関するメトリクスの値、前記したあらかじめ定められた複雑度に関する１つの値としては、それぞれ、様々なものが用いられてもよい。
【００９６】
一構成例として、複雑度算出装置２１では、複雑度算出部３１が、前記複数の複雑度に関するメトリクスの値として「結合度」に関するメトリクスの値ｍ１と「メソッド数」に関するメトリクスの値ｍ２と「凝集度の欠如」に関するメトリクスの値ｍ３を測定して、これらの値ｍ１〜ｍ３を用いてあらかじめ定められた外部複雑性（Ｍ１）を算出すること、または、前記複数の複雑度に関するメトリクスの値として「循環的複雑度」に関するメトリクスの値ｍ４と「最大ネスト合計数」に関するメトリクスの値ｍ５を測定して、これらの値ｍ４〜ｍ５を用いてあらかじめ定められた内部複雑性（Ｍ２、Ｍ３）を算出すること、または、前記複数の複雑度に関するメトリクスの値として「結合度」に関するメトリクスの値ｍ１と「メソッド数」に関するメトリクスの値ｍ２と「凝集度の欠如」に関するメトリクスの値ｍ３と「循環的複雑度」に関するメトリクスの値ｍ４と「最大ネスト合計数」に関するメトリクスの値ｍ５と「利用ライブラリ複雑度」に関するメトリクスの値ｍ６を測定して、これらの値ｍ１〜ｍ６（または、例えば、Ｍ１〜Ｍ４でもよい）を用いてあらかじめ定められた統合的な複雑度（例えば、モジュール毎の複雑度、または、モジュール群毎の複雑度）を算出すること、のうちの少なくとも１つ（本実施形態では、全て）を実行する。
つまり、複雑度算出部３１が、外部複雑性（Ｍ１）の算出と、内部複雑性（Ｍ２、Ｍ３）の算出と、統合的な複雑度の算出と、のうちの少なくとも１つを実行する。
ここで、統合的な複雑度は、例えば、外部複雑性と内部複雑性のうちの一方または両方を算出した上で算出されてもよく、または、外部複雑性や内部複雑性を算出せずに、直接的に算出されてもよい。
【００９７】
一構成例として、複雑度算出装置２１では、複雑度算出部３１が、前記プログラムのソースコードのモジュール群（本実施形態では、一例として、パッケージ）に含まれるモジュール（本実施形態では、一例として、クラス）毎の複雑度に関する値に基づいて、あらかじめ定められた当該モジュール群毎の複雑度に関する値を算出する。
具体的な一例として、複雑度算出部３１は、プログラムのソースコードに関して、システムが有する複数のパッケージのうちのそれぞれのパッケージについて、パッケージに含まれるそれぞれのクラスについてクラス毎の複雑度の値を算出し、前記複数のパッケージについてのその算出結果に基づいて、それぞれのパッケージ毎の複雑度の値を算出する。
また、モジュール、モジュール群としては、それぞれ、例えばプログラムに応じて、様々なものが用いられてもよい。
【００９８】
一構成例として、複雑度算出装置２１では、表示制御部３２が、モジュールを表す記号（例えば、アイコン）とモジュール群を表す記号（例えば、アイコン）のうちの一方または両方について、記号の大きさを規模（例えば、コードの規模）に応じて異ならせて表示するように制御すること、または、記号の色を複雑度に関する情報（例えば、複雑度に関する値、または、複雑度に関する判定の結果、など）に応じて異ならせて表示するように制御すること、のうちの一方または両方を行う。
ここで、参照する情報（例えば、値）に応じて記号の大きさや色を異ならせる方法としては、例えば、１つ以上の閾値を設定して、当該参照する情報と閾値との大小関係に応じて記号の大きさや色を決定するような方法を用いることができる。
【００９９】
一構成例として、複雑度算出装置２１では、表示制御部３２が、モジュールを表す記号（例えば、アイコン）とモジュール群を表す記号（例えば、アイコン）のうちの一方または両方について、あらかじめ定められた実質的なロジックが有るものと無いもの（例えば、「単純処理フラグ」のメトリクスの値ｍ７に基づいて判定される結果）とで、表示の形態（例えば、表示に使用する色）を異ならせるように制御する。
【０１００】
［全体のまとめ］
以上、この発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【０１０１】
なお、以上に説明した任意の装置（例えば、サーバ装置１１やその複雑度算出装置２１、または、端末装置１２）における任意の構成部の機能を実現するためのプログラムを、コンピュータ読み取り可能な記録媒体に記録し、そのプログラムをコンピュータシステムに読み込ませて実行するようにしてもよい。なお、ここで言う「コンピュータシステム」とは、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）や周辺機器等のハードウェアを含むものとする。また、「コンピュータシステム」は、インターネットやＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、専用回線等の通信回線を含むネットワークを介して接続された複数のコンピュータ装置を含んでもよい。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ）−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことを言う。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ（ＲＡＭ：Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）のように、一定時間プログラムを保持しているものも含むものとする。
【０１０２】
また、上記のプログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことを言う。
また、上記のプログラムは、前述した機能の一部を実現するためのものであってもよい。さらに、上記のプログラムは、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であってもよい。
【０１０３】
また、前述した機能の一部または全部を、ＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）等の集積回路として実現してもよい。前述した各機能は、個別にプロセッサ化されてもよいし、あるいは、一部または全部を集積してプロセッサ化されてもよい。また、集積回路化の手法としては、ＬＳＩに限られず、専用回路または汎用プロセッサで実現されてもよい。また、半導体技術の進歩によりＬＳＩに代替する集積回路化の技術が出現した場合には、当該技術による集積回路が用いられてもよい。
【符号の説明】
【０１０４】
１…複雑度算出システム、１１…サーバ装置、１２…端末装置、２１…複雑度算出装置、３１…複雑度算出部、３２…表示制御部、３３…記憶部、４１…ブラウザ部、４２…操作部、４３…表示部、４４…出力部、４５…記憶部、５１…ソースコード、１０１、１０２…パッケージ、１１１、１２１、１２２…クラス、３０１…閾値群、３０２…スライダー
【図１】
2014032466.tif 000005
【図２】
2014032466.tif 000006
【図３】
2014032466.tif 000007
【図４】
2014032466.tif 000008
【図５】
2014032466.tif 000009
【図６】
2014032466.tif 000010
【図７】
2014032466.tif 000011
【図８】
2014032466.tif 000012
【図９】
2014032466.tif 000013
【図１０】
2014032466.tif 000014