例を挙げましょう。AJAX 呼び出しに使用する aspx.cs ファイル内に次の Web メソッドがあります。
[WebMethod]
public static ResponseMessage GetNextQuestion(string quizGuid)
{
using (DbEntities db = new DbEntities())
{
Quiz theQuiz = Quiz.Get(db, DataValidationHelper.GetGuid(quizGuid));
try
{
Question nextQuestion = QuizHelper.GetNextQuestion(db, theQuiz);
return new ResponseMessage() { Status = "Success", NextQuestion = new NextQuestionResponse(nextQuestion, theQuiz) };
}
catch (QuizNotFoundException)
{
return new ResponseMessage() { Status = "QuizNotFound" };
}
catch (QuizInvalidException)
{
return new ResponseMessage() { Status = "QuizInvalid" };
}
catch (QuizOverException)
{
return new ResponseMessage() { Status = "QuizOver" };
}
catch (QuestionTimedOutException)
{
return new ResponseMessage() { Status = "QuestionTimedOut" };
}
catch (Exception ex)
{
return new ResponseMessage() { Status = "Error", ErrorMessage = ex.Message };
}
}
}
メソッドはQuizHelper.GetNextQuestion
データベースから新しい質問を生成し、特定のケースでは次の例外をスローします。
QuizNotFoundException
:指定されたクイズがquizGuid
データベースにない場合。QuizInvalidException
: セキュリティ目的でスローされます。たとえば、誰かが HTTP リクエストをハッキングしようとした場合などです。QuizOverException
: すべてのクイズには 10 の質問があり、ユーザーがQuizHelper.GetNextQuestion
メソッドを使用して 11 番目の質問を取得しようとすると、この例外がスローされます。QuestionTimedOutException
: 制限時間内に質問に答えなければなりません。そうしないと、この例外がスローされます。Exception
: 他のすべての例外は、UX の目的で、エラーが発生したことをユーザーに通知するという唯一の目的で、この下にグループ化されています。
次に、Javascript ファイル内でResponseMessage.Status
がチェックされ、対応するアクションが実行されます。
このコードで使用されている例外を使用してフローを制御するのは悪いことですが、このようにする方がより直感的で、はるかに簡単です。部外者にとってコードが理解しやすいという事実は言うまでもありません。
このコードをどのようにして例外なく「正しい方法」で書き直すことができるかはわかりませんが、同時にその単純さを維持できます。
何か不足していますか、アイデアはありますか?
更新: Enum を使用して操作のステータスを返すことを提案する回答もありますが、多くの操作があり、すべてが異なるシナリオになる可能性があります (つまり、すべての操作に同じ Enum を使用することはできません)。この場合、操作ごとに 1 つの Enum を作成することは、正しい方法ではないと感じられます。このモデルの改善点はありますか?