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 )といいます.

例えば,以下のコードにおいて, foofalse であるため, 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 を用いています.