什么是模拟多部分问题的最好方法?



我正在尝试设计一个子类,它将包含对多部分问题的响应和一些逻辑来评估/对它们采取行动。例如,FoodSurvey将是basessurvey的子类

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

FoodSurvey可能有几十个或更多的问题,我需要根据其他问题验证每个答案,以及运行一些特定于FoodSurvey的其他进程(与CarSurvey相反),这些进程可能依赖于多个答案(例如:SendSample(rockyRoad))。

我曾考虑过在每个调查中使用一个带有问题集合的问题类,但这很快就开始看起来像一个调查"引擎",似乎1.)过于夸张,2.)容易出错,3.)限制了我可以用来验证答案的逻辑。

关于设计这种类型的类,有什么公认的最佳实践吗?

如果重要的话,这些类最终将在ASP中使用。. NET网站或web应用程序

我喜欢你的"问题"课。更详细地说,这个模型可以使用类型/对象模式——有点像类型和对象之间的关系。代码可能像这样:

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; }
}

这将允许您为每个调查类型提供自定义验证

我觉得你说" overkill "对自己太苛刻了。在我的书中,从一开始就考虑可伸缩性和模块化是很好的设计实践,无论项目大小如何。

我喜欢提问类的想法。您可能有一个Pattern/RegEx对象的成员数组(无论它们在ASP.NET中被称为什么)和一个方法,该方法接受一个String答案,并遍历数组以尝试匹配它。您可以为点值、主题、提示等包含final成员。听起来很适合它自己的班级。就基于对前一个问题的回答的"链接问题"而言,也许这可以像维护一个答案列表一样简单。下一个问题配对,默认情况下,那些"不喜欢冰淇淋"。这可能是哈希表的一个很好的用例,甚至是一个新类的对象数组- NextQuestionPair,其中包括"选择的答案"one_answers"下一个问题"的成员。

编辑:想想树,根据答案(或缺乏答案)选择分支

最新更新