フルスタックエンジニアのノウハウ
2020.01.10    2020.02.25

【プログラミング】条件分岐はif文、switch文を使い分けろ

【プログラミング】条件分岐はif文、switch文を使い分けろ

こんにちは、徳田です。

今回は、プログラミングの「条件分岐処理」についてご説明します。

条件分岐処理は、前回ご説明した「ループ処理」と並んで、プログラミングには無くてはならないものです。

前回、「ループ処理はWebサービス全体のソースコードの8~9割には登場する」と紹介しましたが、条件分岐処理はなんとそれ以上です。

実際のソースコードはこのように、条件分岐だらけです。


条件分岐処理とは、どのようなもので、実際どのように使われるのか、実例を交えながら分かりやすく説明していきたいと思います。

それから、現場では当たり前に行われている豆知識もお話していますので、ぜひ最後までお読みください。

この記事で分かること


・プログラミングの条件分岐処理とは何かを知ることが出来ます。
・Webサービスではどのように条件分岐処理が使われているのか実例を知ることが出来ます。
・プログラマーなら当たり前な現場での考え方や知識。

【目次】
  • ・結論から言うと
  • ・条件分岐処理とは
  • ・実例
  • ・現場の知識①②


結論から言うと

条件分岐は、その名の通り「条件によって処理を分けたいとき」に使う。

実際のソースコードは、条件分岐だらけになる。


ソース内にコメントを書いておけば後から見たときに分かりやすい。


条件分岐処理とは


プログラムを書いていると、「こういう場合はこの処理」「別の場合はこの処理」というように、条件によって処理を分けたいときがあります。

例えば、

①ログインしてたら→HOMEを出す
②ログインしてなかったら→ログイン画面に飛ばす

①在庫があるなら→残り在庫数を出す
②在庫が0なら→売り切れという表示を出す

ログインしている人が
「①男性の場合」→男性向けおすすめ商品を表示する
「②女性の場合」→女性向けおすすめ商品を表示する
「③不明の場合」→ユニセックスおすすめ商品を表示する

このような場合に使うのが「条件分岐処理」です。


条件分岐には「if文(イフ)」「switch文(スイッチ)」という2種類があります。

if文

上から順番に条件を判定していき、条件が合致した時点で指定の処理を実行します。


①もし○○○なら
 →処理Aを行う

②もし△△△なら
 →処理Bを行う

③もし×××なら
 →処理Cを行う

④それ以外なら
 →処理Dを行う



if文は、どれかの条件に合致するとそれ以降の条件判定は行いません。


switch文

あるデータに対して複数の値をチェックしたい場合に便利です。


もし変数Aの中身が
 →①1なら
 →②2なら
 →③3なら



1つのデータ(上の例だと変数A)に対して多くの比較値で条件分岐する場合には、if文よりもswitch文の方が簡潔に書くことが出来ます。

if文はどのような条件分岐でも記述することが出来ますが、switch文で書いた方がソースコードの処理や可読性が簡潔になる場合はswitch文を使うといったように、用途によって使い分けましょう。

実例


実際のWebサービスでは、例えば「メールアドレスの入力チェック」を行うような場合に使います。

ログイン画面にメールアドレス入力欄があり、ユーザーが入力したメールアドレスが「未入力でないか」「正しい形式で入力されているか」「文字数が長すぎないか」といったチェックを行うような場合です。


// メールアドレスの入力チェック
if (empty($user_email)) {
$err['user_email'] = 'メールアドレスを入力して下さい。';
} else if (!filter_var($user_email, FILTER_VALIDATE_EMAIL)) {
$err['user_email'] = 'メールアドレスが不正です。';
} else if (strlen(mb_convert_encoding($user_email, 'SJIS', 'UTF-8')) > 200) {
$err['user_email'] = 'メールアドレスは200字以内で入力して下さい。';
}



ちなみにif文では、最初の条件は「if」2個目以降「else if」という形で条件指定する決まりになっています。

