Checkstyle チェック項目ーMetrics

Checkstyleチェック項目:Metrics

CheckStyle公式ドキュメント

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>