総合サンプルコード(リファクタリング版)
前回の「入力チェック+外部API呼び出し+レスポンス返却」の例を、さらに リファクタリング(改善) して「レスポンス生成を共通化」したバージョンを紹介します。これにより、コードの重複が減り、テストや保守がしやすくなります。
改善後のサンプルコード
public class UserController {
public Response getUserProfile(Request req, ExternalApi api) {
// --- 早期リターンで入力チェック ---
if (req == null) return errorResponse(400, "リクエストが空です");
if (req.getUserId() == null || req.getUserId().isEmpty()) {
return errorResponse(400, "ユーザーIDが必要です");
}
// --- 例外処理で外部要因をカバー ---
try {
UserProfile profile = api.fetchProfile(req.getUserId());
if (profile == null) {
return errorResponse(404, "ユーザーが見つかりません");
}
return successResponse(200, "成功", profile);
} catch (IOException e) {
return errorResponse(503, "外部サービスエラー: " + e.getMessage());
} catch (Exception e) {
return errorResponse(500, "予期せぬエラー: " + e.getMessage());
}
}
// --- 共通化したレスポンス生成メソッド ---
private Response errorResponse(int code, String message) {
return new Response(code, message);
}
private Response successResponse(int code, String message, Object data) {
return new Response(code, message, data);
}
}
Java改善ポイント
- レスポンス生成を共通化
→errorResponseとsuccessResponseを用意して、重複コードを削減。 - 読みやすさアップ
→ 「何を返しているか」がメソッド名で明確になる。 - テストしやすさ
→ 共通メソッドをテストすれば、全体のレスポンス生成が保証される。 - 保守性向上
→ エラーメッセージのフォーマットを変更したいときも、共通メソッドを直すだけで済む。
テスト設計の観点
- 入力チェックテスト →
req = null→ 400エラー - 正常系テスト → 正しい
userId→ 200成功+プロフィール返却 - 外部要因テスト → APIモックで例外を投げる → 503 or 500エラー
- 共通メソッドテスト →
errorResponseとsuccessResponseを直接テスト可能
✅ このように「レスポンス生成を共通化」することで、コードの重複を減らし、テストや保守が圧倒的に楽になります。