ちなみに、メールアドレスの形式チェックは「@が付いているか」「ドットが適切な位置に付いているか」などといった形で様々なチェックを行わなければならないのですが、これを1発でチェックしてくれる「filter_var」というPHPの標準ファンクションがあります。

ファンクション
についてはこちらの記事で詳しく説明しています。
https://blog.senseshare.jp/function-programming.html


次は、switch文の実例です。

これは画面からファイルをアップロードした際の処理です。


switch ($_FILES[$attr_name]['error']) {
    case UPLOAD_ERR_OK: // 処理成功
        // 成功時処理
        break;

    case UPLOAD_ERR_NO_FILE: // ファイル未選択
        // エラー処理
        throw new RuntimeException('ファイルが選択されていません。');

    case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
        // エラー処理
        throw new RuntimeException('ファイルサイズが大きすぎます。');

    default:
        // どの条件にもマッチしない場合の処理
        throw new RuntimeException('エラーが発生しました。');
}

このように、1つのデータに対して複数の値をチェックしたいような場合はswitch文が向いています。


もし上記の処理をif文で書いたとしたら、以下のようになります。


if ($_FILES[$attr_name]['error'] == UPLOAD_ERR_OK) {
    // 成功時処理
    break;

} else if ($_FILES[$attr_name]['error'] == UPLOAD_ERR_NO_FILE) {
    // エラー処理
    throw new RuntimeException('ファイルが選択されていません。');

} else if ($_FILES[$attr_name]['error'] == UPLOAD_ERR_FORM_SIZE) {
    // エラー処理
    throw new RuntimeException('ファイルサイズが大きすぎます。');

} else {
    // どの条件にもマッチしない場合の処理
    throw new RuntimeException('エラーが発生しました。');
}



条件式に毎回、「$_FILES[$attr_name]['error'] == 」と書かなければならず面倒だし、ソースコードも見づらいですよね。

こういった場合はswitch文が向いています。

現場の知識①


プログラミングしていると条件分岐処理は必ず出てきますが、多く使い過ぎると後からソースコードを見たときに、自分でも何をやっているのか訳が分からなくなります。

誰がソースコードを見ても分かりやすいように、条件分岐処理は出来るだけシンプルに書くように心がけましょう。

どうしても複雑な条件を書かなければならない場合は、ソースコード内の条件式の部分に「意図」や「目的」をコメントとして細かく書いておきましょう。

現場の知識②


実際の開発でif文を書く際、例えばログインチェック処理などで


if (ログインしていたら) {
 HOME画面へ遷移する
} else if (ログインしていなかったら) {
 ログイン画面へ遷移する
}



普通に考えるとこのような条件式になるのですが、人間というものは必ずミスを犯すもので「バグ」というのは常に発生する前提で考えておく必要があります。

また、不正アクセスなどにより何か想定外のデータが入ってくる可能性もあるかもしれません。

万が一、条件式に漏れがあった場合、上記の形だと「どちらの式にも当てはまらない」ことが発生してしまうかもしれません。

そうすると、処理が先に流れてしまい、思わぬ挙動が発生してしまうかもしれないので、こういった場合は以下のように書いておきます。


if (ログインしていたら) {
 HOME画面へ遷移する
} else (それ以外なら) {
 ログイン画面へ遷移する
}



これなら、もし条件式にバグがあったり、不正なアクセスが行われた場合であっても「それ以外なら」に必ず入るので、ログイン画面に遷移させることが出来ます。

プログラマーの想定外の事が起こっても、おかしな挙動が起こらないよう、elseを活用します。(想定外が発生しても問題無い方の処理をelseにしておきます。)

こういったところを意識することで、出来るだけバグの少ないプログラムが書けるようになっていきます。

まとめ


条件分岐は、その名の通り「条件によって処理を分けたいとき」に使う。
条件分岐が複雑になる時は、ソース内にコメントを書いて分かりやすくする。
バグが発生する前提で、elseを使ってリスクを軽減する。

条件分岐処理を使いこなすことで、複雑な処理を実現することが出来るようになります。

上記のような点に気をつけて、上手に使いこなしていきましょう!

おすすめ記事
無料メルマガ配信中