一問一答コーディング問題「switch case文」【基本構文】

こんにちは、@codeship_techです。

今回は以前2回ほど投稿している、一問一答コーディング問題です。

皆さんの脳味噌と対話できるインタラクティブな記事なので、ぜひ読んで問題を解いてみてください。

易しめです!

前回の問題はこちら↓

次のif else構文を、要件に従ってswitch case構文で書き直してください。
(難易度:★☆☆☆☆)

要件
  • 今日の日付から、曜日の数値を取得する
  • 曜日に応じて、日本語を出力する(例:「今日は火曜日です。」)
  • もしdayにそれ以外が代入されていたら、エラーを出力するjavascript
javascrpit
const day = new Date().getDay();
let dayStr = "";
if(day == 0){
  dayStr = "日";
}else if(day === 1){
  dayStr = "月";
}else if(day ===2){
  dayStr = "火";
}else if(day ===3){
  dayStr = "水";
}else if(day ===4){
  dayStr = "木";
}else if(day ===5){
  dayStr = "金";
}else if(day ===6){
  dayStr = "土";
}else{
   console.log("error");
}
console.log(`今日は${dayStr}曜日です。`)























正解

const day = new Date().getDay();
let dayStr = "";
switch(day){
 case 0:
   dayStr = "日";
   break;
 case 1:
   dayStr = "月";
   break;
 case 2:
   dayStr = "火";
   break;
 case 3:
   dayStr = "水";
   break;
 case 4:
   dayStr = "木";
   break;
 case 6:
   dayStr = "金";
   break;
 case 6:
   dayStr = "土";
   break;
 default:
   console.log("error");
   break;
}
console.log(`今日は${dayStr}曜日です。`)

switch case文

今回のように、ある変数がどの値であるかを比較してtrue or falseを決め、処理内容を分岐させる場合には、if elseよりswitch caseの方が、書きやすく読みやすかったりします。

読みやすい

if elseについてはtrue or falseで判定できる式を全て分岐条件にできるため、分岐条件に非常に複雑な式をかけたりします。

switch case文では単純な値の比較しか行えません。

ですが今回のように、「日月火水木金土」の決められた値の範囲の中から特定するといった状況では、switch case文は一目見ただけで「値の比較を行っている」ことが容易に理解でき、読解スピードの助けになります。

修正しやすい

例えばday という変数名を、dayNumに変更したくなったとします。

if else構文ではdayという変数名を、各判定条件の中で用いているので、初めの定義1回と比較7回、最後の出力1回を合計して9箇所もの修正が必要になります。

switch caseでは比較する変数であるdayを、構文内ではじめの1回しか書いていないので、dayという変数名を変えたくなったときにも修正が3箇所で済みます。

処理は遅い

しかしだからと言って積極的にswitch caseをif の代わりに使うことはオススメしません。

switch caseはifに比べ、処理が遅いです。

今回のようにプログラム内で一回限りの比較であれば無視してよいレベルの速度差ですが、もし何百何万ものループの中で逐一値の比較を行うのであれば、ifを使うようにしましょう。

今回の課題の逆を言えば、switch caseで書けるものは全てif elseで記述することができるということです。

どちらの形式でもスムーズに理解できるようにしましょう。

他の一問一答コーディング問題はこちら

授業日記についてのご意見

CodeShipの授業について「こんな事が知りたい・紹介して」というご意見・ご提案がありましたら、CodeShip公式Twitterアカウント(【CodeShip】プログラミングスクール)までDMまたはリプライにてお寄せください。パネル