2011-07-11 85 views
1

我想設計一個子類,它將包含對多部分問題的回答以及對它們進行評估/操作的一些邏輯。例如,FoodSurvey是BaseSurvey的一個子類模擬多部分問題的最佳方法是什麼

BaseSurvey 
    Name 
    Date 
    Submit() 

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

FoodSurvey可能有幾十個或更多的問題,我需要valdate基於其他每個答案,以及運行特定FoodSurvey一些其他工藝(如反對CarSurvey)可能取決於多個答案(例如:SendSample(rockyRoad))。

我已經在每個調查中提出了一個Question集合的問題類的概念,但這很快就開始看起來像一個調查'引擎',看起來像1)。是過度殺傷,2)是容易出錯, 3.)限制了我可以用來驗證答案的邏輯。

有沒有關於設計這種類型的公認的最佳實踐?

如果重要,這些類將最終在ASP.NET網站或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類b/c,我可以添加Prompt,HelpText,ControlType屬性以便稍後對UI構建進行檢測。我堅持的一件事是如何在QuestionAnswer中允許可變的Answer類型(例如:boolean,string,integer等)。當每個問題是一個單獨的屬性時,這不是一個問題。有任何想法嗎? –

+0

有很多方法可以執行「類型」和答案。一種簡單的方法是將QuestionType枚舉與每個問題相關聯,然後驗證者可以確認答案滿足該類型。這將允許答案保持字符串,因爲字符串可以包含任何類型的數據並且可以很容易地綁定。另一種選擇是將驗證正則表達式與每個問題關聯起來。還有一種選擇是將答案類別分類以支持特定的類型。 – eulerfx

+0

我也想過將所有內容都存儲爲字符串,因爲這模擬了填充表單的自然行爲。你能否舉一個例子說明如何使用子類型方法,比如整數回答? –

1

我覺得當你說'矯枉過正'時,你對自己太過分了。無論項目大小如何,從一開始就對可擴展性和模塊化進行思考是我書中的良好設計實踐。

我喜歡Question類的想法。你可能有一個Pattern/RegEx對象的成員數組(無論它們在ASP.NET中調用了什麼)以及一個接受String答案的方法,並且試圖使數組與它匹配。你可以包括最終成員的積分值,主題,提示等。聽起來像是自己班級的完美人選。 對於基於對前一個問題的回答的「鏈接問題」,或許可以這樣做,就像維護一個答案列表» next_question配對一樣,對於那些不喜歡冰淇淋的人來說默認情況下。這可能是一個散列表的好用例,甚至是一個新類的對象數組--NextQuestionPair,其中包括'answer selected'和'next question'的成員。

編輯:認爲樹,選擇分支根據答案(或缺少答案)

+0

謝謝AlexWebr。 +1提倡可擴展性和模塊化。我也喜歡你關於下一個問題配對的想法。 –

相關問題