逐级实施回退
c#
我有一个ScoreStrategy描述如何计算测验分数的课程:
public class ScoreStrategy
{
public int Id { get; set; }
public int QuizId { get; set; }
[Required]
public Quiz Quiz { get; set; }
public decimal Correct { get; set; }
public decimal Incorrect { get; set; }
public decimal Unattempted { get; set; }
}
三个属性Correct,Incorrect并Unattempted描述要为响应分配多少点。这些点也可以是负的。评分策略适用于测验中的所有问题,因此ScoreStrategy每个测验只能有一个。我有两个子类:
public class DifficultyScoreStrategy : ScoreStrategy
{
public QuestionDifficulty Difficulty { get; set; }
}
public class QuestionScoreStrategy : ScoreStrategy
{
[Required]
public Question Question { get; set; }
}
我的问题有三个难度级别(Easy, Medium, Hard;QuestionDifficulty是一个枚举)。该DifficultyScoreStrategy指定如果的具体困难需要问题点进行不同的分配。这将覆盖ScoreStrategy适用于整个测验的基础。每个难度级别可以有一个实例。
第三,我有一个QuestionScoreStrategy课程,指定是否必须以不同的方式授予特定问题的分数。这将覆盖测验范围ScoreStrategy和难度范围DifficultyStrategy。每个问题可以有一个实例。
在评估测验的反应时,我想实现一个逐级回退机制:
对于每个问题:
- 检查问题是否存在
QuestionScoreStrategy,如果找到则返回策略。 - 如果没有,则回退
DifficultyScoreStrategy并检查是否存在针对所评估问题的难度级别的策略,如果找到策略则返回该策略。 - 如果没有,回退到测验范围
ScoreStrategy并检查是否存在,如果存在则返回它, - 如果
ScoreStrategy两者都没有,请使用默认值{ Correct = 1, Incorrect = 0, Unattempted = 0 }(如果我也可以将其设置为可配置,那就太棒了,就像 .NET 的优雅方式:
options => {
options.UseFallbackStrategy(
correct: 1,
incorrect: 0,
unattempted: 0
);
}
)。
概括
我已将上述信息汇总在一个表格中:
| 策略类型 | 优先事项 | 每个测验的最大实例数 |
|---|---|---|
QuestionScoreStrategy |
第一名(最高) | 测验中有多少问题 |
DifficultyScoreStrategy |
第二 | 4、每个难度级别一个 |
ScoreStrategy |
第三名 | 只有一个 |
| 回退策略 (默认 { Correct = 1, Incorrect = 0, Unattempted = 0}) |
第四名(最低) | 为整个应用程序配置。由所有测验共享 |