Switch

概要

Switch 文を適切に用いている際に獲得できる実績です. Switch 文を適切に用いることによって,プログラム内の制御やデータの流れが分かりやすくなります.

タイトル
Highest branch isn't safest roost

この実績には,以下の5つのルールが含まれます:

  • DefaultLabelNotLastInSwitchStmt
  • MissingBreakInSwitch
  • SwitchDensity
  • SwitchStmtsShouldHaveDefault
  • TooFewBranchesForASwitchStatement

DefaultLabelNotLastInSwitchStmt

switch 文における default ラベルが一番最後に位置しているかをチェックします.

コード例

public class Foo {
  void bar(int a) {
    switch (a) {
      case 1:
        // do something
        break;
      default:  // !!! default ラベルは一番最後に位置するべきです
        break;
      case 2:
        // do something
        break;
    }
  }
}

このルールのチェックには,PMDの DefaultLabelNotLastInSwitchStmt を用いています.

MissingBreakInSwitch

switch 文において, breakreturn のないケースが存在しないかチェックします. 故意に通り抜けさせていると考えられる空のケースは無視されます.

ちなみに

制御の流れが合流する動作をさせたい場合,空のケースを書くことを フォールスルーfall through )といいます.

コード例

public void bar(int status) {
  switch(status) {
    case CANCELLED:
      doCancelled();
      break;    // 通常の記述です.
    case NEW:
      doNew();
      // !!! break; がありません
    case OTHER: // 空のケースです. フォールスルーとみなされ,無視されます.
    case ERROR:
      doErrorHandling();
    break;
  }
}

このルールのチェックには,PMDの MissingBreakInSwitch を用いています.

SwitchDensity

switch 文の分岐先で多数の処理を行っている場合,可読性が下がり,変更も行いにくくなります. switch 文の分岐に従って処理を新たなメソッドに抜き出したり,サブクラスを作成したりすることを考えましょう.

コード例

public class Foo {
  public void bar(int x) {
    switch (x) {
      case 1:
        // たくさんの処理
        break;
      case 2:
        // たくさんの処理
        break;
      default:
        // たくさんの処理
        break;
    }
  }
}

このルールのチェックには,PMDの SwitchDensity を用いています.

SwitchStmtsShouldHaveDefault

switch 文において default ラベルが必ず存在しているかチェックします.

コード例

public void bar() {
  int x = 2;
  switch (x) {
    case 1: int j = 6;
    case 2: int j = 8;
    // !!! defalt ラベルがありません
  }
}

このルールのチェックには,PMDの SwitchStmtsShouldHaveDefault を用いています.

TooFewBranchesForASwitchStatement

switch 文は複数の分岐を行う際に使うことを目的としています. 分岐の数が2つだけの場合は可読性の高い if 文を使うようにしましょう.

コード例

public class Foo {
  public void bar() {
    switch (condition) {
      // 分岐が2つしかありません
      // if 文を使うほうが適切です
      case ONE:
        doSomething();
        break;
      default:
        doSomethingElse();
        break;
    }
  }
}

このルールのチェックには,PMDの TooFewBranchesForASwitchStatement を用いています.