2011-07-11 10 views
1

私は、マルチパートの質問への反応とそれらを評価/行動するロジックを含むサブクラスを設計しようとしています。例えば、FoodSurveyは(としてマルチパートの質問をモデル化する最良の方法は何ですか

BaseSurvey 
    Name 
    Date 
    Submit() 

FoodSurvey <- BaseSurvey 
    DoYouLikeIcecream 
    IfSoWhatFlavour 
    WouldYouLikeAFreeSample 
    SendSample(flavour) 
    ... 

FoodSurveyは数十以上の質問がある可能性があり、私は他の人に基づいて各回答をvaldateだけでなく、FoodSurveyに固有のいくつかの他のプロセスを実行する必要がありますBaseSurveyのサブクラスになりますCarSurveyとは反対の)複数の回答に依存する可能性があります(例:SendSample(rockyRoad))。

私は各調査で質問コレクションを持つQuestionクラスのアイデアを思いついたが、これはすぐに調査用の「エンジン」のように見え始めた.1)過労であった、2)エラーが発生しやすく、 3)答えを検証するために使用できるロジックが制限されていました。

このタイプのクラスの設計に関する承認されたベストプラクティスはありますか?

重要な場合、クラスは最終的にはASP.NETのWebサイトまたはWebアプリケーションで使用されます。

答えて

1

このモデルでは、タイプとオブジェクトのパターンを使用することができます。つまり、タイプとオブジェクトの関係のようなものです。コードは次のようになります。

class Question 
{ 
    public string Text { get; set; } 
} 

class QuestionAnswer 
{ 
    public Question Question { get; set; } 
    public string Answer { get; set; } 
} 

interface ISurveyValidator 
{ 
    bool Validate(SurveyType type, IEnumerable<QuestionAnswer> answers); 
} 

class SurveyType 
{ 
    public string Name { get; set; } 

    public IList<Question> Questions { get; set; } 

    public ISurveyValidator Validator { get; set; } 

    public Survey CreateSurvey(IEnumerable<QuestionAnswer> answers) 
    { 
     if (!this.Validator.Validate(this, answers)) 
      throw new Exception(); 
     return new Survey 
     { 
      Type = this, 
      Date = DateTime.Now, 
      Answers = answers.ToList() 
     }; 
    } 
} 

class Survey 
{ 
    public SurveyType Type { get; set; } 
    public DateTime Date { get; set; } 
    public IList<QuestionAnswer> Answers { get; set; } 
} 

これにより、各調査タイプに対してカスタム検証を行うことができます。

+0

ありがとう@eulerfx。これはすでに私が演奏したものに非常に近いです。 Questionクラスが好きです。後でUIビルドを実行するために、Prompt、HelpText、ControlTypeプロパティを追加できます。 1つは、QuestionAnswer(例:ブール値、文字列、整数など)でvarible Answerタイプを許可する方法です。これは、それぞれの質問が別々のプロパティであった場合には問題にはなりませんでした。何か案は? –

+0

「タイプ」と回答を強制する方法はたくさんあります。 1つの簡単な方法は、各質問にQuestionType列挙を関連付けることであり、バリデータはその答えがその種類を満たすことを確認することができる。これにより、文字列に任意のタイプのデータを含めることができ、簡単にバインドすることができるため、回答を文字列のままにすることができます。別のオプションは、各質問に検証Regexを関連付けることです。さらに別のオプションは、特定のタイプをサポートするために回答クラスをサブタイプ化することです。 – eulerfx

+0

私は、これをフォームに記入するという自然な動作を模倣するので、すべてを文字列として格納することも考えました。サブタイプメソッドがどのように使われるのか、例えば整数型の答えの例を挙げてください。 –

1

あなたは、あなたが「過労」と言っていると、あなた自身があまりにも激しくなっていると思います。最初からスケーラビリティとモジュール性について考えることは、プロジェクトのサイズにかかわらず、私の書籍のデザイン練習には適しています。

私はQuestionクラスのアイデアが気に入っています。 Pattern/RegExオブジェクトのメンバ配列(ASP.NETで呼び出されているものであれ)と、String型の答えを受け取り、それを照合しようとする配列を歩く方法があります。ポイント値、トピック、ヒントなどの最終メンバーを含めることができます。自分のクラスの完璧な候補のように聞こえます。 前回の質問に対する回答に基づいて「質問をつなぐ」という点では、おそらく回答のリストを維持するだけで、「アイスクリームが好きではない」という既定のケースでnext_questionのペア設定を行うことができます。これは、ハッシュテーブル、または新しいクラスのオブジェクトの配列であっても、「回答選択」と「次​​の質問」のメンバーを含むNextQuestionPairの良い使用例です。

編集: (またはその欠如)に基づいて

+0

Thanks AlexWebr。スケーラビリティとモジュール性を提唱するための+1。私はまた、次の質問ペアについてあなたの考えが好きです。 –

関連する問題