パスワードを忘れた? アカウント作成
10830046 journal
日記

kawa-tの日記: 余計なelseは書かない 6

日記 by kawa-t

if (condition1) {
  ...
  return v;
} else if (condition2) {
  ...
  return w;
} else if (condition3) {
  ...
  return x;
} else if (condition4) {
  ...
  return y;
} else {
  ...
  return z;
}

と書くよりも

if (condition1) {
  ...
  return v;
}
 
if (condition2) {
  ...
  return w;
}
 
if (condition3) {
  ...
  return x;
}
 
if (condition4) {
  ...
  return y;
}
 
...
return z;

と書いた方が、各分岐の後に必ずreturnがあるのが分かりやすいということに、今さらながら気が付いた。

特にネストしていた場合、elseを使っていると、閉じ括弧が連続してしまうから、それぞれのネストのレベルで必ずreturnするのかをチェックするのが面倒だが、elseを使わなければ、閉じ括弧が連続しないので、それぞれのブロックの末尾にreturnがあることだけを確認すればいい。

逆に言えば、returnがないことも分かりやすくなるので、複雑な処理を簡潔に書きやすくなる。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2014年04月15日 1時32分 (#2582164)

    私は,余計なif文は書かない,という方針です.

    具体的には,
    単純な処理なら switch/case 文を使う
    複雑な場合は stateパターン を使う
    ようにしています

  • by Anonymous Coward on 2014年04月15日 8時18分 (#2582243)

    誤って、途中の returnを消さない前提なら問題ないですね。
    昔なら、コメントを if 文毎に書きたくない(いや、書きたい)とかで
    else で連ねたものですが、というか、そのチームのコード規約に殉じたというか。

    ぱっと見、疑問を持たなくて済むコードなら何でもいいかと。

    • by Anonymous Coward

      前者はreturnを忘れた場合returnが無いパスがあると警告が出てelseを忘れた場合は動作が変わらない
      後者はreturnを忘れた場合動作が変わる
      明らかに前者が安全

      • by kawa-t (37052) on 2014年04月16日 0時45分 (#2582785) 日記

        コメントありがとうございます。

        if文がネストしていない場合は確かにそうなんですが、ネストしていて外側に続きの処理があった場合には、returnを書き忘れたとしても警告を出してくれません。ネストしていた場合でも、ブロックの最後に必ずreturnが来ることで、そのブロックの処理には続きがないことを明確にすることが狙いです。

        親コメント
  • by Anonymous Coward on 2014年04月15日 12時22分 (#2582358)

    個人的には、処理が同じグループかどうかで書き方を変えたい。ようするに、

    「if と else if, else は同じ判定の別バージョンである」 → 前者
    「if と else if, else はたまたま一つの文として書けるが判定対象は異なる」 → 後者

    としたい。例をあげると

    if (empty($input)) {
            return false;
    } else if ($input === 'invalid') {
            return false;
    }

    なら、両方とも同じバリデートの判定なので一つにまとめてもよい。

    if (empty($input)) {
            return false;
    }

    if ($input != ADMIN_ID) {
            return false;
    }

    はバリデートと権限チェックかなんかの別の判定なので2つに分けたい。

typodupeerror

アレゲは一日にしてならず -- アレゲ見習い

読み込み中...