早期リターンの「出口が多すぎる問題」とは?
早期リターン(ガード節)は便利ですが、「メソッドの中に出口(return)がたくさんある」と、コードの流れが分かりづらくなることがあります。これを「出口が多すぎる問題」と呼びます。
問題のイメージ
出口が多すぎる例
public String checkUser(User user) {
if (user == null) return "ユーザーが存在しません";
if (!user.isActive()) return "非アクティブです";
if (user.isBanned()) return "利用禁止です";
if (!user.hasPermission("ADMIN")) return "権限がありません";
return "管理者ページへアクセスできます";
}
Java👉 5つのreturnがあり、どこで処理が終わるのか追いづらい。
特に長いメソッドだと「出口が散らばっている」状態になり、保守性が下がる。
⚠️ 注意点
- 出口が多いと可読性が落ちる
→ 「どこで終わるか」を探すのに時間がかかる。 - リソース管理に影響
→ ファイルやDB接続を閉じる処理が必要な場合、出口が多いと「閉じ忘れ」が起きやすい。 - チーム規約とのズレ
→ 一部のチームでは「出口は1つにする」ルールを採用していることもある。
改善方法
1. 結果を変数にまとめて最後に返す
public String checkUser(User user) {
String result;
if (user == null) {
result = "ユーザーが存在しません";
} else if (!user.isActive()) {
result = "非アクティブです";
} else if (user.isBanned()) {
result = "利用禁止です";
} else if (!user.hasPermission("ADMIN")) {
result = "権限がありません";
} else {
result = "管理者ページへアクセスできます";
}
return result;
}
Java👉 出口は1つだけ。処理の流れが追いやすい。
2. メソッドを分割する
public String checkUser(User user) {
if (!isValid(user)) return "ユーザーが不正です";
if (!canAccessAdmin(user)) return "権限がありません";
return "管理者ページへアクセスできます";
}
private boolean isValid(User user) {
return user != null && user.isActive() && !user.isBanned();
}
private boolean canAccessAdmin(User user) {
return user.hasPermission("ADMIN");
}
Java👉 判定を小さなメソッドに分けることで、出口が整理され、読みやすさも向上。
まとめ
- 出口が多すぎると流れが分かりづらい
- 改善方法:
- 結果を変数にまとめて最後に返す
- メソッドを分割して責務を整理する
- 実務のコツ:
- 短いメソッドなら早期リターンでOK
- 長いメソッドやリソース管理が絡む場合は出口を整理する
✅ つまり「早期リターンは便利だけど、出口が散らばりすぎないように工夫する」ことが大切です。
