ESLint の indent ルールと switch case、あと emacs の javascript-mode

関係ないが C/C++ 経験者は switch ~ case に数値以外を書けるとちょっと無駄に感動する。

C/C++、java のケースでも結構悩んでた気がするんだけれど、その C/C++、java でのワタシのスタイルは「悩んだ結果」確定していたわけなのよ:

 1     switch (zzz) {
 2         case 1: {
 3             // ...
 4             break;
 5         }
 6         case 2: {
 7             // ...
 8             break;
 9         }
10         default: {
11             break;
12         }
13     }

break が視覚的に埋もれてしまうことは難だったのだけれど、emacs のスタイルとの親和性は問題ないし、javascript と違ってやっぱり基本的に block を細かく作っていきたいわけ。だから case, default の個々の分岐に「必要なくても必ずブロックを作る」というのが、C/C++、java るときのワタシの定型スタイルだった。(各分岐が 1行のうちはいいのだが、3行超えるだけでブロックで囲まないと読みにくくなる、という「読むほう」の都合ももちろんあるが、一番期待していたのは当然「変数の局所化。)

で、当たり前のことなんだけれどこの「case ごとにブロック」のスタイルは「各ラベルが switch より一つ深いインデント」でないと非常に困ったことになって、つまり:

 1     switch (zzz) {
 2     case 1: {
 3         // ...
 4         break;
 5     }
 6     case 2: {
 7         // ...
 8         break;
 9     }
10     default: {
11         break;
12     }
13     }

これは最悪でしょう、「誤解を招く」というレベルじゃない。何がどう終了してるのかさっぱりわからなくなる。なので「ブロックを作る」のとこのインデントは「不可分」な戦略なわけだね。

で、この「switch と case, default」の深さを揃えるのか揃えないのかについて、w3schools なんぞを見ても、ワタシと同じスタイルの方が主流のように見えるのよ。けれども、ESLint も emacs もどちらも、「揃える」方なんだよね。(実は先に emacs の方で困ってて、ESLint してみてから emacs が ESLint と同じだと知った。)

じゃぁどうするか? については、どうせ javascript では function scoping なのだから、C/C++, java で必要だった「ブロックを都度作る」こだわりの方を捨てちゃおうか、と:

 1     /** emacs を騙してまでこれにこだわるのではなく…
 2     switch ($("#node-finder-target-node").val()) {
 3         case "anime": {
 4             selecter = "node.a";
 5             break;
 6         }
 7         case "chara": {
 8             selecter = "node.v";
 9             break;
10         }
11         default: {
12             break;
13         }
14     }
15     **/
16     /** こだわりの方を捨ててこうしちゃいなよ: **/
17     switch ($("#node-finder-target-node").val()) {
18     case "anime":
19         selecter = "node.a";
20         break;
21     case "chara":
22         selecter = "node.v";
23         break;
24     default:
25         break;
26     }

switch と case が同じカラムに並ぶのを「読みやすい」と思うかどうかは単に慣れであろう。