コードを読みやすくする「早期リターン」と「ガード節」とは?

西山秀治 / 2025年10月3日

UX / UI のデザインに強いWebシステムの開発と、BtoB Webマーケを支援するWeb制作を提供するN’s Creates (エヌズクリエイツ) 株式会社の西山です。

PHPコードが劇的に読みやすくなる!「早期リターン」と「ガード節」をマスターしよう

「良いコード」とは何でしょうか?もちろん、正しく動作することが大前提です。しかし、それと同じくらい重要なのが「コードの読みやすさ」「メンテナンスのしやすさ」です。半年後の自分や、チームの他のメンバーが読んだときに、すぐに意図が理解できるコードは、プロジェクト全体の生産性を大きく向上させます。

この「読みやすさ」を劇的に改善するテクニックの一つが、今回ご紹介する「早期リターン(Early Return)」「ガード節(Guard Clause)」です。このテクニックを身につけるだけで、ネストが深い「矢印コード」を撲滅し、クリーンで理解しやすいコードを書けるようになります。


問題提起:ネストが深すぎる「矢印コード」

まず、よくある「あまり良くない」コードの例を見てみましょう。ユーザー情報を更新する、というよくある処理です。


<?php
function updateUserProfile(array $user, array $data): bool
{
    // ユーザーが存在するかチェック
    if ($user) {
        // 更新データが空でないかチェック
        if (!empty($data)) {
            // バリデーションチェック
            if (isValid($data)) {
                
                // --- ここがメインの処理(Happy Path) ---
                echo "ユーザープロファイルを更新します...\n";
                // $userに$dataをマージするなどの更新処理
                // ...
                // データベースに保存
                save($user);
                echo "更新が完了しました。\n";
                return true;
                // ------------------------------------

            } else {
                echo "エラー: データが不正です。\n";
                return false;
            }
        } else {
            echo "エラー: 更新データがありません。\n";
            return false;
        }
    } else {
        echo "エラー: ユーザーが存在しません。\n";
        return false;
    }
}

// ダミー関数
function isValid(array $data): bool { return true; }
function save(array $user) {}

このコードの問題点は何でしょうか?

  • if-elseが何重にもネスト(入れ子)になっていて、右側にどんどんコードが伸びていき、矢印のような形( Arrow Code )になっています。
  • 本当に実行したいメインの処理(ハッピーパス)が、深いインデントの中に埋もれてしまっています。
  • 条件分岐が複雑に見え、コードを読む際に頭の中で「このifのelseはどこだ?」と探す必要があり、認知負荷が高いです。

このようなコードは、バグの温床になりやすく、機能追加や修正も困難になりがちです。


解決策:「ガード節」による早期リターン

この問題を解決するのが「ガード節」です。ガード節とは、関数の冒頭で不正な値や異常な状態をチェックし、条件を満たさない場合はすぐに処理を中断して関数を抜ける(早期リターンする)という書き方です。

まるで、イベント会場の入り口にいる警備員(ガードマン)が、入場資格のない人をその場で帰すようなイメージです。資格のある人だけが、会場の奥(メインの処理)に進むことができます。

先ほどのコードを、ガード節を使ってリファクタリングしてみましょう。


<?php
function updateUserProfileWithGuard(array $user, array $data): bool
{
    // ガード節1: ユーザーが存在しない場合は、即座にreturn
    if (!$user) {
        echo "エラー: ユーザーが存在しません。\n";
        return false;
    }

    // ガード節2: 更新データが空の場合は、即座にreturn
    if (empty($data)) {
        echo "エラー: 更新データがありません。\n";
        return false;
    }

    // ガード節3: バリデーションに失敗した場合は、即座にreturn
    if (!isValid($data)) {
        echo "エラー: データが不正です。\n";
        return false;
    }

    // --- ここからがメインの処理(Happy Path) ---
    // すべてのチェックを通過したので、安心して処理に集中できる
    echo "ユーザープロファイルを更新します...\n";
    // $userに$dataをマージするなどの更新処理
    // ...
    // データベースに保存
    save($user);
    echo "更新が完了しました。\n";
    
    return true;
    // ------------------------------------
}

// ダミー関数
function isValid(array $data): bool { return true; }
function save(array $user) {}

いかがでしょうか?変更後のコードは、ネストが一切なくなり、非常にスッキリしました。このコードには以下のようなメリットがあります。

  • 圧倒的な読みやすさ: インデントが浅く、上から下へ素直にコードを読み進めることができます。
  • 関心の分離: 関数の前半に「前提条件のチェック(エラー処理)」がまとまり、後半に「メインの処理」が来る形になり、コードの役割が明確になります。
  • 認知負荷の軽減: 複雑なelseブロックの対応を考える必要がありません。条件に引っかかればその場で処理が終わる、とシンプルに考えられます。
  • メンテナンス性の向上: 新しいチェック項目を追加したい場合も、ガード節を一つ追加するだけで済み、既存のロジックを大きく変更する必要がありません。

どんな時に使う?ガード節の使いどころ

ガード節は、特に関数やメソッドの先頭で、以下のような前提条件をチェックする場合に非常に有効です。

  • 引数の検証: nullでないか、空の配列でないか、期待する型であるかなどをチェックする。
  • オブジェクトの状態確認: 処理を実行する前に、オブジェクトが適切な状態(例: ユーザーがログイン済みか)であるかを確認する。
  • 権限チェック: ユーザーがその操作を行う権限を持っているか(例: 管理者権限があるか)をチェックする。
  • リソースの存在確認: ファイルやデータベースのレコードが存在するかをチェックする。

基本的には、「この条件を満たさなければ、この先の処理は一切無意味」というケースで積極的に使っていくと良いでしょう。


まとめ

今回は、PHPのコードをクリーンにする「早期リターン」と「ガード節」のテクニックについて解説しました。

ネストされたif-elseは、ガード節を使って早期リターンに書き換える。

たったこれだけのシンプルなルールですが、実践するだけでコードの可読性とメンテナンス性は劇的に向上します。最初は少し慣れないかもしれませんが、意識して使い続けることで、自然と質の高いコードが書けるようになります。

ぜひ、あなたの次のコードからこのテクニックを取り入れて、自分にとってもチームにとっても優しい、クリーンなコードを目指してみてください!

UX / UI のデザインに強いWebシステムの開発と、BtoB Webマーケを支援するWeb制作を提供する
N's Creates 株式会社は、神戸三宮オフィスまで週1出社(それ以外はリモートワーク)できる「デザイナー」「エンジニア」を募集しています。

興味のある方は、カジュアル面談しますので気軽にお問い合わせください!

同じテーマの記事