Checkstyleチェック項目:Metrics
ver 10.3.1
BooleanExpressionComplexity
式中のboolean演算子(&&、 ||、 &、 |、 ^)の数を制限する。
プロパティ
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
max | int | 3 | 1つの式で許可されるboolean演算の最大数 |
tokens | トークンの サブセット | LAND, BAND, LOR, BOR, BXOR |
チェック対象のトークン |
〇トークンのサブセットに設定可能な値は以下の通り
値 | 説明 |
---|---|
LAND | && |
BAND | & |
LOR | || |
BOR | | |
BXOR | ^ |
チェック設定例
プロパティ設定なし
<module name="BooleanExpressionComplexity"/>
プロパティ設定あり
<module name="BooleanExpressionComplexity"> <property name="max" value="5"/> </module>
チェック実行例
プロパティ設定なし
public class Test { public static void main(String ... args) { boolean a = true; boolean b = false; // OK boolean c = (a & b) | (b ^ a); // NG boolean演算子は3個まで boolean d = (a & b) ^ (a || b) | a; } }
プロパティ設定あり
public class Test { public static void main(String ... args) { boolean a = true; boolean b = false; // OK boolean c = (a & b) | (b ^ a) | (a ^ b); // NG boolean演算子は5個まで boolean d = (a | b) ^ (a | b) ^ (a || b) & b; } }
ClassDataAbstractionCoupling
与えられたクラスまたはレコード内で、他のクラスのインスタンス化の数を計測する。
一般に、他のデータ型をメンバやローカル変数として持つデータ型で、他のクラスのインスタンス化(オブジェクト)であるものは、データ抽象化結合(DAC)を持ち、DACが高いほどクラスの構造は複雑だといわれている。
プロパティ
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
max | int | 7 | 許容される最大閾値を指定 |
excludedClasses | String[] |
ArrayIndexOutOfBoundsException, ArrayList, Boolean, Byte, Character, Class, Collection, Deprecated, Deque, Double, DoubleStream, EnumSet, Exception, Float, FunctionalInterface, HashMap, HashSet, IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException, IntStream, Integer, LinkedHashMap, LinkedHashSet, LinkedList, List, Long, LongStream, Map, NullPointerException, Object, Optional, OptionalDouble, OptionalInt, OptionalLong, Override, Queue, RuntimeException, SafeVarargs, SecurityException, Set, Short, SortedMap, SortedSet, Stream, String, StringBuffer, StringBuilder, SuppressWarnings, Throwable, TreeMap, TreeSet, UnsupportedOperationException, Void, boolean, byte, char, double, float, int, long, short, var, void |
カウント対象外とするクラス名を指定 |
excludeClassesRegexps | Pattern[] |
^$ | カウント対象外とするクラス名の正規表現を指定 |
excludedPackages | String[] |
{} | カウント対象外とするパッケージ名を指定 |
チェック設定例
プロパティ設定なし
<module name="ClassDataAbstractionCoupling"/>
プロパティ設定あり
<module name="ClassDataAbstractionCoupling"> <property name="max" value="2"/> </module>
チェック実行例
プロパティ設定なし
// NG 8クラス使用されている class MyClass { Date date = new Date(); Time time = new Time(); Foo foo = new Foo(); Bar bar = new Bar(); Fizz fizz = new Fizz(); Buzz buzz = new Buzz(); Animal animal = new Animal(); Place place = new Place(); }
プロパティ設定あり
// NG 3クラス使用されている class MyClass { Date date = new Date(); Time time = new Time(); Place place = new Place(); }
ClassFanOutComplexity
与えられたクラス/レコード/インターフェース/enum/アノテーションが依存している他の型の数をチェックする。
プロパティ
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
max | int | 20 | 許容される最大閾値を指定 |
excludedClasses | String[] |
ArrayIndexOutOfBoundsException, ArrayList, Boolean, Byte, Character, Class, Collection, Deprecated, Deque, Double, DoubleStream, EnumSet, Exception, Float, FunctionalInterface, HashMap, HashSet, IllegalArgumentException, IllegalStateException, IndexOutOfBoundsException, IntStream, Integer, LinkedHashMap, LinkedHashSet, LinkedList, List, Long, LongStream, Map, NullPointerException, Object, Optional, OptionalDouble, OptionalInt, OptionalLong, Override, Queue, RuntimeException, SafeVarargs, SecurityException, Set, Short, SortedMap, SortedSet, Stream, String, StringBuffer, StringBuilder, SuppressWarnings, Throwable, TreeMap, TreeSet, UnsupportedOperationException, Void, boolean, byte, char, double, float, int, long, short, var, void |
カウント対象外とするクラス名を指定 |
excludeClassesRegexps | Pattern[] |
^$ | カウント対象外とするクラス名の正規表現を指定 |
excludedPackages | String[] |
{} | カウント対象外とするパッケージ名を指定 |
チェック設定例
プロパティ設定なし
<module name="ClassFanOutComplexity"/>
プロパティ設定あり
<module name="ClassFanOutComplexity"> <property name="max" value="2"/> </module>
チェック実行例
プロパティ設定なし
// NG 21クラス使用されている class MyClass { Date date = new Date(); Time time = new Time(); // ・・・他に18クラス使用されていたとする // 21クラス目の使用 Place place = new Place(); }
プロパティ設定あり
// NG 3クラス使用されている class MyClass { Date date = new Date(); Time time = new Time(); Place place = new Place(); }
CyclomaticComplexity
サイクロマティック複雑度を、指定された制限値に対してチェックする。
これは、ソースを通過できるパスの最小数と必要なテストの数を表すものであり、 コードの品質とは関係がない。
メソッド、コンストラクタ、スタティックイニシャライザ、インスタンスイニシャライザのみに適用される。
ソースコード中にif, while , do, for, ?:, catch, switch, case文、演算子 &&, ||が出てくると「+1」される。
理論的には、1-4はテストが容易、5-7はOK、8-10はテストを容易にするためのリファクタリングを考慮、11以上はリファクタリングが必要となる。
プロパティ
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
max | int | 10 | 許容される最大閾値を指定 |
switchBlockAsSingleDecisionPoint | boolean | false | スイッチブロック全体を1つの判定点として扱うかどうか |
tokens | トークンの サブセット | LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_SWITCH, LITERAL_CASE, LITERAL_CATCH, QUESTION, LAND, LOR |
チェック対象のトークン |
〇トークンのサブセットに設定可能な値は以下の通り
値 | 説明 |
---|---|
LAND | && |
LOR | || |
LITERAL_WHILE | while |
LITERAL_DO | do |
LITERAL_FOR | for |
LITERAL_IF | if |
LITERAL_SWITCH | switch |
LITERAL_CASE | case |
LITERAL_CATCH | catch |
QUESTION | ? |
チェック設定例
プロパティ設定なし
<module name="CyclomaticComplexity"/>
プロパティ設定あり
<module name="CyclomaticComplexity"> <property name="max" value="4"/> <property name="tokens" value="LITERAL_WHILE, LITERAL_DO"/> </module>
チェック実行例
プロパティ設定なし
// サイクロマティック複雑度が11なのでNG class MyClass { int a, b, c, d, n; public void foo() { // 1 if (a == 1) { // 2 fun1(); } else if (a == b // 3 && a == c) { // 4 if (c == 2) { // 5 fun2(); } } else if (a == d) { // 6 try { fun4(); } catch (Exception e) { // 7 } } else { switch(n) { case 1: // 8 fun1(); break; case 2: // 9 fun2(); break; case 3: // 10 fun3(); break; default: break; } } d = a < 0 ? -1 : 1; // 11 } }
プロパティ設定あり
// サイクロマティック複雑度が5なのでNG class MyClass { int a, b, c, d; public void foo() { // 1 while (a < b // 2 && a > c) { fun(); } if (a == b) { do { // 3 fun(); } while (d); } else if (c == d) { while (c > 0) { // 4 fun(); } do { // 5 fun(); } while (a); } } }
JavaNCSS
Non Commenting Source Statements (NCSS) をカウントすることによって、メソッド、クラス、ファイルの複雑さを判定する。
このチェックは、JavaNCSS-Toolの仕様に準拠している。
NCSSの指標はコメントでないソース行を数えることで算出される。
プロパティ
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
methodMaximum | int | 50 | メソッドのコメントを除く行の最大許容数 |
classMaximum | int | 1500 | クラスのコメントを除く行の最大許容数 |
fileMaximum | int | 2000 | 1Javaファイルのコメントを除く行の最大許容数 |
recordMaximum | int | 150 | レコードのコメントを除く行の最大許容数 |
チェック設定例
プロパティ設定なし
<module name="JavaNCSS"/>
プロパティ設定あり
<module name="JavaNCSS"> <property name="methodMaximum" value="2"/> </module>
チェック実行例
プロパティ設定なし
public void foo() { System.out.println("Line 1"); // 同様のコードが48行あったとする System.out.println("Line 50") // NG メソッドのコメント以外の行が50行を超えている System.out.println("Line 51") }
プロパティ設定あり
public void foo() { System.out.println("Line 1"); System.out.println("Line 2") // NG メソッドのコメント以外の行が2行を超えている System.out.println("Line 3") }
NPathComplexity
NPATHの複雑さを指定された制限値に対してチェックする。
NPATH メトリックは、メソッドを通過する可能な実行パスの数を計算する。
NPATHについては「NPATH: a measure of execution pathcomplexity and its applications」を参照の事。
プロパティ
プロパティ | 型 | デフォルト値 | 説明 |
---|---|---|---|
max | int | 200 | 許容される最大閾値を指定 |
チェック設定例
プロパティ設定なし
<module name="NPathComplexity"/>
プロパティ設定あり
<module name="NPathComplexity"> <property name="max" value="3"/> </module>