私がSwitch文が嫌いな理由(Java)

自分は業務でJavaを使い趣味でC#やPHP、JavaScriptなどを使うのですが、
それらのプログラミング言語を使うとき私は意識してSwich文は書かないようにしており、その理由を紹介しようかと思います。

Breakを忘れやすい

なんとバカなことかと思われるかもしれないですが、これは意外とよくやるミスのように思います。
特に私のような初心者・なんちゃってプログラマやソースのよく絡まった神オブジェクトを操作していると発生しやすく、書き忘れたところで、エラーも何も特定できるものがないが
結果は予想したものにならないという事態に陥りやすい。

一つの関数にたくさんの処理を書くことになる

基本的に一つの関数には多くの処理をさせると可読性が下がりがちです。
処理の分岐があるともはや読みにくいことこの上ないです。
さらに、caseの中にif文やswichが入っていたらもう読む気も失せます。

変数のスコープ範囲がとんでもないことなる

これが最大の理由なのですが、
上のほうで書いたcase の中で宣言した変数は caseの外でも有効なのです。
説明が下手なので、コードを用意しました。

switch(a){
  case B:
    boolean bool = true;
    break;
  case C:
    if(bool){
    }
    break;
}

こんな感じに、case B で宣言した変数はたとえcase Bの処理を通らなくても case Cで利用できてしまうのです。
これではもし case Cで boolという名前の変数を宣言しようと思っても、すでに宣言してあるとみなされて、変数を作ることができません。

最後に

とは言え、ifとelseだけで書くと条件がどうしても多くなってしまう場合に対応しきれないのも事実で、そういった致し方ないときにはswitch文は書くしかないのも事実。
そのため、私は以下の条件を必ず守ってswitch文を書くようにしています。
・caseを書いたら次に書くのはbreak
 (breakで処理を抜ける必要がなくともまず書く。要らなければ後で消せばよい)
・case内の処理はなるべく関数にして、caseの中身が長くならないようにする。
・case内の処理は無名関数内にしか書かない。
それらを守るとこんな感じになります。

switch(a){
  case B:{
    boolean bool = true;
    break;
  }
  case C:{
    boolean bool = false;
    huga(bool);
    break;
  }
}

読みやすいの感覚は人それぞれあるかと思いますが、私はswitch文を書く際はこのようにして、上で述べた問題を回避しています。