ガード節のご利用は計画的に

ガード節のご利用は計画的に


ガード節(Early Return)は便利なテクニックですが、使いすぎると逆に読みにくくなることも。手段と目的を混同しないための考え方を整理します。

はじめに

プログラミングのコードレビューをしていると、たまに「ガード節が目的になってしまったコード」に出会うことがあります。

ガード節はEarly Return(早期リターン)の1つのテクニックです。

ネストを減らし、正常系の処理を見やすくできるため、多くのコーディング規約や解説記事でも推奨されています。

しかし、だからといって「とにかくガード節を使えば読みやすくなる」というわけではありません。

今回は、ガード節との付き合い方について考えてみます。

ガード節とは

例えば以下のようなコードです。

function updateUser(user: User | null) {
  if (!user) {
    return;
  }

  if (!user.email) {
    return;
  }

  saveUser(user);
}

前提条件を満たさない場合に早めに処理を終了させることで、後続の処理をシンプルにできます。

ネストも減るため、一見すると非常に読みやすく見えます。

Early Return

その名の通り、関数から早く返すテクニックです。

ガード節はその1つで、他にエラー処理や正常系でも早く返すパターンはあります。

ちなみにリーダブルコードでも紹介されています。

日本語訳版では、returnを複数書いてはいけないと考えている人を「アホくさ」と評し、早期リターンで解消することを推奨しています。

ガード節が効果を発揮するケース

例えば入力チェックです。

function createOrder(order: Order | null) {
  if (!order) {
    return;
  }

  if (order.items.length === 0) {
    return;
  }

  processOrder(order);
}

このような「異常系を先に排除する」ケースでは非常に有効です。

正常系の処理が左に寄り、コードの見通しも良くなります。

ガード節を使うことが目的になってしまう

問題はここからです。

「とりあえずガード節にしよう」と考えていないでしょうか。

結果として、条件の意味が分かりにくくなることがあります。

例えばこんなコードです。

if (!user) {
  return;
}

if (!user.isActive) {
  return;
}

if (user.isDeleted) {
  return;
}

if (!user.hasPermission("admin")) {
  return;
}

showAdminPage();

一つ一つは単純です。

しかし、コードを読む側は「結局、どういう条件なら管理画面が表示されるの?」を頭の中で逆算しなければなりません。

普通のif文の方が伝わることもある

同じ処理を次のように書くこともできます。

if (user && user.isActive && !user.isDeleted && user.hasPermission("admin")) {
  showAdminPage();
}

こちらの方が、「管理画面を表示する条件」が一目で分かります。ただし条件が多くなると、やはり読みにくさが出てきます。そういった場合は、条件そのものに名前を付けるのが有効です。

ガード節は万能ではない?

ネストは悪、ガード節は正義のような文脈で語られることがあります。

しかし実際には、

  • 条件の意味が明確になるか
  • コードを読む人が理解しやすいか

の方が重要です。

ネストが1段増えることよりも、ビジネスロジックの意図が分からなくなる方が問題です。

条件が増えたら名前を付ける

条件が複雑になってきたら、ガード節かどうかではなく、条件そのものに名前を付けた方が読みやすくなります。

const canAccessAdminPage =
  user && user.isActive && !user.isDeleted && user.hasPermission("admin");

if (!canAccessAdminPage) {
  return;
}

showAdminPage();

あるいは、関数化する。

if (canAccessAdminPage(user)) {
  showAdminPage();
}

重要なのは「returnを増やすこと」ではなく、「意図を伝えること」です。

まとめ

ガード節は優秀なテクニックです。

ただし、それはあくまで読みやすさを向上させるための手段であり、目的ではありません。

経験上、

  • ガード節を使うことが目的になっている
  • ガード節を並べることで条件の全体像が見えなくなっている
  • 普通のif文の方が意図が伝わる

というコードは少なくありません。

「ネストを減らしたい」ではなく、「次に読む人が理解しやすいか」を基準に選択するのが良いと思います。

ガード節は便利ですが、使いすぎると逆に可読性を下げることもあります。

また、周りのコードと違うことをすると無駄にレビューで精神と体力をすり減らすことになる可能性があるので、我を出しすぎないことも大切と思います。