Simplify¶
概要¶
簡潔なコードが記述されている際に獲得できる実績です. 複数の方法で記述が可能な箇所において,簡潔に記述を行うことによって可読性が上がり,またバグを防ぐことができます.
| タイトル |
|---|
| Better be single |
この実績には,以下の5つのルールが含まれます:
- CollapsibleIfStatements
- ForLoopCanBeForeach
- SimplifyBooleanExpressions
- SimplifyBooleanReturns
- UnconditionalIfStatement
CollapsibleIfStatements¶
条件文の記述を工夫することで,2つの if ブロックを統合できることがあります.
コード例¶
// before
void bar() {
if (x) {
if (y) {
doSomething();
}
}
}
// after
void bar() {
if (x && y) { // 1つのブロックに統合
doSomething();
}
}
このルールのチェックには,PMDの CollapsibleIfStatements を用いています.
ちなみに
Javaにおいて,2つの boolean 型の変数の評価を行う || や && では,左辺(第一引数)を評価した段階で式全体の値が定まらない場合のみ右辺(第二引数)を評価します.
このことを 短絡評価 ( short-circuit evaluation )といいます.
例えば,以下のコードにおいて, foo は false であるため, isOkay() の呼び出しは行われません.なぜなら isOkay() の返り値にかかわらず,
foo && isOkay() を評価した結果は false であるからです.
int foo = false;
if (foo && isOkay()) {
doSomething();
}
ForLoopCanBeForeach¶
以下のような for ループは foreach (拡張 for 文)によるループに変更でき,その方が IndexOutOfBoundsException などの例外が起きにくく,安全です.
- リストや配列などを先頭から参照していくためだけに,インデックスを使用している
- 代入文等の配列を更新する処理が1つしか存在しない
- 配列を先頭から末尾まで順に参照している
コード例¶
public class MyClass {
void loop(String[] array) {
// before
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
// after
for (String s : array) {
System.out.println(s);
}
}
}
このルールのチェックには,PMDの ForLoopCanBeForeach を用いています.
SimplifyBooleanExpressions¶
boolean 型の比較で簡潔に記述できるものがあります.
コード例¶
public class Bar {
// !!! `bar = isFoo();` と簡潔に記述できます
private boolean bar = (isFoo() == true);
public isFoo() { return false;}
}
このルールのチェックには,PMDの SimplifyBooleanExpressions を用いています.
SimplifyBooleanReturns¶
boolean 型の値を返す if-then-else 節で簡潔に記述できるものがあります.
コード例¶
// before
public boolean isBarEqualTo(int x) {
if (bar == x) {
return true;
} else {
return false;
}
}
// after
public boolean isBarEqualTo(int x) {
return bar == x;
}
このルールのチェックには,PMDの SimplifyBooleanReturns を用いています.
UnconditionalIfStatement¶
if 文で常に true/false になるものは使用を避けましょう.
コード例¶
public class Foo {
public void close() {
if (true) { // !!! この if 文は必要ありません
doSomething();
}
}
}
このルールのチェックには,PMDの UnconditionalIfStatement を用いています.