JP5869465B2 - ソフトウェア複雑度測定装置及び方法並びにプログラム - Google Patents

ソフトウェア複雑度測定装置及び方法並びにプログラム Download PDF

Info

Publication number
JP5869465B2
JP5869465B2 JP2012266686A JP2012266686A JP5869465B2 JP 5869465 B2 JP5869465 B2 JP 5869465B2 JP 2012266686 A JP2012266686 A JP 2012266686A JP 2012266686 A JP2012266686 A JP 2012266686A JP 5869465 B2 JP5869465 B2 JP 5869465B2
Authority
JP
Japan
Prior art keywords
complexity
index value
box
dependency
module
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.)
Expired - Fee Related
Application number
JP2012266686A
Other languages
English (en)
Other versions
JP2014112325A (ja
Inventor
久雄 伊予田
久雄 伊予田
孝博 橋本
孝博 橋本
正人 酒井
正人 酒井
徹也 山本
徹也 山本
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Toyota Motor Corp
Original Assignee
Toshiba Corp
Toyota Motor Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Toshiba Corp, Toyota Motor Corp filed Critical Toshiba Corp
Priority to JP2012266686A priority Critical patent/JP5869465B2/ja
Publication of JP2014112325A publication Critical patent/JP2014112325A/ja
Application granted granted Critical
Publication of JP5869465B2 publication Critical patent/JP5869465B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Description

本発明は、ソフトウェア複雑度測定装置及びソフトウェア複雑度測定方法並びにプログラムに関する。
近年のソフトウェアの巨大化、複雑化は著しく、ソフトウェアに含まれるモジュール数も膨大となり、またモジュール間の依存関係も著しく複雑化してきている。しかし、モジュール間の依存関係がスパゲティ状に複雑になるほど、ソフトウェアの保守性は低くなる。
そこで、モジュール間の依存関係の複雑さを表す指標によって、保守性に問題のあるモジュール構造を定量的に判断し、改善につなげることが試みられてきた。モジュール間の依存関係の複雑さを表す従来の一般的な指標として、以下の指標が提案されている。Inter-Module Complexity(Henry-Kafura)は、モジュールのfan-in数とfan-out数に着目し、(fan-in * fan-out)^2 をモジュールの複雑さとして評価する指標である。
特開2001−325100号公報 特開2000−215045号公報 特開2008−083912号公報
ところで、保守性の良いソフトウェア構造の一指標としては、ソフトウェアの階層の分割態様のバランスが良いことが挙げられる。例えば、コンポーネント間を単純化すると、その中のモジュール間が複雑になりすぎ、バランスが良くなくなるという問題が生じうる。この点、既存の指標は、ソフトウェアの階層の分割態様のバランスを評価するのには不適である。
そこで、本発明は、ソフトウェアの階層の分割バランスを定量的に評価することができるソフトウェア複雑度測定装置等の提供を目的とする。
上記目的を達成するため、本発明の一局面によれば、階層構造を持つソフトウェア内の複数のコンポーネント間の依存関係の複雑度を表す第1指標値と、前記コンポーネント内の複数のモジュール間の依存関係の複雑度を表す第2指標値との第1比、前記第2指標値と、前記モジュール内の複数の関数間の依存関係の複雑度を表す第3指標値との第2比、前記第3指標値と、前記関数内における経路複雑度を表す第4指標値との第3比のうちの少なくともいずれか1つの比を算出する、ソフトウェア複雑度測定装置が提供される。
本発明によれば、ソフトウェアの階層の分割バランスを定量的に評価することができるソフトウェア複雑度測定装置等が得られる。
ソフトウェア複雑度測定装置1の一例を示す構成図である。 測定対象の1つのソフトウェアの概略構造の一例を示す図である。 モジュール間における依存関係の一例を示す図である。 図4(A)は、図3のモジュールXのソースコードの一部を示す図であり、図4(B)は、図3のモジュールYのソースコードの一部を示す図である。 依存関係の他の一例を示す図である。 図6(A)は、図5のモジュールXのソースコードの一部を示す図であり、図6(B)は、図5のモジュールYのソースコードの一部を示す図である。 依存関係の更なる他の一例を示す図である。 図8(A)は、図7のモジュールXのソースコードの一部を示す図であり、図8(B)は、図7のモジュールYのソースコードの一部を示す図である。 ソフトウェア複雑度測定装置1の処理装置10により実行される処理の一例を示すフローチャートである。 分割バランス指標値の意義の説明図である。 多対多関係の一例の説明図である。 多対多関係の他の例の説明図である。 逆方向経路及び順方向経路の決定方法(その1)の説明図である。 逆方向経路及び順方向経路の決定方法(その2)の説明図である。 DSMを用いた逆方向経路率の算出方法の流れの一例を示す図である。
以下、図面を参照して、本発明を実施するための最良の形態の説明を行う。
図1は、ソフトウェア複雑度測定装置1の一例を示す構成図である。ソフトウェア複雑度測定装置1は、処理装置10を含む。処理装置10は、典型的には、コンピューターから構成される。コンピューターは、任意のコンピューターであり、汎用性のあるコンピューターであってもよい。
処理装置10は、CPU12と、記憶部14とを含んでよい。記憶部14は、ROM(Read Only Memory)やRAM(Random Access Memory)、HDD(Hard Disk Drive)等を含んでよい。以下で説明する処理装置10の機能は、例えばCPU12が記憶部14内のプログラムを読み出して実行することにより実現されてよい。尚、記憶部14内には、外部との有線又は無線通信を介してプログラムがダウンロードされ若しくは記録媒体を介してプログラムが格納されてもよい。尚、プログラムは、以下で説明する処理(例えば図9に示す処理)を実現するためのプログラムを含む。尚、記録媒体は、CD−ROM、フレキシブルディスク、光磁気ディスク等の様に情報を光学的,電気的或いは磁気的に記録する記録媒体、ROM、フラッシュメモリ等の様に情報を電気的に記録する半導体メモリ等を含んでよい。
処理装置10には、表示装置16が接続されてもよい。表示装置16は、コンピューターのディスプレイに相当してよい。表示装置16は、液晶ディスプレイであってもよいし、他のタイプのディスプレイであってもよい。表示装置16には、処理装置10によるソフトウェアの複雑度の測定結果(例えば、後述の分割バランス指標値等)が表示されてよい。尚、処理装置10と表示装置16との間の接続は、有線又は無線若しくはそれらの組合せで実現されてよく、また、表示装置16は、処理装置10に対して遠隔位置に存在してもよい。例えば、処理装置10は、ホストコンピューターであり、表示装置16は、クライアントコンピューターのディスプレイであってもよい。
ソフトウェア複雑度測定装置1は、ソフトウェアの複雑度を測定する。測定対象のソフトウェアは任意である。例えば、測定対象のソフトウェアは、設計段階(開発段階)のソフトウェアであってもよいし、開発済み(実装済み)のソフトウェアであってもよい。
図2は、測定対象の1つのソフトウェアの概略構造の一例を示す図である。1つのソフトウェアは、図2に示すように、複数のコンポーネントを含んでよい。1つのコンポーネントは、複数のモジュールを含んでよい。1つのモジュールは、複数の関数を含んでよい。このようにソフトウェアの構造は、関数(及び共有変数)、モジュール、コンポーネントなどの構成単位と、構成単位間の依存関係とで定義することができる。尚、構成単位を"箱"、依存関係を方向のついた線とみなすと、ソフトウェア構造は箱と線との組合せで表現することができる。一般的には、コンポーネント内部には複数のモジュールが含まれ、モジュール内部には複数の関数が含まれる。従って、ソフトウェア全体は、大きな粒度(例えばコンポーネント)の箱の中に、より小さい粒度(例えばモジュール)の箱と線が含まれる階層的な構造として表現することができる。尚、以下では、一例として、ソフトウェア全体がコンポーネントに分割され、コンポーネントがモジュールに分割され、モジュールが関数に分割された3階層のソフトウェア構造を前提として説明を続ける。
尚、図2に示す例では、1つのソフトウェアは、3つのコンポーネントを含み、1つのコンポーネントは、3つのモジュールを含み、1つのモジュールは、3つの関数を含んでいるが、これらの数は任意であり、多様となりうる。
尚、モジュールとは、関数や変数といったソフトウェアの構成要素のうち、関係(例えば依存関係)がある構成要素をまとめたものをいう。なお、関係がある構成要素をまとめたものであれば、どのようなものでも「モジュール」に相当し、例えばファイル、クラス、オブジェクトなども「モジュール」に含まれる概念である。
ソフトウェア複雑度測定装置1は、ソフトウェアの複雑度について、コンポーネント粒度(コンポーネント間)、モジュール粒度(モジュール間)、関数粒度(関数・共有変数間)及び関数内で、それぞれ算出する。ソフトウェアの複雑度は、依存関係に基づいて算出されてもよい。例えば、コンポーネント粒度における複雑度は、コンポーネント間の依存関係に基づいて算出されてよく、同様に、モジュール粒度における複雑度は、コンポーネント毎に、コンポーネント内におけるモジュール間の依存関係に基づいて算出されてよい。
ここで、「依存関係」とは、例えばモジュール粒度の場合、あるモジュールに含まれる関数が、別モジュールに含まれる関数を呼び出したり、別モジュールに含まれる変数を読み書きたりする関係にあることをいう。
図3は、モジュール間における依存関係の一例を示す図である。図3では、モジュールXの関数がモジュールYの関数を呼び出すタイプの依存関係が模式的に示される。即ち、図3に示す例では、モジュールXの関数がモジュールYの関数を呼び出す関係にある。また、このモジュールXのソースコードの一部を図4(A)に示し、モジュールYのソースコードの一部を図4(B)に示す。図3及び図4に示すように、モジュールX内の関数「funcA(void)」は、内部にモジュールYに含まれる関数「funcB()」の呼び出しが記述されている。尚、この場合、モジュールXからモジュールYへの依存が存在することとしてよい。
図5は、モジュール間における依存関係の他の一例を示す図である。図5では、モジュールXの関数がモジュールYの変数を呼び出すタイプの依存関係が模式的に示される。即ち、図5に示す例では、モジュールXの関数がモジュールYの変数を呼び出す関係にある。また、このモジュールXのソースコードの一部を図6(A)に示し、モジュールYのソースコードの一部を図6(B)に示す。図5及び図6に示すように、モジュールX内の関数「funcA(void)」は、内部にモジュールYに含まれる変数(共有変数)「verC」を参照することが記述されている。尚、この場合、モジュールXからモジュールYへの依存が存在することとしてよい。
図7は、モジュール間における依存関係の更なる他の一例を示す図である。図7では、モジュールXの関数がモジュールYの変数を更新するタイプの依存関係が模式的に示される。即ち、図7に示す例では、モジュールXの関数がモジュールYの変数を更新する関係にある。また、このモジュールXのソースコードの一部を図8(A)に示し、モジュールYのソースコードの一部を図8(B)に示す。図7及び図8に示すように、モジュールX内の関数「funcA(void)」は、内部にモジュールYに含まれる変数(共有変数)「verC」を更新することが記述されている。尚、この場合、モジュールYからモジュールXへの依存が存在することとしてよい。
尚、図3乃至図8では、モジュール間における依存関係について説明したが、コンポーネント間、関数・共有変数間、関数内においても実質的に同様である。例えば、あるコンポーネント内のモジュールの関数が、他のコンポーネント内のモジュールの関数を呼び出す場合、或いは、あるコンポーネント内のモジュールの関数が、他のコンポーネント内のモジュールの変数を呼び出す又は更新する場合は、コンポーネント間に依存関係が存在する。同様に、ある関数が、他の関数を呼び出す場合、或いは、ある関数が、共有変数を呼び出す又は更新する場合は、関数・共有変数間に依存関係が存在する。
尚、図3乃至図6に示す例では、モジュールXからモジュールYへの依存が存在し、図7乃至図8に示す例では、モジュールYからモジュールXへの依存が存在するとしているが、このような依存の方向(依存元と依存先との関係)については、用途に応じて自由に定義してよい。
図9は、ソフトウェア複雑度測定装置1の処理装置10により実行される処理の一例を示すフローチャートである。図9に示す処理は、測定対象のソフトウェアが指定されることで実行されてよい。或いは、測定対象のソフトウェアを入力データ(例えば、Cソースコード)として入力して実行されてよい。
ステップ900では、測定対象のソフトウェア内のコンポーネント間の依存関係の複雑度を表す第1指標値が算出される。
ステップ902では、モジュール間の依存関係の複雑度を表す第2指標値が算出される。第2指標値は、測定対象のソフトウェア内のコンポーネント毎に算出されてよい。
ステップ904では、測定対象のソフトウェア内の各関数・共有変数間の依存関係の複雑度を表す第3指標値が算出される。第3指標値は、モジュール毎に、モジュール内の各関数・共有変数に基づいて算出されてよい。
ステップ906では、関数内における経路複雑度を表す第4指標値が算出される。第4指標値は、関数の基本的な指標として知られるMcCabe複雑度であってよい。
ステップ908では、上記ステップ900で算出された第1指標値と上記ステップ902で算出された第2指標値との比が、コンポーネントの分割バランスを表す指標値(第1分割バランス指標値)として算出される。第1分割バランス指標値は、ソフトウェア全体に対して算出されてもよい。この場合、第1分割バランス指標値の算出には、当該ソフトウェアに属するコンポーネント毎の各第2指標値のうちの最大値が使用されてよい。
ステップ910では、上記ステップ902で算出された第2指標値と上記ステップ904で算出された第3指標値との比が、モジュールの分割バランスを表す指標値(第2分割バランス指標値)として算出される。尚、第2分割バランス指標値は、コンポーネント毎に算出されてよい。この場合、第2分割バランス指標値の算出には、コンポーネント毎に、当該コンポーネントに属するモジュール毎の各第3指標値のうちの最大値が使用されてよい。
ステップ912では、上記ステップ904で算出された第3指標値と上記ステップ906で算出された第4指標値との比が、関数の分割バランスを表す指標値(第3分割バランス指標値)として算出される。尚、第3分割バランス指標値は、モジュール毎に算出されてよい。この場合、第3分割バランス指標値の算出には、モジュール毎に、当該モジュールに属する関数毎の各第4指標値のうちの最大値が使用されてよい。
図9に示す処理によれば、ソフトウェアの分割バランスを表す指標値(第1、第2及び第3分割バランス指標値)を得ることができる。
図10は、分割バランス指標値の意義の説明図である。図10においては、縦軸には、箱内経路複雑度の最大値が取られ、横軸に、箱間経路複雑度が取られ、この比に対応する点が白丸でプロットされている。図10においては、3つの例に対応したプロット点が示されており、第1の例は、図10にて符合70で示すように、箱の中が複雑すぎる構成に対応し、第2の例は、図10にて符合72で示すように、分割バランスが良好な構成に対応し、第3の例は、図10にて符合74で示すように、線の構成が悪すぎる(分割数が多すぎる)構成に対応する。
尚、箱内経路複雑度の最大値及び箱間経路複雑度は、粒度に依存する。例えば、粒度がコンポーネントである場合(即ち箱がコンポーネント単位である場合)、箱内経路複雑度の最大値は、モジュール間の依存関係の複雑度を表す第2指標値の最大値(各コンポーネントに係る第2指標値うちの最大値)であり、箱間経路複雑度は、コンポーネント間の依存関係の複雑度を表す第1指標値に対応し、これらの比は第1分割バランス指標値となる。また、粒度がモジュールである場合(即ち箱がモジュール単位である場合)、箱内経路複雑度の最大値は、関数間の依存関係の複雑度を表す第3指標値の最大値(各モジュールに係る第3指標値のうちの最大値)であり、箱間経路複雑度は、モジュール間の依存関係の複雑度を表す第2指標値に対応し、これらの比は第2分割バランス指標値となる。また、粒度が関数である場合(即ち箱が関数単位である場合)、箱内経路複雑度の最大値は、経路複雑度を表す第4指標値の最大値(各関数に係る第4指標値のうちの最大値)であり、箱間経路複雑度は、関数間の依存関係の複雑度を表す第3指標値に対応し、これらの比は第3分割バランス指標値となる。
図10に示すように、箱内経路複雑度の最大値及び箱間経路複雑度が同程度であれば、箱と線のバランスが取れていると考えられる。即ち、箱内経路複雑度の最大値及び箱間経路複雑度をプロットした点と原点とを結ぶ直線と横軸との間の角度αが45度(=π/4rad)に近いほど、分割バランスが良いと考えることができる。従って、第1、第2及び第3分割バランス指標値は、値が"1"に近づくほど分割バランスが良いことを表す。
従って、第1、第2及び第3分割バランス指標値は、それぞれ、1に対する偏差が所定基準値以内であるか否かが評価され、1に対する偏差が所定基準値以内である場合に、分割バランスが良いと判定されてもよい。他方、第1、第2及び第3分割バランス指標値のいずれかの、1に対する偏差が所定基準値以内で無い場合、分割バランスが悪いことを注意喚起するための警告を表示装置16に出力することとしてよい。例えば、第1、第2及び第3分割バランス指標値のうち、1に対する偏差が所定基準値以内でない分割バランス指標値については、第1出力態様で表示装置16に出力されてもよい。第1出力態様は、ユーザに注意喚起を促す態様であってよい。例えば、1に対する偏差が所定基準値以内でない分割バランス指標値が赤色等で表示されてもよいし、点滅等する態様で表示されてもよい。また、第1出力態様は、分割バランスが悪い旨のメッセージの出力を伴ってもよい。他方、第1、第2及び第3分割バランス指標値のうち、1に対する偏差が所定基準値以内である分割バランス指標値については、第2出力態様で表示装置16に出力されてよい。第2出力態様は、第1出力態様よりも注意喚起度の低い通常態様であってよい。尚、上記の例では、第1乃至第3分割バランス指標値の全てが算出されているが、第1乃至第3分割バランス指標値のうちのいずれか1つ又は2つが算出され、算出された分割バランス指標値について、1に対する偏差が所定基準値以内か否かが判定されてもよい。尚、以上のような判定処理及び表示処理は、図9に示す処理に組み込まれてよい。
第1、第2及び第3分割バランス指標値としての分割バランス指標値は、同義であるが、代替的に、以下の式で定義されてもよい。
(分割バランス指標値)=4/π×|arctan{(箱内経路複雑度の最大値)/(箱間経路複雑度)}−π/4| (式0)
かかる分割バランス指標値の場合、値が"0"に近づくほど角度αが45度に近づくこと(即ち分割バランスが良いこと)を表し、値が"1"に近づくほど角度αが0度又は90度に近づくこと(即ち分割バランスが悪いこと)を表す。
ところで、問題のあるソフトウェア構造の多くは、どこかの階層が極端に単純であるため、そのしわ寄せとして別の階層が極端に複雑になっていることが多い。全ての階層に亘って適度な複雑さに抑えられた分割バランスの良い構造が、保守性の高い良いソフトウェア構造ということができる。尚、保守性が高いソフトウェア構造とは、保守作業(変更時の内容理解、修正、テストなど)に必要な努力(工数)が少なくて済む構造を指す。本実施例では、第1乃至第4指標値として経路複雑度を使用し、分割バランス指標値を得ることで、ソフトウェア構造の分割バランスを定量的に評価することができる。これにより、粒度毎に得られる分割バランス指標値に基づいて、ソフトウェア構造の分割バランスを定量的に評価することができる。
尚、図10に示す第1の例70のように、角度αが90度に近い場合は、箱内が複雑すぎる(即ち箱の分割が偏っている)ことを示している。従って、この場合、箱間の経路複雑度が十分小さければ、内部が複雑な箱を幾つかの箱に分割することで、分割バランスの改善が可能となりうる。また、図10に示す第1の例74のように、角度αが0度に近い場合は、箱間が複雑すぎる(即ち箱を細かく分割しすぎている)ことを示している。この場合、箱内の経路複雑度の最大値が十分小さければ、複数の箱を1つの箱に纏めることで、分割バランスの改善が可能となりうる。このように、ソフトウェア設計の指針(処方箋)が得られる。
次に、上述の第1乃至第3指標値の算出方法の例について説明する。
第1乃至第3指標値は、それぞれ、例えば、経路複雑度に関する指標値(以下、単に「経路複雑度」という)であってよい。経路複雑度は、例えば、以下の式で算出されてもよい。
(経路複雑度)=(経路数)−(箱数)+2×(連結成分数) 式(1)
この式(1)は、関数の基本的な指標として知られるMcCabe複雑度と同様の考え方に基づくものである。
ここで、式(1)において、経路数とは、依存関係を表す経路(線)の数である。例えば箱Aから箱Bへの依存が存在するとき、これを箱Aから箱Bへの依存の経路が存在する。このとき、箱Aから箱Bへの依存が何本あったとしても(例えば、箱Aに対応するモジュール内の関数が、箱Bに対応するモジュール内の関数を呼び出す関係が、複数本あったとしても)、経路数は"1"と数える。但し、箱Aから箱Bへの依存と、箱Bから箱Aへの依存は別の依存経路であると考え、双方向の依存が存在する場合、経路数は"2"と数える。尚、第1指標値の算出時は、箱はコンポーネントであり、第2指標値の算出時は、箱はモジュールであり、第3指標値の算出時は、箱は関数である。
また、式(1)において、箱数は、箱(構成要素)の数であり、粒度に依存する。例えば、コンポーネント粒度では箱数はコンポーネント数であり、モジュール粒度では箱数はモジュール数であり、関数粒度では箱数は関数と共有変数の合計数である。
また、式(1)において、連結成分とは、依存関係で連結されたひとつながりの箱の集合を指す。従って、連結成分数とは、依存関係で連結されたひとつながりの箱の集合の数となる。例えば、10個の箱全てが依存関係で互いにつながっている場合は、連結成分数は"1"である。他方、10個の箱全てが互いに依存せずに、ばらばらに存在する場合は、連結成分数は"10"である。
次に、第1乃至第3指標値の算出方法の他の例について説明する。
第1乃至第3指標値は、それぞれ、例えば、多対多関係強度を表す値であってよい。多対多関係強度は、例えば、以下の式で定義されてもよい。
(多対多関係強度)=(多対多経路数)/(多対多関係箱数) 式(2)
ここで、箱Aから箱Bへの依存のみが存在するとき、AとBは1対1関係にあるとし、M個の依存元からN個の依存先への経路が全て存在するとき、これをM対N関係にあるとする。M,Nが2以上であるとき、即ち複数の依存元から複数の依存先への経路が全て存在するとき、これを多対多関係にあるとする。複数の依存元から複数の依存先への経路が全て存在するとき(即ち多対多関係が存在するとき)、これらの経路を多対多経路と称する。従って、多対多経路数とは、複数の依存元から複数の依存先への経路が全て存在するとき、これらの多対多経路の数である。また、多対多関係箱とは、多対多関係を構成する箱であり、多対多関係箱数は、多対多関係箱の数である。
尚、複数の多対多関係が存在する場合、及び、その加えて複数の多対多関係が重複している場合には、多対多関係を構成する全ての経路は全て、多対多経路数として数え、多対多関係を構成する箱は全て多対多関係箱として数える。即ち、重複はダブルカウントしない。
図11は、多対多関係の一例の説明図である。図11に示す例では、箱A,Bと箱C乃至Fについては、箱Aから箱C乃至Fへの各経路が全て存在し、箱Bから箱C乃至Fへの各経路が全て存在するので、2対4関係であり、多対多関係を構成する。同様に、箱C乃至Fと箱G,Hは、4対2関係であり、多対多関係を構成する。この場合は、複数の多対多関係が存在する場合に当たり、また、複数の多対多関係が重複している場合に当たる(箱C乃至Fで重複する)。この場合、多対多経路数は、"16"であり、多対多関係箱数は、"8"であり、従って、多対多関係強度は"2"である。
図12は、多対多関係の他の例の説明図である。図12(A)は、2対2関係が4つある構成を示し、図12(B)は、4対4関係が1つある構成を示す。図12(A)に示す構成では、多対多経路数は、"16"であり、多対多関係箱数は、"16"であり、従って、多対多関係強度は"1"である。他方、図12(B)に示す構成では、多対多経路数は、"16"であり、多対多関係箱数は、"8"であり、従って、多対多関係強度は"2"である。このように、多対多経路数が同じでも、多対多関係強度が大きいほど経路が絡み合っているといえる。
ところで、保守性の高いソフトウェア構造は、依存関係がスパゲティでないという特徴がある。即ち、依存の経路が特定の箱間に集中しすぎて絡み合っていないという特徴がある。従って、第1乃至第3指標値として多対多関係強度を使用し、分割バランス指標値を得ることで、ソフトウェア構造の分割バランス(全ての階層に亘って適度な複雑さに抑えられたバランスの良さの有無)を定量的に評価することができる。
次に、第1乃至第3指標値の算出方法の更なる他の例について説明する。
第1乃至第3指標値は、それぞれ、例えば、逆方向経路率を表す値であってよい。逆方向経路率は、例えば、以下の式で定義されてもよい。
(逆方向経路率)=(逆方向経路数)/(順方向経路数) 式(3)
ここで、上述の如く、箱Aから箱Bへの依存が存在するとき、これを箱Aから箱Bへの依存の経路が存在する。このとき、箱Aから箱Bへの依存が何本あったとしても(例えば、箱Aに対応するモジュール内の関数が、箱Bに対応するモジュール内の関数を呼び出す関係が、複数本あったとしても)、経路数は"1"と数える。但し、箱Aから箱Bへの依存と、箱Bから箱Aへの依存は別の依存経路であると考え、双方向の依存が存在する場合、経路数は"2"と数える。逆方向とは、ある2つの箱間において、依存の本数が少ない方向に対応し、順方向は、依存の本数が多い方向に対応する。
図13は、逆方向経路及び順方向経路の決定方法(その1)の説明図である。
図13(A)に示す例では、箱Aから箱Bへ3本の依存があり、箱Bから箱Aへ2本の依存がある。この場合、依存の本数が少ない方向の経路、即ち箱Bから箱Aへの経路が逆方向経路となり、依存の本数が多い方向の経路、即ち箱Aから箱Bへの経路が順方向経路となる。
図13(B)に示す例では、箱Aから箱Bへ1本の依存があり、箱Bから箱Aへ1本の依存がある。このように依存の最小本数が同数である場合は、ランダムにいずれか一方が逆方向とされてよい。例えば、箱Bから箱Aへの経路が逆方向経路となり、箱Aから箱Bへの経路が順方向経路となってもよい。
図14は、逆方向経路及び順方向経路の決定方法(その2)の説明図である。
図14(A)に示す例では、3つの箱A,B,C間で依存が循環している。この場合、循環全体の中で最も本数の少ない依存の経路が逆方向となる。図14(A)に示す例では、箱から箱Bへの依存の本数が"2"であり、箱Bから箱Cへの依存の本数が"2"であり、箱Cから箱Aへの依存の本数が"1"である。従って、この場合、箱Cから箱Aへの経路が逆方向経路となり、箱Aから箱Bへの経路、及び、箱Bから箱Cへの経路が順方向経路となる。
図14(B)に示す例では、図14(A)に示す例と同様、3つの箱A,B,C間で依存が循環しているが、箱から箱Bへの依存の本数が"2"であり、箱Bから箱Cへの依存の本数が"1"であり、箱Cから箱Aへの依存の本数が"1"である。このように依存の最小本数が同数である場合は、ランダムにいずれか一方が逆方向とされてよい。例えば、箱Cから箱Aへの経路が逆方向経路とされ、箱Aから箱Bへの経路、及び、箱Bから箱Cへの経路が順方向経路とされてよい。
尚、図13及び図14に示したように、最も少ない依存本数の経路を切ることで双方向依存(図13)や循環依存(図14)を解消できるような経路が逆方向経路ということができる。
逆方向経路数及び順方向経路数は、例えば以下の方法で算出されてもよい。先ず、DSM(Dependency Structure Matrix)によって箱間の依存関係を表現する。DSMとは、列と行の交差するセルに依存元から依存先への依存関係の本数(依存の数)を記述した行列である。DSMの項目は、各箱を表す。従って、例えばモジュール粒度の場合(即ち第2指標値の場合)は、DSMの各項目は、あるコンポーネント内の各モジュールであってよい。また、関数粒度の場合(即ち第3指標値の場合)は、DSMの各項目は、各関数及び各共有変数であってよい。DSMにおける箱の並び方は、対角線より上のセル内の数字の合計(逆方向の依存数)が最小となるように最適化される。かかる最適化を行ったDSMにおいて、対角線より上の各セルのうち、"1"以上の数字が入っているセルの数が、逆方向経路数となり、対角線より下の各セルのうち、"1"以上の数字が入っているセルの数が、順方向経路数となる。
図15は、DSMを用いた逆方向経路率の算出方法の流れの一例を示す図である。図15(A)に示す例では、箱Aから箱Bへの依存の本数が"10"であり、箱Bから箱Cへの依存の本数が"1"であり、箱Cから箱Aへの依存の本数が"20"である構成が示される。このような構成について、先ず、箱A,B,Cの並びにてDSMで表現すると、図15(B)に示すDSMが得られる。このDSMでは、対角線より上のセル内の数字の合計が"20"である。対角線より上のセル内の数字の合計が最小となるように、箱A,B,Cの並びを最適化すると、図15(C)に示すDSMが得られる。このDSMによれば、図15(D)に示すような箱C,A,Bの並びで対角線より上のセル内の数字の合計が最小値"1"となり、最適な並びであることが分かる。従って、この例では、箱Bから箱Cへの経路が逆方向経路となり、箱Cから箱Aへの経路、及び、箱Aから箱Bへの経路が順方向経路となる。従って、逆方向経路数は、"1"であり、順方向経路数は、"2"であり、逆方向経路率は、"1/2"となる。
ところで、保守性の高いソフトウェア構造は、依存の方向がそろっているという特徴がある。即ち、逆方向経路数が少ないという特徴がある。従って、第1乃至第3指標値として逆方向経路率を使用し、分割バランス指標値を得ることで、ソフトウェア構造の分割バランス(全ての階層に亘って適度な複雑さに抑えられた分割バランスの良さの有無)を定量的に評価することができる。
以上、本発明の好ましい実施例について詳説したが、本発明は、上述した実施例に制限されることはなく、本発明の範囲を逸脱することなく、上述した実施例に種々の変形及び置換を加えることができる。
上述した実施例では、第1乃至第3指標値の算出方法のいくつかを説明したが、これらは組み合わせて使用することも可能である。例えば、第1乃至第3指標値は、それぞれ、経路複雑度、多対多関係強度を表す値、及び、逆方向経路率を表す値のうちの任意の2つ又は3つの組合せで表されてもよい。
また、上述した実施例では、第1乃至第3分割バランス指標値の全てを算出しているが、これらのうちの任意の1つ又は2つの組合せのみを算出する構成であってもよい。
また、上述した実施例では、測定対象のソフトウェアは、コンポーネント、モジュール、関数・共有変数の構成単位で階層構造を有しているが、階層構造における階層数は任意である。また、同一階層における各構成単位の区分け、例えばコンポーネント間の区分け(例えば、どのモジュールがどのコンポーネントに含まれるか)についても任意である。但し、典型的には、モジュールは、ソースファイル毎に存在し、コンポーネントは、ソースファイルを格納するフォルダ毎に存在する。
1 ソフトウェア複雑度測定装置
10 処理装置
12 CPU
14 記憶部
16 表示装置

Claims (7)

  1. 階層構造を持つソフトウェア内の複数のコンポーネント間の依存関係の複雑度を表す第1指標値と、前記コンポーネント内の複数のモジュール間の依存関係の複雑度を表す第2指標値との第1比、前記第2指標値と、前記モジュール内の複数の関数間の依存関係の複雑度を表す第3指標値との第2比、前記第3指標値と、前記関数内における経路複雑度を表す第4指標値との第3比のうちの少なくともいずれか1つの比を算出する、ソフトウェア複雑度測定装置。
  2. 前記算出した比が1に近いか否かを判定する、請求項1に記載のソフトウェア複雑度測定装置。
  3. 前記第1比は、前記第1指標値と、前記複数のコンポーネントに係る各第2指標値のうちの最大値とに基づいて算出される、請求項1又は2に記載のソフトウェア複雑度測定装置。
  4. 前記第2比は、前記第2指標値と、前記複数のモジュールに係る各第3指標値のうちの最大値とに基づいて算出される、請求項1〜3のうちのいずれか1項に記載のソフトウェア複雑度測定装置。
  5. 前記第3比は、前記第3指標値と、前記複数の関数に係る各第4指標値のうちの最大値とに基づいて算出される、請求項1〜4のうちのいずれか1項に記載のソフトウェア複雑度測定装置。
  6. 階層構造を持つソフトウェア内の複数のコンポーネント間の依存関係の複雑度を表す第1指標値と、前記コンポーネント内の複数のモジュール間の依存関係の複雑度を表す第2指標値との第1比、前記第2指標値と、前記モジュール内の複数の関数間の依存関係の複雑度を表す第3指標値との第2比、前記第3指標値と、前記関数内における経路複雑度を表す第4指標値との第3比のうちの少なくともいずれか1つの比を算出する、ソフトウェア複雑度測定方法。
  7. 階層構造を持つソフトウェア内の複数のコンポーネント間の依存関係の複雑度を表す第1指標値と、前記コンポーネント内の複数のモジュール間の依存関係の複雑度を表す第2指標値との第1比、前記第2指標値と、前記モジュール内の複数の関数間の依存関係の複雑度を表す第3指標値との第2比、前記第3指標値と、前記関数内における経路複雑度を表す第4指標値との第3比のうちの少なくともいずれか1つの比を算出する処理をコンピューターに実行させるプログラム。
JP2012266686A 2012-12-05 2012-12-05 ソフトウェア複雑度測定装置及び方法並びにプログラム Expired - Fee Related JP5869465B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2012266686A JP5869465B2 (ja) 2012-12-05 2012-12-05 ソフトウェア複雑度測定装置及び方法並びにプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012266686A JP5869465B2 (ja) 2012-12-05 2012-12-05 ソフトウェア複雑度測定装置及び方法並びにプログラム

Publications (2)

Publication Number Publication Date
JP2014112325A JP2014112325A (ja) 2014-06-19
JP5869465B2 true JP5869465B2 (ja) 2016-02-24

Family

ID=51169418

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012266686A Expired - Fee Related JP5869465B2 (ja) 2012-12-05 2012-12-05 ソフトウェア複雑度測定装置及び方法並びにプログラム

Country Status (1)

Country Link
JP (1) JP5869465B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2019102786A1 (ja) 2017-11-21 2019-05-31 三菱電機株式会社 ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006113934A (ja) * 2004-10-18 2006-04-27 Hitachi Ltd プログラム開発支援装置、プログラム開発支援方法およびプログラム

Also Published As

Publication number Publication date
JP2014112325A (ja) 2014-06-19

Similar Documents

Publication Publication Date Title
JP6804668B2 (ja) ブロックデータ検証方法および装置
US9311730B2 (en) Aggregating graph structures
CN106062711B (zh) 用于复合控件的方法、系统和计算机存储介质
US10489360B2 (en) Specifying and applying rules to data
CN107679985B (zh) 风险特征筛选、描述报文生成方法、装置以及电子设备
CN107111722B (zh) 数据库安全
US10169412B2 (en) Selectivity estimation for query execution planning in a database
Srinivasan et al. Multi-objective simulation-optimization model for long-term reservoir operation using piecewise linear hedging rule
US9904524B2 (en) Method and device for visually implementing software code
CN103959243A (zh) 扩展到用反向弧编码最小和最大约束的有向图的方法和装置
US20160350449A1 (en) Exceptional logic element management
US10997335B2 (en) Exceptional logic element management
CN104718529B (zh) 表示没有外部引用的引用属性注释
JP5869465B2 (ja) ソフトウェア複雑度測定装置及び方法並びにプログラム
US10901987B2 (en) Dynamic automatic generation of database views
Zhao et al. Liveness-enforcing supervisors synthesis for a class of generalised Petri nets based on two-stage deadlock control and mathematical programming
JP5981327B2 (ja) ソフトウェア複雑度測定装置及び方法並びにプログラム
US10152039B2 (en) Method and apparatus for the display of multiple errors on a human-machine interface
US8935664B2 (en) Method and apparatus to determine rules implementation decision
WO2020230043A1 (en) Feature vector feasibilty estimation
JP5869466B2 (ja) ソフトウェア複雑度測定装置及び方法並びにプログラム
JP6561993B2 (ja) データ管理システム、データ管理装置、データ管理方法、および、プログラム
CN110298390A (zh) 一种风控模型的特征选择方法及装置
CN109902178A (zh) 一种多级文本分类方法及系统
US8856730B2 (en) Diagram layout patterns

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150309

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20151014

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20151215

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160107

R151 Written notification of patent or utility model registration

Ref document number: 5869465

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R151

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees