Atkiyama
@Atkiyama (Atkiyama)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

早期リターンでelseやelse ifを使ってはいけない理由がわからない

Q&A

Closed

解決したいこと

早期リターンについて

コードを早期にリターンする利点はググったりしてわかったがelseやelse ifを使ってはいけない理由がよくわからない

発生している問題・エラー

例えば以下の例を考えたときに

function validateUserInput(input) {
  if (!input) {
    console.log('入力がありません');
    return;  // 入力がない場合は早期リターン
  }

  if (typeof input !== 'string') {
    console.log('入力は文字列でなければなりません');
    return;  // 入力が文字列でない場合は早期リターン
  }

  console.log('入力は有効です');
  // ここで他の処理を続けることができます
}

こうではいけないのか

function validateUserInput(input) {
  if (!input) {
    console.log('入力がありません');
    return;  // 入力がない場合は早期リターン
  }

  else if (typeof input !== 'string') {
    console.log('入力は文字列でなければなりません');
    return;  // 入力が文字列でない場合は早期リターン
  }else{
    console.log('入力は有効です');
  }
  // ここで他の処理を続けることができます
}

教えていただけたら幸いです

0

6Answer

個人的な意見ですが、elseelse ifがあると 上(if)の条件を常に頭の片隅に置かなければならない という部分が好きではないため、早期リターンではelseelse ifを使わないことを心がけています。

  if (!input) {
    console.log('入力がありません');
    return;  // 入力がない場合は早期リターン
  }
  // 上の条件がFalseかつ、下の条件がTrueの場合
  else if (typeof input !== 'string') {
    console.log('入力は文字列でなければなりません');
    return;  // 入力が文字列でない場合は早期リターン
  }else{
    console.log('入力は有効です');
  }
  // ここで他の処理を続けることができます

elseelse ifは、「上の条件に当てはまらなかった場合」という条件を暗黙的に含んでいるため、elseelse ifの条件だけをみても処理が追いづらいというデメリットがあると思います。

ご指摘のようなコードでは「上の条件」が比較的簡単に見渡せるためこの問題は起こりにくいですが、if節が長くなっている場合、

  1. else if (typeof input !== 'string') : inputがStringでない場合のハンドリングか?
  2. あ、でもelse ifだから上のif節でキャッチされなかった場合かつ、inputがStringでない場合のハンドリングか?
  3. 上のif節の条件ってなんだったかな〜?

というように、再度上の条件を確認する必要が出てくるかもしれません。

else if がない場合、各条件は独立したif節となるため、「上の条件」を気にする必要がなくなります。

上記から、私は早期リターンではelseelse ifをなるべく使わないようにしています(ロジック上どうしても必要になるときもありますが)

2Like

Comments

  1. @Atkiyama

    Questioner

    @TANATY
    確かにいちいち追っていかなきゃならないのは面倒ですね!
    ものすごく腑に落ちました!
    ありがとうございます!

JavaScript の話ですか? であれば質問欄を編集、もしくはタグをつけるなどして情報の追加をお願いします。

「他の処理」というのは何ですか? それによって話が違ってくると思いますが。たとえばそれが 2 つの if 文による検証 OK だった時に行う処理であれば return なしで以下のようにしてもよさそうですが?

function validateUserInput(input) {
  if (!input) {
    console.log('入力がありません');
  }
  else if (typeof input !== 'string') {
    console.log('入力は文字列でなければなりません');
  }else{
    console.log('入力は有効です');
    // 他の処理
  }  
}
0Like

