Class 建立多部分问题模型的最佳方法是什么

Class 建立多部分问题模型的最佳方法是什么,class,design-patterns,object,properties,class-design,Class,Design Patterns,Object,Properties,Class Design,我试图设计一个子类,它将包含对多部分问题的回答和一些逻辑来评估/处理这些问题。例如,FoodSurvey将是BaseSurvey的一个子类 BaseSurvey Name Date Submit() FoodSurvey <- BaseSurvey DoYouLikeIcecream IfSoWhatFlavour WouldYouLikeAFreeSample SendSample(flavour) ... BaseSurvey 名称 日期 提交()

我试图设计一个子类,它将包含对多部分问题的回答和一些逻辑来评估/处理这些问题。例如,FoodSurvey将是BaseSurvey的一个子类

BaseSurvey
  Name
  Date
  Submit()

FoodSurvey <- BaseSurvey
  DoYouLikeIcecream
  IfSoWhatFlavour
  WouldYouLikeAFreeSample
  SendSample(flavour)
  ...
BaseSurvey
名称
日期
提交()

食物调查我认为你说“过度杀戮”对自己太苛刻了。在我的书中,无论项目大小如何,从一开始就考虑可伸缩性和模块化都是很好的设计实践

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


编辑:思考树,根据答案选择分支(或没有答案)

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

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; }
}
课堂提问
{
公共字符串文本{get;set;}
}
课堂问答
{
公共问题{get;set;}
公共字符串答案{get;set;}
}
接口ISurveyValidator
{
bool验证(调查类型,IEnumerable答案);
}
类调查类型
{
公共字符串名称{get;set;}
公共IList问题{get;set;}
公共ISurveyValidator验证器{get;set;}
公众调查(IEnumerable答案)
{
如果(!this.Validator.Validate(this,answers))
抛出新异常();
返回新调查
{
类型=此,
日期=日期时间。现在,
Answers=Answers.ToList()
};
}
}
班级调查
{
公共调查类型类型{get;set;}
公共日期时间日期{get;set;}
公共IList答案{get;set;}
}

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

谢谢AlexWebr+1支持可扩展性和模块化。我也喜欢你关于下一个问题配对的想法。谢谢@eulerfx。这和我已经玩过的非常接近。我喜欢b/c类的问题,我可以添加提示、帮助文本、控制类型属性,以便稍后支持UI构建。我一直坚持的一件事是如何在问答中允许不同的答案类型(例如:布尔、字符串、整数等)。当每个问题都是一个单独的属性时,这不是一个问题。有什么想法吗?有很多方法可以强制执行“类型”和答案。一种简单的方法是将QuestionType枚举与每个问题关联,然后验证程序可以确认答案满足该类型。这将允许答案保留字符串,因为字符串可以包含任何类型的数据,并且可以轻松绑定。另一个选项是将验证正则表达式与每个问题关联起来。还有一个选择是对answer类进行子类型化以支持特定类型。我还考虑将所有内容存储为字符串,因为这模仿了填充表单的自然行为。你能举个例子说明如何使用子类型方法,比如整数答案吗?