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 文において, break や return のないケースが存在しないかチェックします.
故意に通り抜けさせていると考えられる空のケースは無視されます.
ちなみに
制御の流れが合流する動作をさせたい場合,空のケースを書くことを フォールスルー ( 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 を用いています.