インターネット老人おぢさん

switch(true) でif-elseif-elseのようにcaseで条件を指定できる

最終更新:2021年03月08日 14時50分58秒(初公開:2021年03月08日 14時50分58秒

switch(true) でif-elseif-elseのようにcaseで条件を指定できる

それ、やっぱりif-elseif-elseでよくね?

正直、個人の解説読んで理解した内容です。
なんでこういう書き方をしたがるのか、私には理解できませんでした。
が、「if-elseif-elseを書かないで条件分岐できるね」という意味では良いのだろう、という理解です。

switch(true)にすると何が嬉しいのか?

段階を踏んで共通した処理をさせたい場合なんかは良いかも知れません。

// CoC-TRPGにおいて達成値でPLに渡す情報を制御したい
var judge = ( achievement, pc_param ) =>
{
  switch ( true )
  {
    // 成功順に情報を追加していく
    case achievement <= 5:
      console.log( "KP: クリティカルなので全部あげよう。ボーナス情報も考える" );
    case achievement <= pc_param / 5:
      console.log( "KP: 技能判定の場合はスペシャルだね" );
    case achievement <= pc_param:
      console.log( "KP: 成功だね" );
      break;


    case achievement >= 95:
      console.log( "KP: ファンブル!アクシデントが発生してしまった" );
    default:
      console.log( "KP: 失敗なので時間だけが過ぎてしまった" );
  }
}
judge( 10, 80 );

これをif-elseif-elseで書くとこうなります。

// CoC-TRPGにおいて達成値でPLに渡す情報を制御したい
var judge = ( achievement, pc_param ) =>
{
  // 成功順に情報を追加していく
  if ( achievement <= pc_param || achievement <= 5 ) // pc_paramの初期値が低いため5以下になる事は考えられる。これをクリティカルにする
  {
    console.log( "KP: 成功だね" );

    if ( achievement <= pc_param / 5 )
      console.log( "KP: 技能判定の場合はスペシャルだね" );
    if ( achievement <= 5 )
     // pc_paramが低い場合はスペシャルに該当しない事もあるので、ここに入ったらスペシャルの情報も出す
      console.log( "KP: クリティカルなので全部あげよう。ボーナス情報も考える" );
  } else
  {
    if ( achievement >= 95 )
      console.log( "KP: ファンブル!アクシデントが発生してしまった" );
    console.log( "KP: 失敗なので時間だけが過ぎてしまった" );
  }
}
judge( 10, 80 );

書き方の制約があるため直感的とは言いにくいですが、if-elseif-elseよりswitch(true)の方が読みやすいかな、という気がしますね。

この例では、成功した時の処理に追加でスペシャル判定、クリティカル判定というようにどんどん追加をしていく事で情報を増やしていくようなアプローチをしました。

switch(true)のいいところ探し

ぶっちゃけ、タイトルに書いたとおりなんですよ。
大体の場合、if-elseif-elseの方が良いことが多いです。

使おうと思ったら使えるけど、イディオムが分からない人が一人でもいるプロジェクト(そして、このケースがほぼ大半だろうなので)では使わない事を推奨します。
記事を書くために今理解しましたけど、実践で使われていたらキレそうになりますね…。

© 2020-2021のむらやごろう(@elder_uncle)

当サイトの全てのコンテンツを転載・無断での引用もお断りしています。