使用哪种设计模式以及调查平台如何使用?
Which design pattern to use and how for survey platform?
我正在尝试解决调查系统的最佳架构以及要使用的设计模式。
我们有以下类型的问题:
- 可能有一个正确答案 - 下拉或单选按钮
- 多项选择 - 复选框
- Yes/No - 带有 Yes/No
的单选按钮
- 短文本
- 长文本
- 数字 - 例如什么时候...?
- 正确的顺序 - 例如以正确的顺序排列答案
我想要绘图 API 和验证 API
所以我想出了 "Bridge Pattern" ,它主要用于绘图。但是我缺少一些东西。
我试过的是这样的:
public abstract class Question : IDrawable, IValidatable
{
protected readonly IQuestionFormatter questionFormatter;
protected readonly IQuestionValidator validator;
public string Title { get; set; }
public Question(IQuestionFormatter questionFormatter, IQuestionValidator validator)
{
this.questionFormatter = questionFormatter;
this.validator = validator;
}
public abstract void Draw();
public abstract bool Validate();
}
public interface IQuestionValidator
{
bool ValidateQuestion(IEnumerable<string> userInput,
IEnumerable<string> questionAnswers);
}
public interface IQuestionFormatter
{
string FormatQuestion(string title, IEnumerable<string> options);
}
然后我为 MultipleChoiceQuestion、OnePossibleAnswerQuestion 和 ShortAnswer 创建 RefinedAbstractions。问题是 MultipleChoiceQuestion 可以有 许多正确答案和许多 UserInput.
public class MultipleChoiceQuestion : Question
{
public List<string> Options { get; set; } = new List<string>();
public List<string> Answers { get; set; } = new List<string>();
public List<string> UserInput { get; set; } = new List<string>();
public MultipleChoiceQuestion(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
{
}
public override void Draw()
{
var result = questionFormatter.FormatQuestion(Title, Options);
Console.WriteLine(result);
}
public override bool Validate()
{
return validator.ValidateQuestion(UserInput, Answers);
}
}
OnePossibleAnswerQuestion 有 多个答案,但有一个 UserInput。
public class OnePossibleAnswerQuestion : Question
{
public string UserInput { get; set; }
public string Answer { get; set; }
public List<string> Options { get; set; } = new List<string>();
public OnePossibleAnswerQuestion(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
{
}
public override void Draw()
{
var result = questionFormatter.FormatQuestion(Title, Options);
Console.WriteLine(result);
}
public override bool Validate()
{
return validator.ValidateQuestion(new List<string> { UserInput }, new List<string> { Answer });
}
}
ShortAnswer 有 一个答案和一个 UserInput。我不确定如何创建设计。
public class ShortAnswer : 问题
{
public 字符串用户输入 { 得到;放; }
public 字符串答案{ 得到;放; }
public ShortAnswer(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
{
}
public override void Draw()
{
var result = questionFormatter.FormatQuestion(Title, new List<string> { "" });
Console.WriteLine(result);
}
public override bool Validate()
{
return validator.ValidateQuestion(new List<string> { UserInput }, new List<string> { Answer });
}
}
但是当我到达 OnePossibleAnswerQuestion 或 ShortAnswer 时,.Validate() .Draw() 开始发臭。可能我定义了错误的接口?
我的目标是拥有这样的东西:
List<Question> questions = new List<Question>();
// ... add some questions using Builder or Factory Design Pattern
// draw the questions
foreach (var question in questions)
{
question.Draw();
}
// validate the questions
foreach (var question in questions)
{
question.Validate();
}
你能帮我看看我遗漏了什么以及如何合成 classes 吗?我使用了错误的设计模式吗?
提前致谢!
1) 让你的验证者使用问题而不是输入和答案:
this.validator.Validate(this);
2) 让你的格式化程序使用问题而不是标题和选项:
this.formatter.Format(this);
= 现在您可以将 Validate() 和 Draw() 方法移动到基础 class 中,而不是在每个问题类型中实现。此外,您还可以提供具有新属性的新问题类型,例如音频或图片。
3) 为了使这个有用,您需要使用问题渲染器而不是格式化程序。如果您决定将输入从文本控制台更改为 HTML 页面怎么办?
4) 您还可以为问题添加 GetInput() 方法,使其具有如下内容:
List<Question> questions = new List<Question>();
// draw the questions
foreach (var question in questions)
{
question.Draw();
question.GetInput();
question.Validate();
}
或者您可以只绘制 () 问题并在单击按钮时调用 Validate()。
我正在尝试解决调查系统的最佳架构以及要使用的设计模式。 我们有以下类型的问题:
- 可能有一个正确答案 - 下拉或单选按钮
- 多项选择 - 复选框
- Yes/No - 带有 Yes/No 的单选按钮
- 短文本
- 长文本
- 数字 - 例如什么时候...?
- 正确的顺序 - 例如以正确的顺序排列答案
我想要绘图 API 和验证 API 所以我想出了 "Bridge Pattern" ,它主要用于绘图。但是我缺少一些东西。
我试过的是这样的:
public abstract class Question : IDrawable, IValidatable
{
protected readonly IQuestionFormatter questionFormatter;
protected readonly IQuestionValidator validator;
public string Title { get; set; }
public Question(IQuestionFormatter questionFormatter, IQuestionValidator validator)
{
this.questionFormatter = questionFormatter;
this.validator = validator;
}
public abstract void Draw();
public abstract bool Validate();
}
public interface IQuestionValidator
{
bool ValidateQuestion(IEnumerable<string> userInput,
IEnumerable<string> questionAnswers);
}
public interface IQuestionFormatter
{
string FormatQuestion(string title, IEnumerable<string> options);
}
然后我为 MultipleChoiceQuestion、OnePossibleAnswerQuestion 和 ShortAnswer 创建 RefinedAbstractions。问题是 MultipleChoiceQuestion 可以有 许多正确答案和许多 UserInput.
public class MultipleChoiceQuestion : Question
{
public List<string> Options { get; set; } = new List<string>();
public List<string> Answers { get; set; } = new List<string>();
public List<string> UserInput { get; set; } = new List<string>();
public MultipleChoiceQuestion(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
{
}
public override void Draw()
{
var result = questionFormatter.FormatQuestion(Title, Options);
Console.WriteLine(result);
}
public override bool Validate()
{
return validator.ValidateQuestion(UserInput, Answers);
}
}
OnePossibleAnswerQuestion 有 多个答案,但有一个 UserInput。
public class OnePossibleAnswerQuestion : Question
{
public string UserInput { get; set; }
public string Answer { get; set; }
public List<string> Options { get; set; } = new List<string>();
public OnePossibleAnswerQuestion(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
{
}
public override void Draw()
{
var result = questionFormatter.FormatQuestion(Title, Options);
Console.WriteLine(result);
}
public override bool Validate()
{
return validator.ValidateQuestion(new List<string> { UserInput }, new List<string> { Answer });
}
}
ShortAnswer 有 一个答案和一个 UserInput。我不确定如何创建设计。 public class ShortAnswer : 问题 { public 字符串用户输入 { 得到;放; } public 字符串答案{ 得到;放; }
public ShortAnswer(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
{
}
public override void Draw()
{
var result = questionFormatter.FormatQuestion(Title, new List<string> { "" });
Console.WriteLine(result);
}
public override bool Validate()
{
return validator.ValidateQuestion(new List<string> { UserInput }, new List<string> { Answer });
}
}
但是当我到达 OnePossibleAnswerQuestion 或 ShortAnswer 时,.Validate() .Draw() 开始发臭。可能我定义了错误的接口?
我的目标是拥有这样的东西:
List<Question> questions = new List<Question>();
// ... add some questions using Builder or Factory Design Pattern
// draw the questions
foreach (var question in questions)
{
question.Draw();
}
// validate the questions
foreach (var question in questions)
{
question.Validate();
}
你能帮我看看我遗漏了什么以及如何合成 classes 吗?我使用了错误的设计模式吗?
提前致谢!
1) 让你的验证者使用问题而不是输入和答案:
this.validator.Validate(this);
2) 让你的格式化程序使用问题而不是标题和选项:
this.formatter.Format(this);
= 现在您可以将 Validate() 和 Draw() 方法移动到基础 class 中,而不是在每个问题类型中实现。此外,您还可以提供具有新属性的新问题类型,例如音频或图片。
3) 为了使这个有用,您需要使用问题渲染器而不是格式化程序。如果您决定将输入从文本控制台更改为 HTML 页面怎么办?
4) 您还可以为问题添加 GetInput() 方法,使其具有如下内容:
List<Question> questions = new List<Question>();
// draw the questions
foreach (var question in questions)
{
question.Draw();
question.GetInput();
question.Validate();
}
或者您可以只绘制 () 问题并在单击按钮时调用 Validate()。