ツールSource Monitorを使用してJavaコードのループの複雑さを測定


コードのループ複雑度(Cyclomatic complexity、場合によってはループ複雑度にも翻訳される)は、1976年にThomas J.McCabe,Sr.によって提案されたコード複雑度の測定基準である.
計算式を見てみましょう.
コードリング複雑度=E−N+2
E=プログラム制御フローチャートにおけるエッジの個数
N=プログラム制御フローチャートのポイント数
コードループの複雑さが高いほどバグが発生しやすいと結論しやすい.
開発者がコードの制御フローを自分で描き、図中のエッジとポイントの個数を数える必要がある場合、効率が低すぎてもエラーが発生しやすいことが想像できます.
幸いなことに、Javaコードのループの複雑さを測定するために、Source Monitorという無料ソフトウェアがあります.もちろん、このソフトウェアはC++とC#もサポートしています.
このソフトウェアの使い方を説明するために、簡単なJavaコードを書きました.
package test;

import java.util.ArrayList;

public class monthTool {

static ArrayList monthCollection = new ArrayList();

public static void main(String[] args) {

monthTool tool = new monthTool();

tool.printV1(1);

tool.printV2(2);

tool.printV1(0);

tool.printV2(-1);

tool.printV3(3);

tool.printV3(13);

}

public monthTool(){

monthCollection.add("Invalid");

monthCollection.add("January");

monthCollection.add("Febrary");

monthCollection.add("March");

monthCollection.add("April");

monthCollection.add("May");

monthCollection.add("June");

monthCollection.add("July");

monthCollection.add("August");

monthCollection.add("September");

monthCollection.add("October");

monthCollection.add("November");

monthCollection.add("December");

}

public void printV1(int month){

System.out.println("Month is: " + getMonthNameV1(month));

}

public void printV2(int month){

if( month >= 1 && month <= 12)

System.out.println("Month is: " + getMonthNameV2(month));

else

System.out.println("Please specify a valid month");

}

public void printV3(int month) {

System.out.println("Month is: " + getMonthNameV3(month));

}

public String getMonthNameV2(int month){

if( month == 1)

return "January";

else if( month == 2)

return "Febrary";

else if( month == 3)

return "March";

else if( month == 4)

return "April";

else if( month == 5)

return "May";

else if( month == 6)

return "June";

else if( month == 7)

return "July";

else if( month == 8)

return "August";

else if( month == 9)

return "September";

else if( month == 10)

return "October";

else if( month == 11)

return "November";

else if( month == 12)

return "December";

else

return "Invalid";

}

public String getMonthNameV1(int month){

switch (month){

case 1:

return "January";

case 2:

return "Febrary";

case 3:

return "March";

case 4:

return "April";

case 5:

return "May";

case 6:

return "June";

case 7:

return "July";

case 8:

return "August";

case 9:

return "September";

case 10:

return "October";

case 11:

return "November";

case 12:

return "December";

default:

return "Invalid";

}

}

public String getMonthNameV3(int month){

try {

return monthCollection.get(month);

}

catch (java.lang.IndexOutOfBoundsException e){

return "Invalid";

}

}

}

このうち私は3つの異なる方法で同じ論理を実現し、月を表す整数を月名に変えた.
以下はSource Monitorの具体的な使い方です.
1.新しいプロジェクトを作成します.
ここではすべてのSource Monitorがサポートするプログラミング言語を見ることができます.
2.ローカルのJavaプロジェクトファイルアドレスを指定します.
3.Javaプロジェクトフォルダ内で、SourceMonitorがどのJavaファイルのループ複雑度を計算するかを指定します.
4.OKでスキャン開始です.
すぐにSource Monitorが指定したJavaファイルのループ複雑度を計算します.メニュー「Display Method Metrics」をクリックして結果を表示します.
ループ複雑度スキャンの結果から,第3の月名集合からArrayListが持つget法により月名を取得することが最良の解法であることが明らかになった--ループ複雑度は2にすぎない.
方法のループの複雑さをグラフでより直感的に比較することもできます.
X軸の値は各方法のループ複雑度を表し、Y軸はこれらのループ複雑度の異なる値が現れる回数を表す.
例えば下図の意味では、ループ複雑度が1の方法(X軸目盛りが1のノード)が4個(Y軸目盛りが4)、ループ複雑度が2の方法(X軸目盛りが2のノード)が1個(Y軸目盛りが1)である.
Jerryのオリジナル技術の記事をもっと入手するには、「汪子熙」という公衆番号に注目するか、次のQRコードをスキャンしてください.