jk-meets-js

恋に落ちるコード.js [技術系コメディ/短編/連載中]

This project is maintained by 8novels

恋に落ちるスイッチ -Do you love me, or not?-

「絵子、やる気スイッチを心ゆくまで押させてくれないか」
「何でだろう。セクハラにしか聞こえないのは何でだろう」

 放課後、|情報処理《JS》部の部室。
 |瀬尾絵子《せのおえこ》と|篠宮樹里《しのみやじゅり》の二人は相変わらず部活動に励んでいる。

「さて、今日はJavaScriptにおけるもう一つの条件分岐、switch文の話だ」
「あー、言ってたね、前回」
「switch文もif文と同様、条件式の評価に応じて処理を分岐したい時に使用する。ただし、分岐が多岐にわたる時にこそ、switch文はその真価を発揮する」
「まあ、二択だったらif文使え、っつー話だよね」
「switch文の動きは非常に単純だ。一つ目、上から順にcaseラベルに式が合致するかを評価し、|真《true》なら続く文を実行する。二つ目、break文に到達した時点で、switchブロックを抜ける。それだけだ」
「まあ、言っちゃうと確かにそれだけよねえ」
「では、よく使われる構文の例を提示してみよう」

var order;
switch (order) {
  case "ソースカツ丼":
    console.log("言わずと知れた福井のソウルフード。");
    break;
  case "玉子カツ丼":
    console.log("福井でカツ丼といえばソースカツ丼を指すため、玉子カツ丼と明確に注文する必要がある。");
    break;
  case "上カツ丼":
    console.log("福井では玉子カツ丼を上カツ丼と呼ぶこともある。上下関係を暗に認めている。");
    break;
  case "海鮮丼":
    console.log("越前がにや若狭ふぐの乗った贅沢な丼が食欲をそそる。");
    break;
  default:
    console.log("とりあえず腹に入れば何でもいい。");
}

「……お腹減ってるの? 樹里。パンかなんか買ってこようか?」
「いや、我慢する。この例の場合は、変数orderの値が、caseラベルの文字列と完全に一致した場合に直後の文を実行し、break文でswitchブロックを抜けるというパターンだ。非常によく使われる書き方だ」
「よく見るよねー」
「この例で特殊なのが最後のdefaultラベルだ。つまり、caseラベルのどれにも一致しなかった場合でも、この文は必ず実行される。もちろん、省略することも可能だ」
「絶対的守護神、って感じね」

「また、これはややトリッキーな記述法で賛否両論あるのだが……あえてbreak文を書かないことで、いくつかの条件に対して同じ文を実行する、という書き方もある。処理の流れが、すり抜けて落ちていくような様子からフォールスルー(fall through)と呼ばれる」
「フォールスルーって、落とされたりスルーされたり、なんかシンパシーを感じるわ。完全に字面のイメージだけで言ってるけど」
「ちなみにfall throughとは『失敗に終わる』という意味もあるそうだ」
「うん。なんかますます悲しくなってきた」
「とりあえず実例を挙げよう」

var order = "ソースカツ丼";
switch (order) {
  case "ソースカツ丼":
  case "玉子カツ丼":
  case "醤油カツ丼":
    console.log("とにかく今日は肉の気分。");
  case "海鮮丼":
    console.log("やっぱり魚もいいかも。");
}

「わかった。今日はもう切り上げようよ。ヨーロッパ軒行こ、ヨーロッパ軒」

 ヨーロッパ軒とは、福井県内に展開する洋食店。日本で初めてソースカツ丼を提供した老舗として知られる。JavaScriptにはあまり関係がない。

「いや、もう少しなら我慢できる……で、この例は、3つの条件に対して同じ動作をさせるパターン。そして、break文を書き忘れたパターンだ」
「あ、これ確かに、カツ丼頼んだのに魚の気分にもなってるね」
「今だったら両方食べられるけどな。それはさておき、この場合は海鮮丼の前にbreak文を書かないと、意図通り動作しない」
「うん」
「break文をあえて書かない記述法がいまいち歓迎されないのは、要はバグの温床となる、というデメリットが大きいからだ。意図があるのか単に書き忘れなのか、瞬時に判断しにくいのだ。現に、フォールスルー自体を認めていない言語もある」
「用途に応じてうまく使えばいいと思うんだけどねー」
「そう。ただし、なぜこう言う書き方にしたのか、他人にも容易に理解してもらえるよう、明確なポリシーを持って書くことが大事だ。それができないのなら、素直な書き方をした方がいい」
「んー、その通りだわ。肝に銘じます」 「ついでなので、さらに悪い例を挙げておこう」

var order;
switch (order) {
  default:
    console.log("最初に書くことも出来るんやざ。");
    break;
  case "ソースカツ丼":
    console.log("そんな事よりいっぺん食べてみねの。");
    break;
}

「こんな風に、default節を最初に書いてもいい。ただし、評価される順番が変わるわけではなく、あくまで最後に評価される。文法としてはエラーにならないが、非常に読みにくいコードの例だ」
「それより突然の福井弁が気になるんだけど」

 *

「さて、講義も終わったことだし、行こっか」
「ん?」

 陽はだいぶ傾いてきた。部室の外からは、野球部の活気に満ちた声が聞こえてくる。

「だから、お腹減ってるんでしょ?カツ丼、食べに行こうよ」
「ああ、しかしだな」

 樹里の返事には力強さがない。心なしか困ったような表情にも見える。

「どうしたの、いつものキレがないよ?」
「実を言うとだな、絵子よ」

 樹里は目を伏せたまま、バツが悪そうに呟く。

「そういう、寄り道とか買い食いなどと言うことをしたことがなくてだな。どうしていいか、わからないのだ」
「えええっ!」

 思わず身を乗り出す絵子。鞄からぶら下がったキーホルダーが大きく左右に揺れる。

「そんな女子高生、まだ居たんだ。その存在自体がシンタックスエラー吐くわよ」
「面目ない。そのカツ丼屋と言うのは、|一見《いちげん》さんが入っても大丈夫なのか? 一万円もあれば足りるのか?」
「どんだけ心配してんのよ……大丈夫、私がいるから。さ、樹里も早く帰り支度」

 と絵子はMacBookの蓋を閉じる。

「青春はコードの中になかりけり、ってね。ほら、行くよ?」

 と、樹里の手を引っ張る絵子。樹里は、やや照れ臭そうに頷いた。

 *

「……で、何で最後は青春モノみたいに締めようとしたんだ?」
「いーじゃんよぉー、たまにはこういうのやってみたかったのよぉ、恥ずかしいからツッコまないで」