✍️

【長く使える】if文 の書き方: 判定と記述の順序で「早く && 綺麗に!」

2022/07/30に公開

はじめに

今回はif文に着目して、判定の順番分岐の順番綺麗な書き方の三つのポイントを解説します。

便利な関数や、処理の実装方法などは調べる人は多いと思いますが、意外と基本的な構文の書き方を意識する人は少ないと思います。

「書いたコードは長く残ります」
だからこそ、こういった細かい箇所にも意識を向けることで、開発者やレビュワーの方が喜ぶだけでなく、これから会社に入ってくる人にも喜んでもらえると思います。
また、この知識を頭の片隅に入れておくことで、他の言語でも流用できる箇所もあるため、エンジニア人生で長く使用することのできるスキルになります。

この記事では、if文をいかに早く綺麗に書くかに重点を置いて、解説させていただきます。

対象者

この記事は下記のような人を対象にしています。

  • プログラミング初学者
  • 駆け出しエンジニア
  • 綺麗にif文を書きたい方
  • なるべく早い処理を書きたい方

記事内のコードの規約

if文の書き方ですが、言語はphpで、以下のようにPSRの規約を準拠して書かせていただきます。

  • ifの後ろにスペースを記述
  • elseif, elseの前後にスペースを記述
  • 中括弧⇨{} は、if, elseif, elseと同じ行に記述
  • 最後の閉じカッコは必ず最後の次の行に記述

言語はphpですが、使用していない人でも読みやすいようにif文以外の構文はなるべく使用せず書かせていただきました!

判定の順序

turue or false, 数値がfooより大きいなどifでは様々な判定をしてその中の処理をするかを判定しています。

if (true or false && foo < bar) {
  // 上記の判定が正しい場合この中の処理をする
} else {
  // 正しくない場合はこの中の処理をする
}

ただ、この判定の順序ですが、||&&は必ず左の判定から行うというルールがあります。
ですので、少しでも処理を早くしたい場合は、true or falseなどのbool値で判定するものを左側に書き、関数などを呼ぶ処理は右の方に書くなど、処理の軽いもの順にすると、結果の算出が少しでも早くなります。

if内の処理の順序

if内の処理の順番ですが、厳密にルールが決まっているわけではないと思います。
なので、宗教論争が比較的に少なくなる順序のルールを書きだしてみました!

1. よく使用するケース順
多用するコードが上の方がその記述に行き着くまでの判定が少なくなるのと、コードを読むときも上から読むので、すぐに頻出するパターンのコードを見ることができます。

if (メインケース) {
} else if (サブケース) {
} else if (より特殊なケース) {
} else {
  // 例外
}

2. 行数が多いものはなるべく下に
if文を読むときは基本的に判定から読むことが多いです。
以下のように処理が長いものを下に書くと、スクロールしなくても、先にif文の判定を画面内で全て見通すことができるので、読み易さが格段に上がります。

if (判定) {
  // コード
} else if () {
  // コード
   // コード
} else if () {
  // コード
  // コード
  // コード
  // コード
  // コード
  // コード
  // コード
}

3. else if が多くなるならifを分ける
今回は年齢であるageしか判定に使用していないが、判定が多い場合、else ifを多く使用しすぎると、横にコードが長くなり、 else ifが多すぎるせいで直感的にコードを読むことが難しくなってしまいます。

if (age < 18) {
  // 処理1
} else if (age < 25) {
  // 処理2
} else if (age < 40){
  // 処理3
} else if (age < 65){
  // 処理4
} else if (age < 80){
  // 処理5
} else if (age < 90){
  // 処理6
} else if (age < 95){
  // 処理7
} else if (age < 105){
  // 処理8
}

returnを使用して処理を分けてあげると、別々でコードが読みやすくなり自分以外の人に親切なコードになる。

if(age < 18) {
  // 処理1
  return;
}
if (age < 25) {
  // 処理2
  return;
}
if(age < 40){
  // 処理3
  return;
}
if(age < 65){
  // 処理4
  return;
}
// 以下略

if文を綺麗にする

1. returnで終わる場合はelseを外に記述
関数内でif文を使用した場合、以下のようにインデントが長くなってしまう。
今回はまだインデントが少ないですが、ネストされたコードになっていくと、コードの可読性が落ちてしまいます。
そんなときはどうすればいいでしょう...

function foo() {
  if (hoge) {
    // 処理1
  } else {
    // 処理2
    // 処理2
    // 処理2
    // 処理2
    // 処理2
    // 長い...
  }
}

関数内でif文を使用している場合などで、elseの下に処理がない場合は、returnを使用して、 インデントを少なくすることができます。

if (hoge) {
  // 処理1
  return
}
// 処理2
// 処理2
// 処理2
// 処理2
// 処理2
// 長い...

以下のようにelseではなく、if文自体のインデントが気になる場合は...

if (hoge) {
  // 処理1
  // 処理1
  // 処理1
  // 処理1
  // 処理1
  // 処理1
  // 処理1
}

条件を反転して、returnで返してあげるとコードがすっきりしますね!

if (!hoge) {
  return
}
// 処理1
// 処理1
// 処理1
// 処理1
// 処理1
// 処理1
// 処理1

2. 条件に入る値が順番になっているものはswitch文
$hogeの値に入るものは、開発者側で想定しているものとします。
その場合、else if===を多用すると、判定自体はシンプルなのに余計な記述が多いせいで可読性が下がってしまいます。

if ($hoge === 1) {
  // 処理1
} else if ($hoge === 2) {
  // 処理2
} else if ($hoge === 3) {
  // 処理3
} else if ($hoge === 4) {
// 以下略

変数の値の変動を予想できる場合や、複数のチェックを行いたい場合は、以下のようにswitch文を使用した方が、判定が見やすくなります。

・「1 ~ hogeまでの範囲の値しか入ってこない」
・「すでに定数を用意しており、その定数に該当するかのチェックを行いたい」など

switch ($hoge){
  case 1:
    // 処理1
    break;
  case 2:
    // 処理2
    break;
  case 3:
    // 処理3
    break;
  case 4:
    // 処理4
    break;
  default:
    // いずれの値にも該当しない時の処理
}

3. そもそもif文を書かない
関数などでBool値を返すだけのためにifを使用するのは冗長な書き方になってしまいます。

if ($foo === $bar) {
    return true;
} else {
    return false;
}

ここは変数でtrue or falseを求めて、returnで返すことができます。

$hoge = $foo === $bar;
return $hoge

おわりに

今回はif文の判定書く順番綺麗な書き方を解説させていただきました。

特に、綺麗に書く方法に関してはまだまだパターンがあるので、追記もしていこうと思います。
他のパターンを知っている方は、「こんなパターンの場合は、この書き方がいいよ!」とコメントで教えて欲しいです!

コードを書いた次の日になった途端、「誰が書いたコードなんだ!?」となった経験は多かれ少なかれ開発者のほとんどの方が経験していると思います。
知っているだけでコードの可読性が上がり、周りの人だけでなく、明日の自分もハッピーになるなら知っておいて損はないですね!

コードのミスやtypoがあった場合は、教えてくださると本当に嬉しいです:)

Discussion