我正在尝试设计一个子类,它将包含对多部分问题的响应以及一些评估/操作它们的逻辑。例如,FoodSurvey将是BaseSurvey的子类
BaseSurvey
Name
Date
Submit()
FoodSurvey <- BaseSurvey
DoYouLikeIcecream
IfSoWhatFlavour
WouldYouLikeAFreeSample
SendSample(flavour)
...
FoodSurvey可能有几十个或更多问题,我需要根据其他问题对每个答案进行验证,并运行一些特定于FoodSurvey(而不是CarSurvey)的其他过程,这些过程可能取决于多个答案(例如:SendSample (石板路))。
我已经在每个调查中玩弄了一个带有问题集的问题类的想法,但这很快就开始看起来像一个调查'引擎',看起来像1.)过度,2。)容易出错,3 。)限制了我可以用来验证答案的逻辑。
关于设计这类课程,是否有任何公认的最佳实践?
如果重要,这些类最终将在ASP.NET网站或Web应用程序中使用。
答案 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; }
}
这将允许您为每种调查类型提供自定义验证。