設計の改善課題を、コードのメトリクスから発見する
Javaの設計(クラス、メソッド、パッケージ)の改善課題を発見するための、測定指標のガイドライン。
使用ツール:IntelliJ IDEA の Code Inspection
指標 | 英語名 | ガイドライン (デフォルト値) |
説明 |
---|---|---|---|
複雑度 | overly complex method | 2 (10) | 分岐の複雑さ。if文、for文、そのネストが多いほど複雑になる。 リファクタリングの候補。 |
結合度 | overly coupled method | 2 (10) | メソッド内で使う他のクラスの数。 他のクラスへの依存が多いほど密結合になる。 |
長さ | overly long method | 5 (30) | 長いメソッドほど異なる関心事が混在している。 メソッド抽出の候補。 |
ネストの深さ | overly nested method | 1 (5) | ネストの深さは、異なるレベルの関心事が混在。 メソッド抽出の候補。 |
多重ループ | method with multiple loop | 多重ループは、異なるレベルの関心事が混在している。 メソッド抽出の候補。 |
|
メソッドの引数 | method with too many parameters | 2 (5) | パラメータが多いほど、コードが複雑になる。 パラメータクラスの抽出の候補。 |
コンストラクタの引数 | constructor with too many parameters | 3 (5) | 複雑なコンストラクタは、意図が不明確で使う側の負担になる。 クラスの分割の候補。 |
メソッドが使う第一のデータは、インスタンス変数になる。
オブジェクト指向のメソッドに渡す引数は、手続き型のサーブルーチンに渡す引数よりも少なくなる。
インスタンス変数だけで、判断/加工/計算ができるロジックを記述したメソッドであれば、引数はゼロ。
インスタンス変数に他のデータを組合せて判断/加工/計算する場合、原則として一つだけのデータを対象にする。
引数の用途がオプション(振る舞いの条件分岐)の場合は、目的別にメソッドを分けるか多態を検討する。
コンストラクタに多くの引数を渡すのは、インスタンス変数が多い。
インスタンス変数が多いクラスは、異なる関心事が混在している可能性が高い。
クラスの分割を検討する。
指標 | 英語名 | ガイドライン (デフォルト値) |
説明 |
---|---|---|---|
複雑度 | overly complex class | 20 (80) | メソッドの複雑度の合計。 |
結合度 | overly coupled class | 5 (15) | 他のクラスに依存する度合い。 |
フィールドの数 | too many fields | 3 (10) | フィールド(インスタンス変数)の数。 関心の分離の改善の候補。 |
メソッドの数 | too many methods | 7 (20) | 人間が一度が理解できる個数は7個が限度。 |
コンストラクタの数 | too many constructors | 2 (5) | コンストラクタの多重定義は、わかりにくい。 完全コンストラクタ+デフォルトの2つがガイドライン。 |
クラスは、判断/加工/計算のロジックの置き場所。
フィールド(インスタンス変数)は、その計算の対象となるデータ。
フィールドの数が多い場合は、異なる関心事が混在している可能性が高い。
クラスの分割の候補。
なお、ロジックをほとんど持たないデータの入れ物クラスは、このガイドラインの対象外。 このガイドラインは「ロジックの整理の手段」としてのクラス設計の改善のガイドライン。
指標 | 英語名 | ガイドライン (デフォルト値) |
説明 |
---|---|---|---|
少ないクラス | pacakge with too few classes | 3 (3) | クラス数が少なすぎる。 他のパッケージとの統合の候補。 |
多すぎるクラス | package with too many classes | 10 (10) | クラス数が多すぎる。 パッケージ分割の候補。 |
孤立したクラス | class indepedent of its package | パッケージ内から使われない、かつ、パッケージの他のクラスを使わない。 このパッケージに存在することが疑わしい。 |
|
特定のパッケージだけから使う | class only used from one other package | 特定のパッケージだけから使う。 そのパッケージへの移動の候補。 |