JP2014032466A - 複雑度算出装置、複雑度算出方法および複雑度算出プログラム - Google Patents
複雑度算出装置、複雑度算出方法および複雑度算出プログラム Download PDFInfo
- Publication number
- JP2014032466A JP2014032466A JP2012171297A JP2012171297A JP2014032466A JP 2014032466 A JP2014032466 A JP 2014032466A JP 2012171297 A JP2012171297 A JP 2012171297A JP 2012171297 A JP2012171297 A JP 2012171297A JP 2014032466 A JP2014032466 A JP 2014032466A
- Authority
- JP
- Japan
- Prior art keywords
- complexity
- value
- metric
- package
- class
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】効果的に、プログラムに関する複雑度を算出することができる複雑度算出装置、複雑度算出方法および複雑度算出プログラムを提供する。
【解決手段】複雑度算出装置21(一例として、サーバ装置11に備えられたもの)は、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値(例えば、外部複雑性の値、内部複雑性の値、統合的な複雑度の値)を算出する複雑度算出部31を備える、ことを特徴とする。
【選択図】図1
【解決手段】複雑度算出装置21(一例として、サーバ装置11に備えられたもの)は、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値(例えば、外部複雑性の値、内部複雑性の値、統合的な複雑度の値)を算出する複雑度算出部31を備える、ことを特徴とする。
【選択図】図1
Description
本発明は、複雑度算出装置、複雑度算出方法および複雑度算出プログラムに関する。
特許文献1に係る「アプリケーション改造支援プログラム、アプリケーション改造支援方法およびアプリケーション改造支援装置」では、アプリケーションを修正する際に与える影響の大きさを表わす尺度(「インパクトスケール」)により、構造の接続関係の複雑度を定量的に求める技術が記載されている。これにより、アプリケーションの修正による影響が大きく保守しにくい箇所を正確に把握して、障害の予防に役立たせることが図られる(特許文献1参照。)。
ここで、特許文献1では、パッケージに関しては、パッケージをクラスとして扱うこともできるとのみ記述してあり、詳細な記述は無い。実務的には機能単位にグルーピングされたパッケージ単位に作業が行われる事が多いと想定できる。このため、クラス単位での複雑度の比較のみではなく、パッケージ単位での複雑度の比較手段が必要である。
従来では、プログラムに関する複雑度を算出する点で、未だに不十分な面があった。
本発明は、このような状況に鑑みてなされたもので、効果的に、プログラムに関する複雑度を算出することができる複雑度算出装置、複雑度算出方法および複雑度算出プログラムを提供する。
上述した課題を解決するために、本発明は、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出する複雑度算出部を備える、ことを特徴とする複雑度算出装置である。
また、本発明は、前記複雑度算出部は、前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた外部複雑性を算出すること、または、前記複数の複雑度に関するメトリクスの値として循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた内部複雑性を算出すること、または、前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値と循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値と利用ライブラリ複雑度に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた統合的な複雑度を算出すること、のうちの少なくとも1つを実行する、ことを特徴とする複雑度算出装置である。
また、本発明は、前記複雑度算出部は、前記プログラムのソースコードのモジュール群に含まれるモジュール毎の複雑度に関する値に基づいて、あらかじめ定められた当該モジュール群毎の複雑度に関する値を算出する、ことを特徴とする複雑度算出装置である。
また、本発明は、モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、記号の大きさを規模に応じて異ならせて表示するように制御すること、または、記号の色を複雑度に関する情報に応じて異ならせて表示するように制御すること、のうちの一方または両方を行う表示制御部を備える、ことを特徴とする複雑度算出装置である。
また、本発明は、前記表示制御部は、モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、あらかじめ定められた実質的なロジックが有るものと無いものとで、表示の形態を異ならせるように制御する、ことを特徴とする複雑度算出装置である。
また、本発明は、複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出するステップを有する、ことを特徴とする複雑度算出方法である。
また、本発明は、複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出する手順を、コンピュータに実行させるための複雑度算出プログラムである。
以上説明したように、本発明によれば、効果的に、プログラムに関する複雑度を算出することができる。
以下、本発明の一実施形態について、図面を参照して説明する。
[本実施形態におけるシステムの概要]
図1は、本発明の一実施形態による複雑度算出システム1の構成例を示すブロック図である。
本実施形態に係る複雑度算出システム1は、サーバ装置11と、端末装置12を備える。
サーバ装置11と端末装置12は、有線または無線のネットワークを介して接続される。
サーバ装置11および端末装置12は、それぞれ、コンピュータを用いて構成されている。
端末装置12は、例えば、利用者(ユーザ)により操作される端末(利用者端末)の装置であり、ブラウザを搭載している。
[本実施形態におけるシステムの概要]
図1は、本発明の一実施形態による複雑度算出システム1の構成例を示すブロック図である。
本実施形態に係る複雑度算出システム1は、サーバ装置11と、端末装置12を備える。
サーバ装置11と端末装置12は、有線または無線のネットワークを介して接続される。
サーバ装置11および端末装置12は、それぞれ、コンピュータを用いて構成されている。
端末装置12は、例えば、利用者(ユーザ)により操作される端末(利用者端末)の装置であり、ブラウザを搭載している。
なお、サーバ装置11や端末装置12としては、それぞれ、様々な種類のものが用いられてもよい。
また、例えば、1個のサーバ装置11に対して、複数個の端末装置がネットワークを介して接続されてもよい。
また、複雑度(複雑性)の算出としては、例えば、複雑度に関する値を算出する構成ばかりでなく、他の構成例として、複雑度の度合いを表す複数の範囲(例えば、複雑度が大、中、小などの範囲)をあらかじめ用意しておいて、複雑度に関する値を算出して、その複雑度がいずれの範囲に含まれるかを判定するような構成が用いられてもよい。
また、複雑度を「算出」するという語の代わりに、複雑度を「推定」するなどの語が使用されても、本発明に含まれ得る。
また、例えば、1個のサーバ装置11に対して、複数個の端末装置がネットワークを介して接続されてもよい。
また、複雑度(複雑性)の算出としては、例えば、複雑度に関する値を算出する構成ばかりでなく、他の構成例として、複雑度の度合いを表す複数の範囲(例えば、複雑度が大、中、小などの範囲)をあらかじめ用意しておいて、複雑度に関する値を算出して、その複雑度がいずれの範囲に含まれるかを判定するような構成が用いられてもよい。
また、複雑度を「算出」するという語の代わりに、複雑度を「推定」するなどの語が使用されても、本発明に含まれ得る。
サーバ装置11は、複雑度算出装置21を備える。複雑度算出装置21は、複雑度算出部31と、表示制御部32と、記憶部33を備える。
端末装置12は、ブラウザ部41と、操作部42と、表示部43と、出力部44と、記憶部45を備える。記憶部45には、プログラムのソースコード51が記憶される。
端末装置12は、ブラウザ部41と、操作部42と、表示部43と、出力部44と、記憶部45を備える。記憶部45には、プログラムのソースコード51が記憶される。
端末装置12の概略を説明する。
端末装置12は、ネットワークを介して、サーバ装置11へ情報を送信する機能や、サーバ装置11から情報を受信する機能を有する。例えば、ブラウザ部41は、サーバ装置11から提供される情報を利用者により閲覧することを可能とする。
操作部42は、例えば、キーボードやマウスなどを用いて構成され、利用者により操作される内容を受け付ける。
表示部43は、液晶などの画面を用いて構成され、利用者に対して情報を画面に表示する。
出力部44は、情報を外部へ出力する機能を有しており、例えば、情報を外部の印刷装置(プリンタ)などに出力する。
記憶部45は、各種のメモリなどを用いて構成され、様々な情報を記憶する。本実施形態では、複雑度を算出する対象となるプログラムのソースコード51が記憶部45に記憶される。
端末装置12は、ネットワークを介して、サーバ装置11へ情報を送信する機能や、サーバ装置11から情報を受信する機能を有する。例えば、ブラウザ部41は、サーバ装置11から提供される情報を利用者により閲覧することを可能とする。
操作部42は、例えば、キーボードやマウスなどを用いて構成され、利用者により操作される内容を受け付ける。
表示部43は、液晶などの画面を用いて構成され、利用者に対して情報を画面に表示する。
出力部44は、情報を外部へ出力する機能を有しており、例えば、情報を外部の印刷装置(プリンタ)などに出力する。
記憶部45は、各種のメモリなどを用いて構成され、様々な情報を記憶する。本実施形態では、複雑度を算出する対象となるプログラムのソースコード51が記憶部45に記憶される。
サーバ装置11の概略を説明する。
サーバ装置11は、ネットワークを介して、端末装置12へ情報を送信する機能や、端末装置12から情報を受信する機能を有する。
複雑度算出装置21において、複雑度算出部31は、プログラムに関する複雑度を算出する。
複雑度算出装置21において、表示制御部32は、プログラムに関する複雑度について情報の表示を制御する。
複雑度算出装置21において、記憶部33は、各種のメモリなどを用いて構成され、様々な情報を記憶する。
サーバ装置11は、ネットワークを介して、端末装置12へ情報を送信する機能や、端末装置12から情報を受信する機能を有する。
複雑度算出装置21において、複雑度算出部31は、プログラムに関する複雑度を算出する。
複雑度算出装置21において、表示制御部32は、プログラムに関する複雑度について情報の表示を制御する。
複雑度算出装置21において、記憶部33は、各種のメモリなどを用いて構成され、様々な情報を記憶する。
サーバ装置11と端末装置12の動作の一例を示す。
端末装置12では、利用者が操作部42を操作することにより、記憶部45に記憶されたプログラムのソースコード51を、複雑度の算出対象として、ネットワークを介してサーバ装置11へ送信する。
サーバ装置11では、端末装置11から受信したプログラムのソースコード51に関して、複雑度算出部31が複雑度を算出し、表示制御部32が算出された複雑度について端末装置12における表示の制御を行う。具体的には、表示制御部32は、算出された複雑度について端末装置12における表示を行うための情報(表示情報)を、ネットワークを介して端末装置12へ送信する。
端末装置12では、サーバ装置11から受信した表示情報に基づいて、ブラウザ部41のブラウザ機能により、当該表示情報の内容を表示部43の画面に表示する。また、端末装置12では、当該表示情報の内容を出力部44から印刷装置などに出力することができる。
端末装置12では、利用者が操作部42を操作することにより、記憶部45に記憶されたプログラムのソースコード51を、複雑度の算出対象として、ネットワークを介してサーバ装置11へ送信する。
サーバ装置11では、端末装置11から受信したプログラムのソースコード51に関して、複雑度算出部31が複雑度を算出し、表示制御部32が算出された複雑度について端末装置12における表示の制御を行う。具体的には、表示制御部32は、算出された複雑度について端末装置12における表示を行うための情報(表示情報)を、ネットワークを介して端末装置12へ送信する。
端末装置12では、サーバ装置11から受信した表示情報に基づいて、ブラウザ部41のブラウザ機能により、当該表示情報の内容を表示部43の画面に表示する。また、端末装置12では、当該表示情報の内容を出力部44から印刷装置などに出力することができる。
また、端末装置12では、利用者が操作部42を操作することで、表示部43の画面の表示内容について各種の指示を入力することができる。端末装置12では、入力された指示を、ネットワークを介してサーバ装置11へ送信する。
サーバ装置11では、端末装置12から受信した指示に応じて、表示制御部32が、端末装置12における表示の制御(例えば、当該指示に応じて表示内容を変更する制御)を行う。
サーバ装置11では、端末装置12から受信した指示に応じて、表示制御部32が、端末装置12における表示の制御(例えば、当該指示に応じて表示内容を変更する制御)を行う。
[本実施形態における複雑度の算出の詳細]
次に、サーバ装置11に備えられた複雑度算出装置21の複雑度算出部31により、プログラムに関する複雑度を算出する処理の詳細について説明する。
通常、プログラムは複数のモジュールで構成され、仕様上の機能など意味のあるまとまり毎に複数のモジュールがまとめられている。本実施形態では、個々のモジュール、および複数のモジュール(モジュール群)について、それぞれ、統合的で定量化した複雑度を算出して表示する。
本実施形態では、オブジェクト指向のプログラム言語を対象としており、一例として、オブジェクト指向言語の一つであるJava(登録商標)言語を例に説明する。Java(登録商標)言語では、モジュールに相当するプログラムの最小単位はクラスであり、クラスには情報の操作を行うメソッドが含まれる。また、Java(登録商標)言語では、機能的に関連する複数のクラスをまとめたものがパッケージとなり、モジュール群に相当する。
つまり、Java(登録商標)言語では、「クラス」が「モジュール」に相当し、「パッケージ」が「モジュール群」に相当する。
次に、サーバ装置11に備えられた複雑度算出装置21の複雑度算出部31により、プログラムに関する複雑度を算出する処理の詳細について説明する。
通常、プログラムは複数のモジュールで構成され、仕様上の機能など意味のあるまとまり毎に複数のモジュールがまとめられている。本実施形態では、個々のモジュール、および複数のモジュール(モジュール群)について、それぞれ、統合的で定量化した複雑度を算出して表示する。
本実施形態では、オブジェクト指向のプログラム言語を対象としており、一例として、オブジェクト指向言語の一つであるJava(登録商標)言語を例に説明する。Java(登録商標)言語では、モジュールに相当するプログラムの最小単位はクラスであり、クラスには情報の操作を行うメソッドが含まれる。また、Java(登録商標)言語では、機能的に関連する複数のクラスをまとめたものがパッケージとなり、モジュール群に相当する。
つまり、Java(登録商標)言語では、「クラス」が「モジュール」に相当し、「パッケージ」が「モジュール群」に相当する。
なお、例えば、C++やC#など、Java(登録商標)以外のプログラム言語に本実施形態に係る技術を適用することも可能であり、この場合には、Java(登録商標)言語におけるクラスおよびパッケージに相当する単位(すなわち、モジュールおよびモジュール群に相当する単位)で次のような処理を行うようにする。
本実施形態では、次のような4つの処理を行う。
すなわち、<1:メトリクス(品質尺度)を測定する処理>、<2:メトリクスを導出する処理>、<3:クラス毎に複雑度を算出する処理>、<4:パッケージ毎に複雑度を算出する処理>を行う。
以下で、これらの処理を順に説明する。
すなわち、<1:メトリクス(品質尺度)を測定する処理>、<2:メトリクスを導出する処理>、<3:クラス毎に複雑度を算出する処理>、<4:パッケージ毎に複雑度を算出する処理>を行う。
以下で、これらの処理を順に説明する。
<1:メトリクス(品質尺度)を測定する処理>
複雑度算出部31は、複雑度を算出する対象とするプログラムのソースコードを対象として、本実施形態において基本的なメトリクスとするm1〜m8のメトリクス(測定メトリクス)を、所定の処理手順(本実施形態では、図2に示される処理手順)にしたがって、クラス毎に取得する。
m1〜m7のメトリクスは、複雑度を決める材料として使用し、また、m8のメトリクスは、プログラムの規模を示す材料として使用する。
複雑度算出部31は、複雑度を算出する対象とするプログラムのソースコードを対象として、本実施形態において基本的なメトリクスとするm1〜m8のメトリクス(測定メトリクス)を、所定の処理手順(本実施形態では、図2に示される処理手順)にしたがって、クラス毎に取得する。
m1〜m7のメトリクスは、複雑度を決める材料として使用し、また、m8のメトリクスは、プログラムの規模を示す材料として使用する。
{m1のメトリクス}
記号m1で示すメトリクスとして、「結合度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「結合度」のメトリクスは、ソフトウェア工学でCoupling Between Objects(CBO)と呼ばれる、一般的なメトリクスである。このメトリクスは、計測対象となるクラスと結合している他のクラスの数を示す。このメトリクスの値が大きいほど、他のクラスに依存する可能性が高いため、他のクラスからの変更の影響が大きい。
記号m1で示すメトリクスとして、「結合度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「結合度」のメトリクスは、ソフトウェア工学でCoupling Between Objects(CBO)と呼ばれる、一般的なメトリクスである。このメトリクスは、計測対象となるクラスと結合している他のクラスの数を示す。このメトリクスの値が大きいほど、他のクラスに依存する可能性が高いため、他のクラスからの変更の影響が大きい。
{m2のメトリクス}
記号m2で示すメトリクスとして、「メソッド数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「メソッド数」のメトリクスは、計測対象となるクラスの継承を含むメソッドのうち、他のクラスからの呼び出しが可能なメソッドの総和を示す。このメトリクスの値が大きいほど、他のクラスに対する変更の影響が大きい。
なお、このメトリクスは、一般的なものである。
記号m2で示すメトリクスとして、「メソッド数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「メソッド数」のメトリクスは、計測対象となるクラスの継承を含むメソッドのうち、他のクラスからの呼び出しが可能なメソッドの総和を示す。このメトリクスの値が大きいほど、他のクラスに対する変更の影響が大きい。
なお、このメトリクスは、一般的なものである。
{m3のメトリクス}
記号m3で示すメトリクスとして、「凝集度の欠如」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上1以下の値(0〜1)となる。
「凝集度の欠如」のメトリクスは、ソフトウェア工学でLack of Cohesion in Methods(LCOM)と呼ばれる、一般的なメトリクスである。このメトリクスは、測定対象となるクラスの内のメソッド(機能)とフィールド(情報)が結び付いていない度合いを示す。このメトリクスの値が大きいほど、機能と情報の自己完結性が低い。
記号m3で示すメトリクスとして、「凝集度の欠如」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上1以下の値(0〜1)となる。
「凝集度の欠如」のメトリクスは、ソフトウェア工学でLack of Cohesion in Methods(LCOM)と呼ばれる、一般的なメトリクスである。このメトリクスは、測定対象となるクラスの内のメソッド(機能)とフィールド(情報)が結び付いていない度合いを示す。このメトリクスの値が大きいほど、機能と情報の自己完結性が低い。
{m4のメトリクス}
記号m4で示すメトリクスとして、「循環的複雑度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、1以上の値(1〜)となる。
「循環的複雑度」のメトリクスは、ソフトウェア工学でCyclomatic complexityと呼ばれる、一般的なメトリクスである。このメトリクスは、分岐(例えば、Java(登録商標)言語では、if)や繰り返し(例えば、Java(登録商標)言語では、for)などの制御文によって生じる実行上の経路の数を示す。このメトリクスの値が大きいほど、構造の複雑性が高い。このメトリクスの値に関しては、クラスの全てのメソッドに対して測定し、測定した結果の合計値をクラスの代表値とする。
記号m4で示すメトリクスとして、「循環的複雑度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、1以上の値(1〜)となる。
「循環的複雑度」のメトリクスは、ソフトウェア工学でCyclomatic complexityと呼ばれる、一般的なメトリクスである。このメトリクスは、分岐(例えば、Java(登録商標)言語では、if)や繰り返し(例えば、Java(登録商標)言語では、for)などの制御文によって生じる実行上の経路の数を示す。このメトリクスの値が大きいほど、構造の複雑性が高い。このメトリクスの値に関しては、クラスの全てのメソッドに対して測定し、測定した結果の合計値をクラスの代表値とする。
{m5のメトリクス}
記号m5で示すメトリクスとして、「最大ネスト合計数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「最大ネスト合計数」のメトリクスは、分岐(例えば、Java(登録商標)言語では、if)や繰り返し(例えば、Java(登録商標)言語では、for)などの制御文の中に制御文が存在するネスト(入れ子)で繰り返される最大数をメソッド毎にカウントし、クラスの内の全てのメソッド毎の値を合計した値を示す。このメトリクスの値が大きいほど、複雑度が高い。
なお、このメトリクスは、一般的なものである。
記号m5で示すメトリクスとして、「最大ネスト合計数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「最大ネスト合計数」のメトリクスは、分岐(例えば、Java(登録商標)言語では、if)や繰り返し(例えば、Java(登録商標)言語では、for)などの制御文の中に制御文が存在するネスト(入れ子)で繰り返される最大数をメソッド毎にカウントし、クラスの内の全てのメソッド毎の値を合計した値を示す。このメトリクスの値が大きいほど、複雑度が高い。
なお、このメトリクスは、一般的なものである。
{m6のメトリクス}
このメトリクスは、本発明において、独自に検討して採用するものである。
記号m6で示すメトリクスとして、「利用ライブラリ複雑度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、1以上3以下の値(1〜3)となり、本実施形態では、1、2、3のうちのいずれかとなる。
「利用ライブラリ複雑度」のメトリクスは、利用ライブラリ(機能)の個々の複雑度を示す。このメトリクスの値が大きいほど、利用する機能を実装する側(計測対象となるクラス)の複雑性が高い。
なお、測定対象となるクラスの利用ライブラリが2以上ある場合には、それぞれの利用ライブラリの複雑度のうちで最も大きい値を、当該クラスの「利用ライブラリ複雑度」のメトリクスの値とする。
このメトリクスは、本発明において、独自に検討して採用するものである。
記号m6で示すメトリクスとして、「利用ライブラリ複雑度」というメトリクス名のメトリクスを用いる。このメトリクスの値は、1以上3以下の値(1〜3)となり、本実施形態では、1、2、3のうちのいずれかとなる。
「利用ライブラリ複雑度」のメトリクスは、利用ライブラリ(機能)の個々の複雑度を示す。このメトリクスの値が大きいほど、利用する機能を実装する側(計測対象となるクラス)の複雑性が高い。
なお、測定対象となるクラスの利用ライブラリが2以上ある場合には、それぞれの利用ライブラリの複雑度のうちで最も大きい値を、当該クラスの「利用ライブラリ複雑度」のメトリクスの値とする。
ここで、本実施形態では、次の(定義概念1)〜(定義概念3)により、「利用ライブラリ複雑度」のメトリクスの値を決定する。
なお、いずれの機能をいずれの値とするかについては、任意に設定されてもよい。具体的には、例えば、それぞれの利用ライブラリ(機能)とその複雑度の値との対応が格納されたデータベース(DB)などがあらかじめ設けられ、複雑度算出部31は、利用ライブラリ(機能)の複雑度を取得するときには、毎回、当該データベースなどに格納された当該対応の内容を参照して、利用ライブラリ(機能)の複雑度を決定(取得)する。ここで、このデータベースなどは、例えば、サーバ装置11の外部に設けられてもよく、または、サーバ装置11の内部であって複雑度算出装置21の外部に設けられてもよく、または、複雑度算出装置21の内部であって複雑度算出部31の外部に設けられてもよく、または、複雑度算出部31に設けられてもよい。
(定義概念1)利用ライブラリが、言語依存で外部環境に強く依存しない機能である場合には、当該利用ライブラリの複雑度を1(低)とする。このような機能としては、例えば、ユーザインタフェース(UI)機能や、算術演算機能などを用いることができる。
(定義概念2)利用ライブラリが、言語依存で外部のデバイスの制御を行う機能である場合、あるいは、セキュリティ確保を行う機能である場合には、当該利用ライブラリの複雑度を2(中)とする。このような機能としては、例えば、入出力機能や、セキュリティ機能などを用いることができる。
(定義概念3)利用ライブラリが、言語非依存の機能である場合、あるいは、言語仕様の根幹に関わる機能である場合には、当該利用ライブラリの複雑度を3(高)とする。このような機能としては、例えば、通信機能や、多言語連携機能などを用いることができる。
なお、いずれの機能をいずれの値とするかについては、任意に設定されてもよい。具体的には、例えば、それぞれの利用ライブラリ(機能)とその複雑度の値との対応が格納されたデータベース(DB)などがあらかじめ設けられ、複雑度算出部31は、利用ライブラリ(機能)の複雑度を取得するときには、毎回、当該データベースなどに格納された当該対応の内容を参照して、利用ライブラリ(機能)の複雑度を決定(取得)する。ここで、このデータベースなどは、例えば、サーバ装置11の外部に設けられてもよく、または、サーバ装置11の内部であって複雑度算出装置21の外部に設けられてもよく、または、複雑度算出装置21の内部であって複雑度算出部31の外部に設けられてもよく、または、複雑度算出部31に設けられてもよい。
(定義概念1)利用ライブラリが、言語依存で外部環境に強く依存しない機能である場合には、当該利用ライブラリの複雑度を1(低)とする。このような機能としては、例えば、ユーザインタフェース(UI)機能や、算術演算機能などを用いることができる。
(定義概念2)利用ライブラリが、言語依存で外部のデバイスの制御を行う機能である場合、あるいは、セキュリティ確保を行う機能である場合には、当該利用ライブラリの複雑度を2(中)とする。このような機能としては、例えば、入出力機能や、セキュリティ機能などを用いることができる。
(定義概念3)利用ライブラリが、言語非依存の機能である場合、あるいは、言語仕様の根幹に関わる機能である場合には、当該利用ライブラリの複雑度を3(高)とする。このような機能としては、例えば、通信機能や、多言語連携機能などを用いることができる。
{m7のメトリクス}
このメトリクスは、本発明において、独自に検討して採用するものである。
記号m7で示すメトリクスとして、「単純処理フラグ」というメトリクス名のメトリクスを用いる。このメトリクスの値は、真、または、偽となる。
「単純処理フラグ」のメトリクスは、実質的なロジックの有無を判定(判断)した結果を示す。このメトリクスの値は、単純処理である場合(実質的なロジックが無い場合には真の値(TRUE)となり、単純処理ではない場合(実質的なロジックが有る場合)には偽の値(FALSE)となる。
このメトリクスは、本発明において、独自に検討して採用するものである。
記号m7で示すメトリクスとして、「単純処理フラグ」というメトリクス名のメトリクスを用いる。このメトリクスの値は、真、または、偽となる。
「単純処理フラグ」のメトリクスは、実質的なロジックの有無を判定(判断)した結果を示す。このメトリクスの値は、単純処理である場合(実質的なロジックが無い場合には真の値(TRUE)となり、単純処理ではない場合(実質的なロジックが有る場合)には偽の値(FALSE)となる。
ここで、本実施形態では、次の(条件1)〜(条件3)により、「単純処理フラグ」のメトリクスの値を決定する。具体的には、測定対象のクラスが(条件1)〜(条件3)のうちの少なくとも1つを満たす場合には、当該クラスを単純処理であるもの(実質的なロジックが無いもの)であると判定し、一方、測定対象のクラスが(条件1)〜(条件3)のいずれも満たさない場合には、当該クラスを単純処理ではないもの(実質的なロジックが有るもの)であると判定する。
(条件1)新しいインスタンスを作成しておらず(例えば、Java(登録商標)言語では、newキーワードによるインスタンスの作成を行っておらず)、且つ、制御構文(例えば、Java(登録商標)言語では、ifやswitchなど)が含まれていないという条件。
(条件2)新しいインスタンスを作成しておらず(例えば、Java(登録商標)言語では、newキーワードによるインスタンスの作成を行っておらず)、且つ、四則演算を行っていないという条件。
(条件3)制御構文(例えば、Java(登録商標)言語では、ifやswitchなど)が含まれておらず、且つ、四則演算が行われていないという条件。
(条件1)新しいインスタンスを作成しておらず(例えば、Java(登録商標)言語では、newキーワードによるインスタンスの作成を行っておらず)、且つ、制御構文(例えば、Java(登録商標)言語では、ifやswitchなど)が含まれていないという条件。
(条件2)新しいインスタンスを作成しておらず(例えば、Java(登録商標)言語では、newキーワードによるインスタンスの作成を行っておらず)、且つ、四則演算を行っていないという条件。
(条件3)制御構文(例えば、Java(登録商標)言語では、ifやswitchなど)が含まれておらず、且つ、四則演算が行われていないという条件。
{m8のメトリクス}
記号m8で示すメトリクスとして、「ステップ数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「ステップ数」のメトリクスは、ソフトウェア工学でLOCと呼ばれる、一般的なメトリクスである。本実施形態では、このメトリクスは、プログラムコードの数をカウントしたものを、クラス毎に集計した結果の値となる。なお、この値の計算方法としては、任意の方法が用いられてもよい。
記号m8で示すメトリクスとして、「ステップ数」というメトリクス名のメトリクスを用いる。このメトリクスの値は、0以上の値(0〜)となる。
「ステップ数」のメトリクスは、ソフトウェア工学でLOCと呼ばれる、一般的なメトリクスである。本実施形態では、このメトリクスは、プログラムコードの数をカウントしたものを、クラス毎に集計した結果の値となる。なお、この値の計算方法としては、任意の方法が用いられてもよい。
図2は、本実施形態による複雑度算出部31がm1〜m8のメトリクスをクラス毎に取得する処理の手順の一例を示す図である。
ここで、測定対象として1以上のクラスがあり、その1以上のクラス(通常は、複数のクラス)によりパッケージが構成されているとする。
ここで、測定対象として1以上のクラスがあり、その1以上のクラス(通常は、複数のクラス)によりパッケージが構成されているとする。
まず、複雑度算出部31は、計測対象となるクラスについて、そのパッケージの名称(パッケージ名)およびそのクラスの名称(クラス名)を取得する(ステップS1)。
次に、複雑度算出部31は、m7で示す「単純処理フラグ」のメトリクスの値を取得する(ステップS2)。
そして、複雑度算出部31は、取得した「単純処理フラグ」のメトリクスの値に基づいて、実質的なロジックの有無(単純処理ではないか、または、単純処理であるか)を判定する(ステップS3)。
次に、複雑度算出部31は、m7で示す「単純処理フラグ」のメトリクスの値を取得する(ステップS2)。
そして、複雑度算出部31は、取得した「単純処理フラグ」のメトリクスの値に基づいて、実質的なロジックの有無(単純処理ではないか、または、単純処理であるか)を判定する(ステップS3)。
ステップS3の処理の結果、複雑度算出部31は、単純処理ではないこと(偽:FALSE)を判定した場合には、複雑度の算出を行うために、m8およびm1〜m6のメトリクスの値を取得して(ステップS4)、ステップS5の処理へ移行する。
一方、ステップS3の処理の結果、複雑度算出部31は、単純処理であること(真:TRUE)を判定した場合には、複雑度の算出を行わないこととして、ステップS5の処理へ移行する。
一方、ステップS3の処理の結果、複雑度算出部31は、単純処理であること(真:TRUE)を判定した場合には、複雑度の算出を行わないこととして、ステップS5の処理へ移行する。
ステップS5の処理では、複雑度算出部31は、測定対象となるクラスの全てについて処理(ステップS1〜ステップS4の処理)が終了したか否かを判定する(ステップS5)。
ステップS5の処理の結果、複雑度算出部31は、測定対象となるクラスの全てについて処理が終了していないと判定した場合には、ステップS1の処理へ移行して、未だに処理していない測定対象のクラスについて、ステップS1〜ステップS4の処理を行う。
一方、ステップS5の処理の結果、複雑度算出部31は、測定対象となるクラスの全てについて処理が終了したと判定した場合には、クラス毎の複雑度の算出の処理へ移行する。
ステップS5の処理の結果、複雑度算出部31は、測定対象となるクラスの全てについて処理が終了していないと判定した場合には、ステップS1の処理へ移行して、未だに処理していない測定対象のクラスについて、ステップS1〜ステップS4の処理を行う。
一方、ステップS5の処理の結果、複雑度算出部31は、測定対象となるクラスの全てについて処理が終了したと判定した場合には、クラス毎の複雑度の算出の処理へ移行する。
図3は、本実施形態による測定メトリクスの取得終了時における複雑度の計算テーブルの一例を示す図である。
本実施形態では、複雑度算出装置21において、複雑度算出部31は、複雑度の算出処理を行う際に、このような複雑度の計算テーブルの情報を記憶部33に記憶し、処理の進みにしたがって、その情報を更新していく。
なお、図3などに示される複雑度の計算テーブルの情報は模式的に示したものであり、実際の情報の記憶のさせ方は、任意のものであってもよい。
本実施形態では、複雑度算出装置21において、複雑度算出部31は、複雑度の算出処理を行う際に、このような複雑度の計算テーブルの情報を記憶部33に記憶し、処理の進みにしたがって、その情報を更新していく。
なお、図3などに示される複雑度の計算テーブルの情報は模式的に示したものであり、実際の情報の記憶のさせ方は、任意のものであってもよい。
図3に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、m7のメトリクスにより実質的なロジックが有ること(偽:FALSE)が判定され、これに応じて、m1〜m6およびm8のメトリクスの値が取得されている。具体的には、図3の例では、m1=17、m2=108、m3=0.94、m4=66、m5=6、m6=3、m8=252となっている。
一方、図3に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、m7のメトリクスにより実質的なロジックが無いこと(真:TRUE)が判定され、これに応じて、m1〜m6のメトリクスの値は取得されない。なお、図3の例では、このクラスについて、m8のメトリクスの値を取得した場合を示しているが、このメトリクスの値は取得されなくてもよい。具体的には、図3の例では、m8=78となっている。
一方、図3に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、m7のメトリクスにより実質的なロジックが無いこと(真:TRUE)が判定され、これに応じて、m1〜m6のメトリクスの値は取得されない。なお、図3の例では、このクラスについて、m8のメトリクスの値を取得した場合を示しているが、このメトリクスの値は取得されなくてもよい。具体的には、図3の例では、m8=78となっている。
<2:メトリクスを導出する処理>
本実施形態では、クラスの複雑度には、外部複雑性、内部複雑性、利用機能の複雑性、という3つの側面の要素を持たせている。これらは、本発明において、独自に検討して採用するものである。複雑度算出部31は、外部複雑性、内部複雑性、利用機能の複雑性を算出する。
外部複雑性、内部複雑性の一部については、m1〜m7の中で対応する測定メトリクスを材料として計算して、統合した値を導き出す。なお、測定メトリクスから計算により導き出されるメトリクスを導出メトリクスと呼ぶ。
外部複雑性の導出には、m1〜m3のメトリクスを用いる。
内部複雑性の導出には、m4〜m5のメトリクスを用いる。
利用機能の複雑性には、m6のメトリクスをそのまま用いる。
共通的な複雑性には、m7のメトリクスをそのまま用いる。
本実施形態では、クラスの複雑度には、外部複雑性、内部複雑性、利用機能の複雑性、という3つの側面の要素を持たせている。これらは、本発明において、独自に検討して採用するものである。複雑度算出部31は、外部複雑性、内部複雑性、利用機能の複雑性を算出する。
外部複雑性、内部複雑性の一部については、m1〜m7の中で対応する測定メトリクスを材料として計算して、統合した値を導き出す。なお、測定メトリクスから計算により導き出されるメトリクスを導出メトリクスと呼ぶ。
外部複雑性の導出には、m1〜m3のメトリクスを用いる。
内部複雑性の導出には、m4〜m5のメトリクスを用いる。
利用機能の複雑性には、m6のメトリクスをそのまま用いる。
共通的な複雑性には、m7のメトリクスをそのまま用いる。
{1:外部複雑性}
計測対象となるクラスの外部複雑性は、変更作業や仕様理解を行おうとした場合に、他のクラスの変更や仕様が、計測対象となるクラスへ与える影響の可能性の大きさに着目したメトリクスである。
外部複雑性を構成する指標としては、次に示す指標A、指標Bという2つの指標がある。これら2つの指標A、Bを次の式で1つの値にまとめて、外部複雑性のメトリクスの値とする。
計測対象となるクラスの外部複雑性は、変更作業や仕様理解を行おうとした場合に、他のクラスの変更や仕様が、計測対象となるクラスへ与える影響の可能性の大きさに着目したメトリクスである。
外部複雑性を構成する指標としては、次に示す指標A、指標Bという2つの指標がある。これら2つの指標A、Bを次の式で1つの値にまとめて、外部複雑性のメトリクスの値とする。
外部複雑性のメトリクス(M1)=指標A+指標B−1 (−1〜1の値を取る)
ここで、例えば、外部複雑性のメトリクスの値M1=−1である場合には、外部のクラスの複雑性の影響が小さい。
一方、外部複雑性のメトリクスの値M1=1である場合には、外部のクラスの複雑度に強く影響を受ける。
一方、外部複雑性のメトリクスの値M1=1である場合には、外部のクラスの複雑度に強く影響を受ける。
指標Aは、外部のクラスからの変更の影響を示す。具体的には、指標Aは、計測対象となるクラスが参照している他のクラスの数の多さによる、他のクラスの変更により影響される数(=m1)と、計測対象となるクラスが他のクラスから呼び出し可能なメソッドを提供する数の多さによる、変更が他のクラスへ影響を与える数(=m2)のうち、他のクラスの変更に影響される度合いを示す。
測定対象となるクラスについて、「結合度」のメトリクスの値をm1とし、継承を含んで他のクラスから呼び出し可能なメソッドの数(「メソッド数」)のメトリクスの値をm2とすると、指標Aは次の式で表される。
測定対象となるクラスについて、「結合度」のメトリクスの値をm1とし、継承を含んで他のクラスから呼び出し可能なメソッドの数(「メソッド数」)のメトリクスの値をm2とすると、指標Aは次の式で表される。
指標A=m1/(m1+m2) (0〜1の値を取る)
指標Bは、測定対象となるクラスについて、外部のクラスからの被参照性を示し、一般的に知られているものである。
指標Bは、測定対象となるクラスの内で定義されたフィールド(情報)が当該クラスの内で定義されたメソッドから参照された、メソッド(機能)とフィールド(情報)が結び付いていない度合いを示す。これにより、フィールド(情報)が外部から参照される可能性が高いとみなすものである。
指標Bは、次の式で表される。
測定対象となるクラスについて、「凝集度の欠如」のメトリクスの値をm3とする。
指標Bは、測定対象となるクラスの内で定義されたフィールド(情報)が当該クラスの内で定義されたメソッドから参照された、メソッド(機能)とフィールド(情報)が結び付いていない度合いを示す。これにより、フィールド(情報)が外部から参照される可能性が高いとみなすものである。
指標Bは、次の式で表される。
測定対象となるクラスについて、「凝集度の欠如」のメトリクスの値をm3とする。
指標B=m3 (0〜1の値を取る)
図4は、本実施形態による外部複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
図4に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、記号M1で示す外部複雑性の値が取得されている。具体的には、図4の例では、M1=0.07599となっている。
一方、図4に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図4の例では、記号M1で示す外部複雑性の値は、算出されず、“0.00000”となっている。
図4に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、記号M1で示す外部複雑性の値が取得されている。具体的には、図4の例では、M1=0.07599となっている。
一方、図4に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図4の例では、記号M1で示す外部複雑性の値は、算出されず、“0.00000”となっている。
{2:内部複雑性}
内部複雑性は、構造面からみた複雑性を表し、次の式により、2つのメトリクス(内部複雑性のメトリクス1および内部複雑性のメトリクス2)で表現する。複雑度算出部31は、内部複雑性のメトリクス1および内部複雑性のメトリクス2を算出する。
測定対象となるクラスについて、「循環的複雑度」のメトリクスの値をm4とし、「最大ネスト合計数」のメトリクスの値をm5とする。
内部複雑性は、構造面からみた複雑性を表し、次の式により、2つのメトリクス(内部複雑性のメトリクス1および内部複雑性のメトリクス2)で表現する。複雑度算出部31は、内部複雑性のメトリクス1および内部複雑性のメトリクス2を算出する。
測定対象となるクラスについて、「循環的複雑度」のメトリクスの値をm4とし、「最大ネスト合計数」のメトリクスの値をm5とする。
内部複雑性のメトリクス1(M2)=m4
内部複雑性のメトリクス2(M3)=m5/m4
なお、m5はm4と相関が高いことから、事前処理として、この式の演算を行っている。
なお、m5はm4と相関が高いことから、事前処理として、この式の演算を行っている。
図5は、本実施形態による内部複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
図5に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、記号M2で示す内部複雑性のメトリクス1の値および記号M3で示す内部複雑性のメトリクス2の値が取得されている。具体的には、図5の例では、M2=66、M3=0.091となっている。
一方、図5に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図5の例では、記号M2で示す内部複雑性のメトリクス1の値および記号M3で示す内部複雑性のメトリクス2の値は、算出されず、いずれも“0”となっている。
図5に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、記号M2で示す内部複雑性のメトリクス1の値および記号M3で示す内部複雑性のメトリクス2の値が取得されている。具体的には、図5の例では、M2=66、M3=0.091となっている。
一方、図5に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図5の例では、記号M2で示す内部複雑性のメトリクス1の値および記号M3で示す内部複雑性のメトリクス2の値は、算出されず、いずれも“0”となっている。
{3:利用機能の複雑性}
複雑度算出部31は、次の式により、利用機能の複雑性のメトリクスを算出する。
測定対象となるクラスについて、「利用ライブラリ複雑度」のメトリクスの値をm6とする。
複雑度算出部31は、次の式により、利用機能の複雑性のメトリクスを算出する。
測定対象となるクラスについて、「利用ライブラリ複雑度」のメトリクスの値をm6とする。
利用機能の複雑性のメトリクス(M4)=m6
図6は、本実施形態による利用機能の複雑性の算出終了時における複雑度の計算テーブルの一例を示す図である。
図6に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、記号M4で示す利用機能の複雑性のメトリクスの値が取得されている。具体的には、M4=3となっている。
一方、図6に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図6の例では、記号M4で示す利用機能の複雑性のメトリクスの値は、算出されず、“0”となっている。
図6に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、記号M4で示す利用機能の複雑性のメトリクスの値が取得されている。具体的には、M4=3となっている。
一方、図6に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図6の例では、記号M4で示す利用機能の複雑性のメトリクスの値は、算出されず、“0”となっている。
<3:クラス毎に複雑度を算出する処理>
複雑度算出部31は、クラス毎の複雑度を算出する。
本実施形態では、外部複雑性のメトリクスの値(M1)、内部複雑性のメトリクスの値(M2、M3)、利用機能の複雑性のメトリクスの値(M4)を説明変数(材料)として重回帰分析で得た次の式(回帰式)により、クラス毎の複雑度を求める。
なお、目的変数は、有識者により行った被験者評価による実測値である(難しい=3、中程度=2、簡単=1)。M1〜M4のそれぞれの係数としては、例えば、他の値が用いられてもよい。
複雑度算出部31は、クラス毎の複雑度を算出する。
本実施形態では、外部複雑性のメトリクスの値(M1)、内部複雑性のメトリクスの値(M2、M3)、利用機能の複雑性のメトリクスの値(M4)を説明変数(材料)として重回帰分析で得た次の式(回帰式)により、クラス毎の複雑度を求める。
なお、目的変数は、有識者により行った被験者評価による実測値である(難しい=3、中程度=2、簡単=1)。M1〜M4のそれぞれの係数としては、例えば、他の値が用いられてもよい。
クラス毎の複雑度
=M1×0.1182+M2×0.0120
+M3×0.4389+M4×0.0113+0.9412
=M1×0.1182+M2×0.0120
+M3×0.4389+M4×0.0113+0.9412
ここで、M1〜M4は、「結合度」のメトリクスの値m1、「メソッド数」のメトリクスの値m2、「凝集度の欠如」のメトリクスの値m3、「循環的複雑度」のメトリクスの値m4、「最大ネスト合計数」のメトリクスの値m5、「利用ライブラリ複雑度」のメトリクスの値m6を用いて算出される。
このため、クラス毎の複雑度は、M1〜M4を用いて算出されるとも言え、また、m1〜m6を用いて算出されるとも言える。例えば、複雑度算出部31は、m1〜m6を用いて、M1〜M4を算出せずに、クラス毎の複雑度を算出することも可能である。
このため、クラス毎の複雑度は、M1〜M4を用いて算出されるとも言え、また、m1〜m6を用いて算出されるとも言える。例えば、複雑度算出部31は、m1〜m6を用いて、M1〜M4を算出せずに、クラス毎の複雑度を算出することも可能である。
図7は、本実施形態によるクラス毎の複雑度の算出終了時における複雑度の計算テーブルの一例を示す図である。
図7に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、クラス毎の複雑度(複雑度(クラス))の値が、M1〜M4を用いて算出されて、取得されている。具体的には、図7の例では、複雑度(クラス)の値=1.82となっている。
一方、図7に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図7の例では、クラス毎の複雑度の算出は行われないが、実質的なロジックが無いことから、複雑度算出部31により、簡単であることを示す値(この例では、1)がクラス毎の複雑度(複雑度(クラス))の値として設定される。
図7に示される複雑度の計算テーブルでは、“aa.bb.ccc”というパッケージ名のパッケージに含まれる“sample1”というクラス名のクラスについて、クラス毎の複雑度(複雑度(クラス))の値が、M1〜M4を用いて算出されて、取得されている。具体的には、図7の例では、複雑度(クラス)の値=1.82となっている。
一方、図7に示される複雑度の計算テーブルでは、前記と同じ“aa.bb.ccc”というパッケージ名のパッケージに含まれる他の“sample2”というクラス名のクラスについて、図7の例では、クラス毎の複雑度の算出は行われないが、実質的なロジックが無いことから、複雑度算出部31により、簡単であることを示す値(この例では、1)がクラス毎の複雑度(複雑度(クラス))の値として設定される。
<4:パッケージ毎に複雑度を算出する処理>
複雑度算出部31は、パッケージ毎の複雑度を算出する。
本実施形態では、プログラムの試験やレビューにおいてパッケージ単位での複雑度(パッケージ毎の複雑度)を比較する場合に、算術平均値は同じであっても、プログラムの試験では、複雑度の高いクラスが多く存在するパッケージの方により高いリスクが潜在すると考える。このため、パッケージを比較する場合に、パッケージに含まれるクラスの数が多いほど、パッケージの複雑度を表す値が高くなるように、また、同じクラスの数であればクラスの複雑度の合計が大きいほど、パッケージの複雑度を表す値が高くなるように、パッケージの複雑度を定義した。
複雑度算出部31は、パッケージ毎の複雑度を算出する。
本実施形態では、プログラムの試験やレビューにおいてパッケージ単位での複雑度(パッケージ毎の複雑度)を比較する場合に、算術平均値は同じであっても、プログラムの試験では、複雑度の高いクラスが多く存在するパッケージの方により高いリスクが潜在すると考える。このため、パッケージを比較する場合に、パッケージに含まれるクラスの数が多いほど、パッケージの複雑度を表す値が高くなるように、また、同じクラスの数であればクラスの複雑度の合計が大きいほど、パッケージの複雑度を表す値が高くなるように、パッケージの複雑度を定義した。
図8(A)および図8(B)を参照して具体例を示す。
図8(A)は、クラスの数が1であるパッケージ101の一例を示す図である。
このパッケージ101(“パッケージα”)には、複雑度が2である1個のクラス111が含まれている。このパッケージ101に関し、当該パッケージ101に含まれるクラス111の複雑度の算術平均値は2である。
図8(B)は、クラスの数が2であるパッケージ102の一例を示す図である。
このパッケージ102(“パッケージβ”)には、複雑度が2である2個のクラス121、122が含まれている。このパッケージ102に関し、当該パッケージ102に含まれるクラス121、122の複雑度の算術平均値は2である。
図8(A)は、クラスの数が1であるパッケージ101の一例を示す図である。
このパッケージ101(“パッケージα”)には、複雑度が2である1個のクラス111が含まれている。このパッケージ101に関し、当該パッケージ101に含まれるクラス111の複雑度の算術平均値は2である。
図8(B)は、クラスの数が2であるパッケージ102の一例を示す図である。
このパッケージ102(“パッケージβ”)には、複雑度が2である2個のクラス121、122が含まれている。このパッケージ102に関し、当該パッケージ102に含まれるクラス121、122の複雑度の算術平均値は2である。
このように、パッケージ101とパッケージ102とは複雑度の算術平均値は同じになるが、本実施形態では、パッケージ101の複雑度よりもパッケージ102の複雑度を高くする。
一例として、次のような式で各パッケージ101、102(パッケージα、β)の複雑度を算出すると、クラスの構成数の違いを表現することができる。
パッケージαの複雑度=(1/3)×2≒0.67
パッケージβの複雑度=(2/3)×2≒1.33
一例として、次のような式で各パッケージ101、102(パッケージα、β)の複雑度を算出すると、クラスの構成数の違いを表現することができる。
パッケージαの複雑度=(1/3)×2≒0.67
パッケージβの複雑度=(2/3)×2≒1.33
複雑度算出部31は、次の式により、パッケージ毎の複雑度を算出する。
この式では、パッケージPiの複雑度diを算出する。
任意のXについて、|X|をXの要素数とする。具体的には、|Pi|はパッケージPiに含まれるクラスの数を表す。PiのiやPkのkはパッケージの番号(例えば、1、2、3、・・・)を表し、|UPk|は全てのパッケージPkに含まれるクラスの数(総数)を表す。
cはクラスを表し、ccomplexityはクラスcの複雑度を表す。
パッケージPiに含まれるクラスcに関するΣccomplexityの部分は、パッケージPiに含まれる全てのクラスcについてクラス毎の複雑度ccomplexityを総和した結果を表す。
この式では、パッケージPiの複雑度diを算出する。
任意のXについて、|X|をXの要素数とする。具体的には、|Pi|はパッケージPiに含まれるクラスの数を表す。PiのiやPkのkはパッケージの番号(例えば、1、2、3、・・・)を表し、|UPk|は全てのパッケージPkに含まれるクラスの数(総数)を表す。
cはクラスを表し、ccomplexityはクラスcの複雑度を表す。
パッケージPiに含まれるクラスcに関するΣccomplexityの部分は、パッケージPiに含まれる全てのクラスcについてクラス毎の複雑度ccomplexityを総和した結果を表す。
この式により得られる値は、パッケージPi内にあるクラスcの複雑度ccomplexityの平均値(1クラス当たりの複雑度)に、システム全体におけるクラスの数(全てのパッケージPkに含まれるクラスの総数)に対する当該パッケージPiが保有するクラスの数の比率を乗じた結果の値である。この値は、例えば、パッケージ単位で相対的な複雑度の大小(相対的なリスクの大小)を把握したい場合に参照する数値として用いることができる。
ここで、この式で算出されるパッケージPiの複雑度diは、パッケージPiに含まれるクラスの数が相対的に極端に少ないような場合には、極めて小さい値となり識別しづらい(例えば、実例では1万倍の差が生じることもある)。また、この式で得られる値については、パッケージ単位で複雑度の大小を把握することが目的であるため、大小関係を保持しさえすればよい。
このため、複雑度算出部31は、パッケージPiの複雑度diについて、数値の比較をしやすいように、例えば、次の式により、スケールを変換してもよい。
ここで、この式では、パッケージPiの複雑度diについて、スケール変換後におけるパッケージPiの複雑度Diを算出する。Logは、自然対数を表す。
このため、複雑度算出部31は、パッケージPiの複雑度diについて、数値の比較をしやすいように、例えば、次の式により、スケールを変換してもよい。
ここで、この式では、パッケージPiの複雑度diについて、スケール変換後におけるパッケージPiの複雑度Diを算出する。Logは、自然対数を表す。
この式により得られる値は、パッケージPi内にあるクラスcの複雑度ccomplexityの平均値(1クラス当たりの複雑度)に、システム全体におけるクラスの数(全てのパッケージPkに含まれるクラスの総数)に対する当該パッケージPiが保有するクラスの数の比率を乗じ、この乗算結果を対数変換などした結果の値である。この値は、例えば、複雑度を比較するための指標値(例えば、最小と最大との差が10倍程度のもの)であり、パッケージ単位で相対的な複雑度の大小(相対的なリスクの大小)を把握したい場合に参照する数値として用いることができる。
図9は、本実施形態によるパッケージの複雑度の計算テーブルの一例を示す図である。
本実施形態では、複雑度算出装置21において、複雑度算出部31は、パッケージの複雑度の算出処理を行う際に、このようなパッケージの複雑度の計算テーブルの情報を記憶部33に記憶する。
なお、図9に示されるパッケージの複雑度の計算テーブルの情報は模式的に示したものであり、実際の情報の記憶のさせ方は、任意のものであってもよい。
本実施形態では、複雑度算出装置21において、複雑度算出部31は、パッケージの複雑度の算出処理を行う際に、このようなパッケージの複雑度の計算テーブルの情報を記憶部33に記憶する。
なお、図9に示されるパッケージの複雑度の計算テーブルの情報は模式的に示したものであり、実際の情報の記憶のさせ方は、任意のものであってもよい。
図9に示されるパッケージの複雑度の計算テーブルでは、パッケージの名称(パッケージ名)と、パッケージに含まれるクラスの数(クラス数)と、1クラス当たりの複雑度つまり平均値(複雑度/1クラス)と、全てのクラスの複雑度の合計(複雑度(クラス)合計)と、パッケージの複雑度di(パッケージ複雑度)と、スケール変換におけるbaseの値(スケール変換におけるbase)と、スケール変換後のパッケージの複雑度Di(スケール変換におけるパッケージ複雑度)が対応付けられる。また、図9に示されるパッケージの複雑度の計算テーブルでは、全てのパッケージのクラス数の合計値も記述される。
ここで、図9の例では、複雑度の算出対象となるプログラムのソースコード51に、4個のパッケージ(それぞれ、「パッケージA」、「パッケージB」、「パッケージC」、「パッケージD」という名称のパッケージ)が含まれるとしている。
具体的には、図9の例では、「パッケージA」という名称のパッケージについて、クラス数=20、複雑度/1クラス=1.0、複雑度(クラス)合計=20、パッケージ複雑度=0.083、スケール変換におけるbase=6.48、スケール変換におけるパッケージ複雑度=4.996となっている。また、「パッケージB」という名称のパッケージについて、クラス数=20、複雑度/1クラス=3.0、複雑度(クラス)合計=60、パッケージ複雑度=0.250、スケール変換におけるbase=6.48、スケール変換におけるパッケージ複雑度=6.094となっている。また、「パッケージC」という名称のパッケージについて、クラス数=100、複雑度/1クラス=1.0、複雑度(クラス)合計=100、パッケージ複雑度=0.417、スケール変換におけるbase=6.48、スケール変換におけるパッケージ複雑度=6.605となっている。また、「パッケージD」という名称のパッケージについて、クラス数=100、複雑度/1クラス=3.0、複雑度(クラス)合計=300、パッケージ複雑度=1.250、スケール変換におけるbase=6.48、スケール変換におけるパッケージ複雑度=7.704となっている。また、(全てのパッケージのクラス数の合計値)=240となっている。
[本実施形態における複雑度に関する表示の詳細]
次に、サーバ装置11に備えられた複雑度算出装置21の表示制御部32により、複雑度算出部31により算出された複雑度に関する情報の表示を行う処理の詳細について説明する。
サーバ装置11に備えられた複雑度算出装置21の表示制御部32は、複雑度算出部31により算出された複雑度に関する情報を表示する画面を作成して、その画面の情報をネットワークを介して端末装置12のブラウザ部41のブラウザ機能へ送信する。端末装置12のブラウザ部41のブラウザ機能は、この画面の情報を受信して、表示部43に表示出力する。
次に、サーバ装置11に備えられた複雑度算出装置21の表示制御部32により、複雑度算出部31により算出された複雑度に関する情報の表示を行う処理の詳細について説明する。
サーバ装置11に備えられた複雑度算出装置21の表示制御部32は、複雑度算出部31により算出された複雑度に関する情報を表示する画面を作成して、その画面の情報をネットワークを介して端末装置12のブラウザ部41のブラウザ機能へ送信する。端末装置12のブラウザ部41のブラウザ機能は、この画面の情報を受信して、表示部43に表示出力する。
図10は、本実施形態による複雑度に関する情報を表示する画面201の一例を示す図である。
なお、図10では、画面201の外側に、画面201の内側の模式的な記号などの見方を記述してある。
この画面201の例では、大別すると、アイコンのツリー形式の表示と、スライダーの表示が行われている。
なお、図10では、画面201の外側に、画面201の内側の模式的な記号などの見方を記述してある。
この画面201の例では、大別すると、アイコンのツリー形式の表示と、スライダーの表示が行われている。
<アイコンのツリー形式の表示>
画面201では、頂点をシステム全体として、パッケージおよびパッケージに配置されたクラスを階層的にアイコンで描画して、ツリー形式で表示する。
“AAA”や“BBB”や“aaa”などは、システムやパッケージやクラスの名称を表す。
{アイコンの形状}
二重の四角のアイコンは、システムを表す。
四角(通常の四角)のアイコンは、パッケージを表す。
丸のアイコンは、クラスを表す。
このように、本実施形態では、アイコンの形状により、対称の種類(本実施形態では、システム、パッケージ、クラス)を区別して表示する。なお、他のアイコンの形状が用いられてもよい。
画面201では、頂点をシステム全体として、パッケージおよびパッケージに配置されたクラスを階層的にアイコンで描画して、ツリー形式で表示する。
“AAA”や“BBB”や“aaa”などは、システムやパッケージやクラスの名称を表す。
{アイコンの形状}
二重の四角のアイコンは、システムを表す。
四角(通常の四角)のアイコンは、パッケージを表す。
丸のアイコンは、クラスを表す。
このように、本実施形態では、アイコンの形状により、対称の種類(本実施形態では、システム、パッケージ、クラス)を区別して表示する。なお、他のアイコンの形状が用いられてもよい。
{アイコンの大きさ}
画面201では、パッケージやクラスについて、コードの規模に応じて、アイコンの大きさを異ならせる。
本実施形態では、コードの規模が大きい方から小さい方への順で、アイコンの大きさを大・中・小の3段階に区別して描画する。具体的には、パッケージやクラスについて、アイコンの大きさを特定する方法としては、測定した「ステップ数」のメトリクスの値m8を用いて、その最大値から最小値までの範囲を3分割(例えば、等分割、または、所定の方法で分割)して、大きい方から3つの範囲をそれぞれ、コード規模が大の範囲、コード規模が中の範囲、コード規模が小の範囲と判定する。
画面201では、パッケージやクラスについて、コードの規模に応じて、アイコンの大きさを異ならせる。
本実施形態では、コードの規模が大きい方から小さい方への順で、アイコンの大きさを大・中・小の3段階に区別して描画する。具体的には、パッケージやクラスについて、アイコンの大きさを特定する方法としては、測定した「ステップ数」のメトリクスの値m8を用いて、その最大値から最小値までの範囲を3分割(例えば、等分割、または、所定の方法で分割)して、大きい方から3つの範囲をそれぞれ、コード規模が大の範囲、コード規模が中の範囲、コード規模が小の範囲と判定する。
ここで、クラスについては、各クラスのコード規模(本実施形態では、「ステップ数」のメトリクスの値m8)を用いる。そして、全てのクラスを対象として、「ステップ数」のメトリクスの値m8の最大値から最小値までの範囲を3分割する。
また、パッケージについては、一例として、各パッケージのコード規模(本実施形態では、各パッケージに含まれる全てのクラスについての「ステップ数」のメトリクスの値m8の総和)を用いることができる。この場合、前記したクラスのコード規模に関する処理と同様な処理を、クラスをパッケージに置き換えて、行うことが可能である。
また、パッケージについては、一例として、各パッケージのコード規模(本実施形態では、各パッケージに含まれる全てのクラスについての「ステップ数」のメトリクスの値m8の総和)を用いることができる。この場合、前記したクラスのコード規模に関する処理と同様な処理を、クラスをパッケージに置き換えて、行うことが可能である。
なお、パッケージやクラスについて、そのコードの規模に応じて、アイコンの大きさを3段階(または、他の複数の段階)で区別する他の方法として、「ステップ数」のメトリクスの値m8に関する平均値(μ)と標準偏差(σ)を使用する方法を用いることもできる。
具体的には、3段階の例では、パッケージまたはクラスの値が{平均値(μ)+標準偏差(σ)}以上の値である場合(正規分布においては、全体の15.9%に相当する場合)には、コード規模が大きい(大である)とする。また、パッケージまたはクラスの値が{平均値(μ)+標準偏差(σ)}未満であって{平均値(μ)−標準偏差(σ)}以上である場合(正規分布においては、全体の68.2%に相当する場合)には、コード規模が中であるとする。また、パッケージまたはクラスの値が{平均値(μ)−標準偏差(σ)}未満であって0以上である場合(正規分布においては、全体の15.9%に相当する場合)には、コード規模が小さい(小である)とする。
具体的には、3段階の例では、パッケージまたはクラスの値が{平均値(μ)+標準偏差(σ)}以上の値である場合(正規分布においては、全体の15.9%に相当する場合)には、コード規模が大きい(大である)とする。また、パッケージまたはクラスの値が{平均値(μ)+標準偏差(σ)}未満であって{平均値(μ)−標準偏差(σ)}以上である場合(正規分布においては、全体の68.2%に相当する場合)には、コード規模が中であるとする。また、パッケージまたはクラスの値が{平均値(μ)−標準偏差(σ)}未満であって0以上である場合(正規分布においては、全体の15.9%に相当する場合)には、コード規模が小さい(小である)とする。
{アイコンの色}
画面201では、パッケージやクラスについて、複雑度に応じて、アイコンに着色する色を異ならせる。なお、図10では、各色の代わりに、各色に対応する模様を用いて区別している。
具体的には、クラスについては、「単純処理フラグ」のメトリクスの値m7に基づいて、単純処理ではないもの(実質的なロジックが有るもの)だけについて、複雑度が高いクラスのアイコンを赤色で表し、複雑度が中程度のクラスのアイコンを黄色で表し、複雑度が低いクラスのアイコンを青色で表す。また、単純処理である(実質的なロジックが無い)クラスについては、灰色で表す。
また、単純処理ではない(実質的なロジックが有る)クラスについて、クラス毎の複雑度の値が第1の閾値(例えば、2.6)以上である場合には複雑度が高い(赤色)と判定し、クラス毎の複雑度の値が第1の閾値(例えば、2.6)未満であって第2の閾値(例えば、1.6)以上である場合には複雑度が中程度である(黄色)と判定し、クラス毎の複雑度の値が第2の閾値(例えば、1.6)未満である場合には複雑度が低い(青色)と判定する。
画面201では、パッケージやクラスについて、複雑度に応じて、アイコンに着色する色を異ならせる。なお、図10では、各色の代わりに、各色に対応する模様を用いて区別している。
具体的には、クラスについては、「単純処理フラグ」のメトリクスの値m7に基づいて、単純処理ではないもの(実質的なロジックが有るもの)だけについて、複雑度が高いクラスのアイコンを赤色で表し、複雑度が中程度のクラスのアイコンを黄色で表し、複雑度が低いクラスのアイコンを青色で表す。また、単純処理である(実質的なロジックが無い)クラスについては、灰色で表す。
また、単純処理ではない(実質的なロジックが有る)クラスについて、クラス毎の複雑度の値が第1の閾値(例えば、2.6)以上である場合には複雑度が高い(赤色)と判定し、クラス毎の複雑度の値が第1の閾値(例えば、2.6)未満であって第2の閾値(例えば、1.6)以上である場合には複雑度が中程度である(黄色)と判定し、クラス毎の複雑度の値が第2の閾値(例えば、1.6)未満である場合には複雑度が低い(青色)と判定する。
また、パッケージについては、本実施形態では、当該パッケージに含まれるクラスの複雑度の中で最大のもの(最大値)を用いて、アイコンの色を決定する。この理由は、リファクタリングの対象を把握しやくするするためである。
一例として、パッケージについては、当該パッケージに含まれるクラスの中で、1つでも赤色のクラスがあればパッケージのアイコンを赤色とし、赤色のクラスが無くて1つでも黄色のクラスがあればパッケージのアイコンを黄色とし、赤色のクラスと黄色のクラスが無くて1つでも青色のクラスがあればパッケージのアイコンを青色とし、また、全てのクラスが灰色であればパッケージのアイコンを灰色とする。
一例として、パッケージについては、当該パッケージに含まれるクラスの中で、1つでも赤色のクラスがあればパッケージのアイコンを赤色とし、赤色のクラスが無くて1つでも黄色のクラスがあればパッケージのアイコンを黄色とし、赤色のクラスと黄色のクラスが無くて1つでも青色のクラスがあればパッケージのアイコンを青色とし、また、全てのクラスが灰色であればパッケージのアイコンを灰色とする。
なお、他の構成例として、パッケージについては、パッケージ毎の複雑度の値を用いて、アイコンの色を決定してもよい。この場合、前記したクラスのアイコンの色分けに関する処理と同様な処理を、クラスをパッケージに置き換えて、行うことが可能である。
<スライダーの表示>
画面201では、閾値群301と、スライダー302を表示する。
閾値群301は、複雑度に応じたアイコンの色分けを行うために使用される閾値(例えば、第1の閾値、第2の閾値)により決定される複数(この例では、3つ)の範囲を示す。具体的には、0.1を最小単位として、第1の閾値以上(例えば、2.6以上)の範囲、第1の閾値未満(例えば、2.5以下)であって第2の閾値以上(例えば、1.6以上)の範囲、第2の閾値未満(例えば、1.5以下)の範囲を示す。
画面201では、閾値群301と、スライダー302を表示する。
閾値群301は、複雑度に応じたアイコンの色分けを行うために使用される閾値(例えば、第1の閾値、第2の閾値)により決定される複数(この例では、3つ)の範囲を示す。具体的には、0.1を最小単位として、第1の閾値以上(例えば、2.6以上)の範囲、第1の閾値未満(例えば、2.5以下)であって第2の閾値以上(例えば、1.6以上)の範囲、第2の閾値未満(例えば、1.5以下)の範囲を示す。
また、端末装置12では、利用者は、操作部42を操作することにより、スライダー302の中央値に対応する位置(図10では、“1.0”と示されている位置)を上下に移動させることが可能である。
スライダー302の位置と閾値群301の閾値とは1対1で対応しており、利用者の要求などにしたがって、閾値群301の閾値を調整することが可能である。
これにより、例えば、複雑度の尺度の中央付近(この例では、黄色に対応するもの)に位置するクラス群に対して、高(赤色)、中(黄色)、低(青色)を決定するための閾値(例えば、第1の閾値、第2の閾値)をスライダー302の移動によって変動させることなどができる。具体例として、複雑度が比較的高いクラスを詳しく区別するように可視化することや、複雑度が比較的低いクラスを詳しく区別するように可視化することなどが可能である。
スライダー302の位置と閾値群301の閾値とは1対1で対応しており、利用者の要求などにしたがって、閾値群301の閾値を調整することが可能である。
これにより、例えば、複雑度の尺度の中央付近(この例では、黄色に対応するもの)に位置するクラス群に対して、高(赤色)、中(黄色)、低(青色)を決定するための閾値(例えば、第1の閾値、第2の閾値)をスライダー302の移動によって変動させることなどができる。具体例として、複雑度が比較的高いクラスを詳しく区別するように可視化することや、複雑度が比較的低いクラスを詳しく区別するように可視化することなどが可能である。
[本実施形態のまとめ]
以上のように、本実施形態に係る複雑度算出システム1におけるサーバ装置11に備えられた複雑度算出装置21では、プログラムのソースコードを解析することにより、プログラムの複雑度を算出することができる。
本実施形態に係る複雑度算出装置21では、複雑度算出部31は、プログラムのソースコードに対して、メトリクス(品質尺度)を計測し、プログラムの最小単位であるクラス(モジュールの一例)毎に、および、複数のクラスで構成される機能単位であるパッケージ(モジュール群の一例)毎に、統合的な複雑度を定量化して算出し、表示制御部32は、算出された複雑度に関する情報を表示する。
以上のように、本実施形態に係る複雑度算出システム1におけるサーバ装置11に備えられた複雑度算出装置21では、プログラムのソースコードを解析することにより、プログラムの複雑度を算出することができる。
本実施形態に係る複雑度算出装置21では、複雑度算出部31は、プログラムのソースコードに対して、メトリクス(品質尺度)を計測し、プログラムの最小単位であるクラス(モジュールの一例)毎に、および、複数のクラスで構成される機能単位であるパッケージ(モジュール群の一例)毎に、統合的な複雑度を定量化して算出し、表示制御部32は、算出された複雑度に関する情報を表示する。
具体例として、本実施形態に係る複雑度算出装置21では、複雑度算出部31は、プログラムのソースコードに対して、あらかじめ定められた複数のメトリクスの値m1〜m8を測定(検出)し、これに基づいて、あらかじめ定められた3つの側面(外部複雑性、内部複雑性、利用機能の複雑性)に関するメトリクス(品質尺度)の値を測定(検出)する。また、複雑度算出部31は、プログラムの最小単位であるクラス毎に、測定したメトリクスを用いて定量化した統合的な複雑度(クラス毎の複雑度)を計測(検出)する。また、複雑度算出部31は、複数のクラスから構成されるパッケージ毎に、当該パッケージを構成する個々のクラスの複雑度に基づいて、複雑度(パッケージ毎の複雑度)を測定(検出)する。
このように、複雑度算出部31は、ソースコードを解析対象として、3つの側面(外部複雑性、内部複雑性、利用機能の複雑性)から既存および独自のメトリクスを測定し、それらを計算材料として、クラスやパッケージの複雑度の度合いを統合された代表値としてまとめる。
このように、複雑度算出部31は、ソースコードを解析対象として、3つの側面(外部複雑性、内部複雑性、利用機能の複雑性)から既存および独自のメトリクスを測定し、それらを計算材料として、クラスやパッケージの複雑度の度合いを統合された代表値としてまとめる。
また、具体例として、表示制御部32は、クラスおよびパッケージを、形(例えば、対象の種類に対応する)や大きさ(例えば、コード規模に対応する)や色(例えば、複雑度の度合いに対応する)に意味を持たせたアイコンとして扱い、アイコンを用いてプログラムの構造を、パッケージの階層に合わせて展開可能なツリー形状で視覚的に表示し、求められたクラスの複雑度やパッケージの複雑度を把握可能な形式で表示する。また、表示制御部32は、利用者により行われる操作などにしたがって、表示の際に使用する閾値(例えば、色分けのための複雑度に関する閾値)などを変更する。
以上のように、本実施形態に係る複雑度算出システム1におけるサーバ装置11に備えられた複雑度算出装置21によると、次のような効果を得ることができる。
本実施形態に係る複雑度算出装置21によると、例えば、ソースコード(ソースコード群でもよい)の処理の詳細や、従来技術で表示に用いられてきたメトリクス群(例えば、凝集度の欠如や、循環的複雑度など)について、さらに複雑性を解釈や判定することがなくても、プロジェクトマネージャや管理者により、直感的にリスク(複雑度)の存在箇所を把握することができる。
本実施形態に係る複雑度算出装置21によると、例えば、ソースコード(ソースコード群でもよい)の処理の詳細や、従来技術で表示に用いられてきたメトリクス群(例えば、凝集度の欠如や、循環的複雑度など)について、さらに複雑性を解釈や判定することがなくても、プロジェクトマネージャや管理者により、直感的にリスク(複雑度)の存在箇所を把握することができる。
このような本実施形態に係る技術を利用して活用することが可能なシーン(場面)の例としては、次のような(利用シーン1)〜(利用シーン5)が考えられる。なお、勿論、本実施形態に係る技術は、他のシーンで利用されて活用されてもよい。
(利用シーン1)ある会社(A社)のパッケージと他の会社(B社)のパッケージについて、複雑性(複雑度)を比較する品質の比較を行うシーン。
(利用シーン2)プログラムについて、リスクが高い箇所から集中的な試験を行うことにより早期段階でのバグ摘出を行うシーン。
(利用シーン3)プログラムについて、クラス(モジュールの一例)をリファクタリングすることの必要性を判断するシーン。
(利用シーン4)プログラムについて、限られた期間内で試験の優先順付けを行うシーン。
(利用シーン5)自社以外で開発したシステムの保守を引き受ける際にリスク(複雑度)を把握するシーン。
(利用シーン1)ある会社(A社)のパッケージと他の会社(B社)のパッケージについて、複雑性(複雑度)を比較する品質の比較を行うシーン。
(利用シーン2)プログラムについて、リスクが高い箇所から集中的な試験を行うことにより早期段階でのバグ摘出を行うシーン。
(利用シーン3)プログラムについて、クラス(モジュールの一例)をリファクタリングすることの必要性を判断するシーン。
(利用シーン4)プログラムについて、限られた期間内で試験の優先順付けを行うシーン。
(利用シーン5)自社以外で開発したシステムの保守を引き受ける際にリスク(複雑度)を把握するシーン。
また、本実施形態に係る複雑度算出装置21によると、例えば、パッケージ毎の複雑度として、システム全体におけるクラスの数に対する該当するパッケージに含まれるクラスの数の比を考慮した代表値を求めているため、システム全体におけるパッケージという意味合いの単位で、リスク(複雑度)の高低を比較しやすい。
また、本実施形態に係る複雑度算出装置21によると、例えば、複雑度が高いクラス(モジュールの一例)が位置するパッケージがどこにあるのかを特定しやすくなる。具体例として、図10に示されるような画面201において、赤色(複雑度が高いもの)のパッケージのアイコンを階層的に辿る操作により、複雑度が高いクラスが位置するパッケージを特定することができる。
また、本実施形態に係る複雑度算出装置21によると、例えば、複雑度に基づく色分け表示で使用される閾値を、利用者が変動させることができるようにしてあり、これにより、値の中央付近に集中するクラス群を視覚的に分解することなどによって、利用者の直感的な理解を支援することができる。具体例として、図10に示されるような画面201において、スライダー302の移動により、閾値群301の閾値を変化させることができる。
<本実施形態に関する構成例>
一構成例として、複雑度算出装置21では、複雑度算出部31が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出する。
ここで、前記した複数の複雑度に関するメトリクスの値、前記した2つ以上の複雑度に関するメトリクスの値、前記したあらかじめ定められた複雑度に関する1つの値としては、それぞれ、様々なものが用いられてもよい。
一構成例として、複雑度算出装置21では、複雑度算出部31が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出する。
ここで、前記した複数の複雑度に関するメトリクスの値、前記した2つ以上の複雑度に関するメトリクスの値、前記したあらかじめ定められた複雑度に関する1つの値としては、それぞれ、様々なものが用いられてもよい。
一構成例として、複雑度算出装置21では、複雑度算出部31が、前記複数の複雑度に関するメトリクスの値として「結合度」に関するメトリクスの値m1と「メソッド数」に関するメトリクスの値m2と「凝集度の欠如」に関するメトリクスの値m3を測定して、これらの値m1〜m3を用いてあらかじめ定められた外部複雑性(M1)を算出すること、または、前記複数の複雑度に関するメトリクスの値として「循環的複雑度」に関するメトリクスの値m4と「最大ネスト合計数」に関するメトリクスの値m5を測定して、これらの値m4〜m5を用いてあらかじめ定められた内部複雑性(M2、M3)を算出すること、または、前記複数の複雑度に関するメトリクスの値として「結合度」に関するメトリクスの値m1と「メソッド数」に関するメトリクスの値m2と「凝集度の欠如」に関するメトリクスの値m3と「循環的複雑度」に関するメトリクスの値m4と「最大ネスト合計数」に関するメトリクスの値m5と「利用ライブラリ複雑度」に関するメトリクスの値m6を測定して、これらの値m1〜m6(または、例えば、M1〜M4でもよい)を用いてあらかじめ定められた統合的な複雑度(例えば、モジュール毎の複雑度、または、モジュール群毎の複雑度)を算出すること、のうちの少なくとも1つ(本実施形態では、全て)を実行する。
つまり、複雑度算出部31が、外部複雑性(M1)の算出と、内部複雑性(M2、M3)の算出と、統合的な複雑度の算出と、のうちの少なくとも1つを実行する。
ここで、統合的な複雑度は、例えば、外部複雑性と内部複雑性のうちの一方または両方を算出した上で算出されてもよく、または、外部複雑性や内部複雑性を算出せずに、直接的に算出されてもよい。
つまり、複雑度算出部31が、外部複雑性(M1)の算出と、内部複雑性(M2、M3)の算出と、統合的な複雑度の算出と、のうちの少なくとも1つを実行する。
ここで、統合的な複雑度は、例えば、外部複雑性と内部複雑性のうちの一方または両方を算出した上で算出されてもよく、または、外部複雑性や内部複雑性を算出せずに、直接的に算出されてもよい。
一構成例として、複雑度算出装置21では、複雑度算出部31が、前記プログラムのソースコードのモジュール群(本実施形態では、一例として、パッケージ)に含まれるモジュール(本実施形態では、一例として、クラス)毎の複雑度に関する値に基づいて、あらかじめ定められた当該モジュール群毎の複雑度に関する値を算出する。
具体的な一例として、複雑度算出部31は、プログラムのソースコードに関して、システムが有する複数のパッケージのうちのそれぞれのパッケージについて、パッケージに含まれるそれぞれのクラスについてクラス毎の複雑度の値を算出し、前記複数のパッケージについてのその算出結果に基づいて、それぞれのパッケージ毎の複雑度の値を算出する。
また、モジュール、モジュール群としては、それぞれ、例えばプログラムに応じて、様々なものが用いられてもよい。
具体的な一例として、複雑度算出部31は、プログラムのソースコードに関して、システムが有する複数のパッケージのうちのそれぞれのパッケージについて、パッケージに含まれるそれぞれのクラスについてクラス毎の複雑度の値を算出し、前記複数のパッケージについてのその算出結果に基づいて、それぞれのパッケージ毎の複雑度の値を算出する。
また、モジュール、モジュール群としては、それぞれ、例えばプログラムに応じて、様々なものが用いられてもよい。
一構成例として、複雑度算出装置21では、表示制御部32が、モジュールを表す記号(例えば、アイコン)とモジュール群を表す記号(例えば、アイコン)のうちの一方または両方について、記号の大きさを規模(例えば、コードの規模)に応じて異ならせて表示するように制御すること、または、記号の色を複雑度に関する情報(例えば、複雑度に関する値、または、複雑度に関する判定の結果、など)に応じて異ならせて表示するように制御すること、のうちの一方または両方を行う。
ここで、参照する情報(例えば、値)に応じて記号の大きさや色を異ならせる方法としては、例えば、1つ以上の閾値を設定して、当該参照する情報と閾値との大小関係に応じて記号の大きさや色を決定するような方法を用いることができる。
ここで、参照する情報(例えば、値)に応じて記号の大きさや色を異ならせる方法としては、例えば、1つ以上の閾値を設定して、当該参照する情報と閾値との大小関係に応じて記号の大きさや色を決定するような方法を用いることができる。
一構成例として、複雑度算出装置21では、表示制御部32が、モジュールを表す記号(例えば、アイコン)とモジュール群を表す記号(例えば、アイコン)のうちの一方または両方について、あらかじめ定められた実質的なロジックが有るものと無いもの(例えば、「単純処理フラグ」のメトリクスの値m7に基づいて判定される結果)とで、表示の形態(例えば、表示に使用する色)を異ならせるように制御する。
[全体のまとめ]
以上、この発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
以上、この発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
なお、以上に説明した任意の装置(例えば、サーバ装置11やその複雑度算出装置21、または、端末装置12)における任意の構成部の機能を実現するためのプログラムを、コンピュータ読み取り可能な記録媒体に記録し、そのプログラムをコンピュータシステムに読み込ませて実行するようにしてもよい。なお、ここで言う「コンピュータシステム」とは、OS(Operating System)や周辺機器等のハードウェアを含むものとする。また、「コンピュータシステム」は、インターネットやWAN(Wide Area Network)、LAN(Local Area Network)、専用回線等の通信回線を含むネットワークを介して接続された複数のコンピュータ装置を含んでもよい。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM(Read Only Memory)、CD(Compact Disk)−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことを言う。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ(RAM:Random Access Memory)のように、一定時間プログラムを保持しているものも含むものとする。
また、上記のプログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことを言う。
また、上記のプログラムは、前述した機能の一部を実現するためのものであってもよい。さらに、上記のプログラムは、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル(差分プログラム)であってもよい。
また、上記のプログラムは、前述した機能の一部を実現するためのものであってもよい。さらに、上記のプログラムは、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル(差分プログラム)であってもよい。
また、前述した機能の一部または全部を、LSI(Large Scale Integration)等の集積回路として実現してもよい。前述した各機能は、個別にプロセッサ化されてもよいし、あるいは、一部または全部を集積してプロセッサ化されてもよい。また、集積回路化の手法としては、LSIに限られず、専用回路または汎用プロセッサで実現されてもよい。また、半導体技術の進歩によりLSIに代替する集積回路化の技術が出現した場合には、当該技術による集積回路が用いられてもよい。
1…複雑度算出システム、11…サーバ装置、12…端末装置、21…複雑度算出装置、31…複雑度算出部、32…表示制御部、33…記憶部、41…ブラウザ部、42…操作部、43…表示部、44…出力部、45…記憶部、51…ソースコード、101、102…パッケージ、111、121、122…クラス、301…閾値群、302…スライダー
Claims (7)
- プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出する複雑度算出部を備える、
ことを特徴とする複雑度算出装置。 - 前記複雑度算出部は、
前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた外部複雑性を算出すること、
または、
前記複数の複雑度に関するメトリクスの値として循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた内部複雑性を算出すること、
または、
前記複数の複雑度に関するメトリクスの値として結合度に関するメトリクスの値とメソッド数に関するメトリクスの値と凝集度の欠如に関するメトリクスの値と循環的複雑度に関するメトリクスの値と最大ネスト合計数に関するメトリクスの値と利用ライブラリ複雑度に関するメトリクスの値を測定して、これらの値を用いてあらかじめ定められた統合的な複雑度を算出すること、
のうちの少なくとも1つを実行する、
ことを特徴とする請求項1に記載の複雑度算出装置。 - 前記複雑度算出部は、前記プログラムのソースコードのモジュール群に含まれるモジュール毎の複雑度に関する値に基づいて、あらかじめ定められた当該モジュール群毎の複雑度に関する値を算出する、
ことを特徴とする請求項1または請求項2に記載の複雑度算出装置。 - モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、記号の大きさを規模に応じて異ならせて表示するように制御すること、または、記号の色を複雑度に関する情報に応じて異ならせて表示するように制御すること、のうちの一方または両方を行う表示制御部を備える、
ことを特徴とする請求項1から請求項3までのいずれか1項に記載の複雑度算出装置。 - 前記表示制御部は、モジュールを表す記号とモジュール群を表す記号のうちの一方または両方について、あらかじめ定められた実質的なロジックが有るものと無いものとで、表示の形態を異ならせるように制御する、
ことを特徴とする請求項4に記載の複雑度算出装置。 - 複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出するステップを有する、
ことを特徴とする複雑度算出方法。 - 複雑度算出部が、プログラムのソースコードについて複数の複雑度に関するメトリクスの値を測定し、測定した2つ以上の複雑度に関するメトリクスの値を用いてあらかじめ定められた複雑度に関する1つの値を算出する手順を、
コンピュータに実行させるための複雑度算出プログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012171297A JP2014032466A (ja) | 2012-08-01 | 2012-08-01 | 複雑度算出装置、複雑度算出方法および複雑度算出プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012171297A JP2014032466A (ja) | 2012-08-01 | 2012-08-01 | 複雑度算出装置、複雑度算出方法および複雑度算出プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2014032466A true JP2014032466A (ja) | 2014-02-20 |
Family
ID=50282260
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012171297A Pending JP2014032466A (ja) | 2012-08-01 | 2012-08-01 | 複雑度算出装置、複雑度算出方法および複雑度算出プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2014032466A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11379224B2 (en) | 2017-02-16 | 2022-07-05 | Mitsubishi Electric Corporation | Scale calculation apparatus and computer readable medium |
US11853744B2 (en) | 2019-02-05 | 2023-12-26 | Nippon Telegraph And Telephone Corporation | Analysis device, analysis method, and analysis program |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0327440A (ja) * | 1989-06-23 | 1991-02-05 | Toshiba Corp | ソフトウェア品質評価システム |
JPH08249172A (ja) * | 1995-03-10 | 1996-09-27 | Hitachi Ltd | プログラム分析ツールの分析結果表示法 |
US6356285B1 (en) * | 1997-12-17 | 2002-03-12 | Lucent Technologies, Inc | System for visually representing modification information about an characteristic-dependent information processing system |
JP2007219643A (ja) * | 2006-02-14 | 2007-08-30 | Ricoh Co Ltd | Xsltコード解析プログラム、xsltコード解析方法、xsltコード解析装置及び記録媒体 |
US20100125824A1 (en) * | 2007-07-19 | 2010-05-20 | Fujitsu Limited | Method and apparatus for supporting application enhancement |
-
2012
- 2012-08-01 JP JP2012171297A patent/JP2014032466A/ja active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0327440A (ja) * | 1989-06-23 | 1991-02-05 | Toshiba Corp | ソフトウェア品質評価システム |
JPH08249172A (ja) * | 1995-03-10 | 1996-09-27 | Hitachi Ltd | プログラム分析ツールの分析結果表示法 |
US6356285B1 (en) * | 1997-12-17 | 2002-03-12 | Lucent Technologies, Inc | System for visually representing modification information about an characteristic-dependent information processing system |
JP2007219643A (ja) * | 2006-02-14 | 2007-08-30 | Ricoh Co Ltd | Xsltコード解析プログラム、xsltコード解析方法、xsltコード解析装置及び記録媒体 |
US20100125824A1 (en) * | 2007-07-19 | 2010-05-20 | Fujitsu Limited | Method and apparatus for supporting application enhancement |
Non-Patent Citations (4)
Title |
---|
JPN6015035382; Stephen H. Kan: ソフトウェア品質工学の尺度とモデル 初版 Metrics and Models in Software Quality Engineering (2nd Ed 第1版, 20041115, pp.249-289, (株)構造計画研究所 * |
JPN6015035384; 梁海述ほか: 'モジュール間依存度を考慮したプログラムの複雑度' 電子情報通信学会論文誌 J73-D-I, 199011, P882-890 * |
JPN6015035385; 李新肖: 'インタラクティブな情報視覚化のための高速レイアウト配置手法' 東芝レビュー Vol65 No.5, 2010, P66-P67 * |
JPN6015035387; 亀井靖高ほか: '相関ルール分析とロジスティック回帰分析を組み合わせたfault-proneモジュール判別方法' 情報処理学会論文誌 , 200812, P3954-P3966 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11379224B2 (en) | 2017-02-16 | 2022-07-05 | Mitsubishi Electric Corporation | Scale calculation apparatus and computer readable medium |
US11853744B2 (en) | 2019-02-05 | 2023-12-26 | Nippon Telegraph And Telephone Corporation | Analysis device, analysis method, and analysis program |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2909750B1 (en) | Specifying and applying rules to data | |
CN108984388B (zh) | 一种生成自动化测试用例的方法及终端设备 | |
US8612372B2 (en) | Detection rule-generating facility | |
US10318595B2 (en) | Analytics based on pipes programming model | |
JP2015043198A (ja) | 解析システム、解析方法および解析プログラム | |
US10642818B2 (en) | Causal analysis device, causal analysis method, and non-transitory computer readable storage medium | |
GB2509090A (en) | An extract-transform-load (ETL) processor controller indicates a degree of preferredness of a proposed placement of data | |
CN115576828A (zh) | 一种测试用例生成方法、装置、设备及存储介质 | |
US9335979B1 (en) | Data type visualization | |
JP2014032466A (ja) | 複雑度算出装置、複雑度算出方法および複雑度算出プログラム | |
US20130275939A1 (en) | Efficient file system object-based deduplication | |
CN115543324B (zh) | 交互界面的生成方法、装置、设备及介质 | |
CN111427874B (zh) | 医疗数据生产的质控方法、装置以及电子设备 | |
CN115495362A (zh) | 生成测试代码的方法、装置、存储介质及计算机设备 | |
JP2016024477A (ja) | ソフトウェア欠陥予測装置、ソフトウェア欠陥予測方法、およびソフトウェア欠陥予測プログラム | |
CN112214389A (zh) | 一种众测方法、装置、终端及存储介质 | |
EP2945067B1 (en) | Power system monitoring and control system having thread-dependent calculation monitoring function | |
JP2017068296A (ja) | 監視装置、監視方法および監視プログラム | |
US10515330B2 (en) | Real time visibility of process lifecycle | |
CN116467139B (zh) | 系统告警重复率检测方法、电子设备及可读存储介质 | |
US11734863B2 (en) | Computing and displaying asymptotes and removable discontinuities | |
CN117608665A (zh) | 流水线数据的可视化方法、装置、电子设备及存储介质 | |
JP2012103884A (ja) | 設計書検査装置、対応表生成装置、設計書検査システム、設計書検査プログラム、対応表生成プログラム、設計書検査装置の設計書検査方法および対応表生成装置の対応表生成方法 | |
CN116245277A (zh) | 基于多维分析的优先级确定方法和装置 | |
US20220121441A1 (en) | Analysis device, analysis method, and analysis program |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20150203 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20150827 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20150901 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20160112 |