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出社(それ以外はリモートワーク)できる「デザイナー」「エンジニア」を募集しています。
興味のある方は、カジュアル面談しますので気軽にお問い合わせください!









