ガード節のご利用は計画的に
ガード節(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文の方が意図が伝わる
というコードは少なくありません。
「ネストを減らしたい」ではなく、「次に読む人が理解しやすいか」を基準に選択するのが良いと思います。
ガード節は便利ですが、使いすぎると逆に可読性を下げることもあります。
また、周りのコードと違うことをすると無駄にレビューで精神と体力をすり減らすことになる可能性があるので、我を出しすぎないことも大切と思います。