Comments

  1. @Atkiyama

    Questioner

    @SurferOnWww
    すみませんが一応以下のような意図があります

    • 例に使っているのは確かにJSなんですが質問の内容そのものは特に言語に依存するものでもないので一旦つけていません
      • 早期リターンという可読性を上げるテクニックの一般論についてお伺いしたい質問です
    • 具体的なケースについて困っているというよりは一般的に早期リターンでelse ifとかelseは使われていないケースがその理由が知りたいです

    その上でそうしたほうが宜しければ改めて教えていただければ幸いです

  2. そもそもはタイトルにある、

    早期リターンでelseやelse ifを使ってはいけない理由

    の話だったはずで、

    早期リターンという可読性を上げるテクニックの一般論

    の話ではなかったはずですが???

    一般的に早期リターンでelse ifとかelseは使われていないケースがその理由が知りたいです

    という話に限れば、上の回答に述べた通り return は不要だからです。これで答えになっていると思いますけど。

    if ... return にするか if ... else if ... else どちらにするかは、質問者さんが組織に属して開発を行っているなら、組織内で話し合ってコーディングルールを決めて、質問者さんが気に入らなくても、それに従うという話になると思います。

    保守なども含めて質問者さん以外が関わることがないなら、自分の好きに決めればいい話だと思います。

return文で function関数を脱出することになるので elseを書く意味がないので
「やってはいけない」ではなく「意味がない」ということでは?

else if だと引数input が1つですがこれが2つ3つになると複雑になりますよね?

0Like

Comments

  1. @Atkiyama

    Questioner

    @vram
    コメントで書いてるだけですが一応ifのチェックをクリアできたらその後の処理がある想定なので意味はあるかと思います

    else if だと引数input が1つですがこれが2つ3つになると複雑になりますよね?

    すみませんこれに関してはよく理解できていません
    else ifをifと書くことぐらいしか差がないように思えてしまいます

早期リターン自体は深いネストを避けるのに有効なテクニックですが、elseやelse ifを使わないまで行くのは、さすがに行き過ぎかなと思います。

特定の変数に対して複数の条件判定を行うなら、else ifを使った方が、前後の条件判定と関連性があるとわかりやすいです。また、良くも悪くもif文とif文の間に別の処理が割り込む事が可能です。(だからelseやelse if使えと主張するつもりもないですが)

所詮コーディングスタイルの宗教論的な話なので、ルールで決まっているのでなければ、読みやすければどちらでも好きにしてくれればいいとは思いますが。使おうが使うまいが、読みやすいソースを書く人のソースは読みやすいです。
何事も行き過ぎたルール・主張は柔軟性を損なうので、ほどほどが良いと思います。

0Like

else ifをたくさん並べると「このelseはどのifに対するelseなのか」がすっごくわかりにくくなります。
一部だけelseが抜けてたり{}のペアがずれていたりすると見つけ出すのにけっこうな時間と労力を消費します。
elseをつけなければ、その前にある早期リターンのブロックは後ろのコードに影響を与えないことが明確になるので気にする必要はなくなります。

言い換えるとelseをつければコードを書く人やチェックする人の脳みそを余分に消費してしまうので、大した理由もなしにつけるのは迷惑でしかないです。

0Like

早期リターンのメリットではなく、早期リターンとif else, elseをなぜ組み合わせてはいけないのかという旨の質問と理解し、回答します。

以下の二つコードは同じ処理になります。
後者の早期リターンパターンのほうが無駄な記述がなく、可読性が高いので推奨されています。
ifやif else、elseが多いソースコードの処理をトレースするには結構脳のリソースを使います。なので、多くのエンジニアは極力避けたいという気持ちが働き、if elseを忌避する傾向があります。

処理上は別段問題ないので、if elseを使うほうが好き、分かりやすいということであれば使えばいいと思います。
ただ多くの人は可読性が高い早期リターンパターンを書くと思います。

冗長パターン

function validateUserInput(input) {
  if (!input) {
    console.log('入力がありません');
    return;  // 入力がない場合は早期リターン
  }

  else if (typeof input !== 'string') {
    console.log('入力は文字列でなければなりません');
    return;  // 入力が文字列でない場合は早期リターン
  }else{
    console.log('入力は有効です');
  }
  // ここで他の処理を続けることができます
}

早期リターンパターン

function validateUserInput(input) {
  if (!input) {
    console.log('入力がありません');
    return;  // 入力がない場合は早期リターン
  }

  if (typeof input !== 'string') {
    console.log('入力は文字列でなければなりません');
    return;  // 入力が文字列でない場合は早期リターン
  }
  console.log('入力は有効です');
  
  // ここで他の処理を続けることができます
}
0Like

Your answer might help someone💌