对多部分问题进行建模的最佳方法是什么?

时间:2011-07-11 21:49:14

标签: class design-patterns object properties class-design

我正在尝试设计一个子类,它将包含对多部分问题的响应以及一些评估/操作它们的逻辑。例如,FoodSurvey将是BaseSurvey的子类

BaseSurvey
  Name
  Date
  Submit()

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

FoodSurvey可能有几十个或更多问题,我需要根据其他问题对每个答案进行验证,并运行一些特定于FoodSurvey(而不是CarSurvey)的其他过程,这些过程可能取决于多个答案(例如:SendSample (石板路))。

我已经在每个调查中玩弄了一个带有问题集的问题类的想法,但这很快就开始看起来像一个调查'引擎',看起来像1.)过度,2。)容易出错,3 。)限制了我可以用来验证答案的逻辑。

关于设计这类课程,是否有任何公认的最佳实践?

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

2 个答案:

答案 0 :(得分:1)

当你说'矫枉过正'时,我觉得你对自己太过刻苦。从一开始就考虑可扩展性和模块化是我书中的良好设计实践,无论项目规模如何。

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

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

答案 1 :(得分: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; }
}

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