if文の{}はどんな場合でも書くべきか?

JavaScriptでは, ifの{}は省略できます.

if (a > 10)
  foo();
else
  bar();
hoge();

if (a > 10) {
  foo();
} else {
  bar();
}
hoge();

と同じ.



ECMAScriptの定義では,

12 Statement
Statement:
  Block
  ...

12.1 Block
Block:
  { StatementList(optional) }
StatementList:
  Statement
  StatementList Statement

12.5 The if Statement
IfStatement:
  if ( Expression ) Statement else Statement
  if ( Expression ) Statement

みたいになってますね.

Statement → Block → {Statement Statement Statement Statement...}



よくある批判として, 上のhoge();が何処にあるのかというのがあります.

つまり,

if (a > 10)
  foo();
  bar();

は,

if (a > 10) {
  foo();
  bar();
}

になるんじゃないよ!!! ってことですね.

はいはい. そうですね.




さてさて, 前の記事にこんなコードを貼り付けました.

  function takeNext () {
    skipWhite();
    if (text === '') return EOF;
    if (token(text)) return RegExp.$1;
    throw 'Unexpected token. \n';
  }

エラーは長いのでちょっとカットしましたが, ここで, 上の意見とぶつかります.

「{}を書けよ! 読みにくいじゃないか!!!!!」


ここで主張します!

if ( Expression ) ReturnStatement; のパターンでは, {}を省略するほうが読みやすい.*1

今の時点では, 「returnする場合に限り」という意見です.


さっきのをきちんと書けば, こうなるの?

  function takeNext () {
    skipWhite();
    if (text === '') {
      return EOF;
    } else if (token.exec(text)) {
      return RegExp.$1;
    } else {
      throw 'Unexpected token. \n';
    }
  }

こっちのほうが見やすい? どうだろうね?

もしかしたら, returnのせいなのかもしれない...


===================


少し話はずれるかもしれないけど, こんな考えが前から私の中にあるかも.

素早くreturnすべし returnすれば, その後のコードを読む必要なし.

前の記事の, 下降再帰のコード

function calc (text) {
  var _text = text;
  var digit = /^((?:(?:0|[1-9][0-9]*)(?:\.[0-9]*|)|\.[0-9]+)(?:[eE][+-]?[0-9]+)?)/,
      white = /^(\s+)/,
      ans = expr();
  if (text) error();
  return ans;

  function expr () {
   ...

calcがどんな関数なのかは6行読めば分かる.


もしreturnが最後にあったら?

function calc (text) {
  var _text = text;
  var digit = /^((?:(?:0|[1-9][0-9]*)(?:\.[0-9]*|)|\.[0-9]+)(?:[eE][+-]?[0-9]+)?)/,
      white = /^(\s+)/;
  function expr () {
  ...
  }
  function term () {
  ...
  }
  function fact () {
  ...
  }
  function num () {
  ...
  }
  function next (s) {
  ...
  }
  function skipWhite () {
  ...
  }
  function error (m) {
  ...
  }
  var ans = expr();
  if (text) error();
  return ans;
}

どっちが分かりやすいか? 一目瞭然ですね.

素早くreturnすべし.



Chrome Player(まだこう呼んでる)のコードを引っ張ってくると, 同じ考えがちらほら見えてきました.

        $(window)
          .keydown(
            function (e) {
              switch(e.keyCode) {
                case 9: key.tab(e); return;
                case 13: key.enter(e); return;
                case 27: key.esc(e); return;
                case 32: key.space(e); return;
                case 33: key.pgup(e); return;
                case 34: key.pgdn(e); return;
                case 35: key.end(e); return;
                case 36: key.home(e); return;
                case 37: key.left(e); return;
                case 38: key.up(e); return;
                case 39: key.right(e); return;

breakじゃなくてreturn使ってらぁーーー

returnすれば, この後を読む必要なし!!!!!

switch文の後に, 共通した処理が必要で, returnしちゃいけない「場合」があるとすれば, それはその書き方が悪い.



どうなんだろうね? こういう事って, 未来の自分とも意見が食い違う気がする.

*1:この意見は, この記事を書いた時点の私の見解であり, 一ヶ月後, もしかしたら一週間後には意見を変えるかもしれない.