我正在尝试为预测联盟编写通用评分系统。我为评分系统定义了一个模型(几乎完全完成)。计分系统基于联赛。一个联赛将拥有一个super_user定义的League_scoring系统。我不认为除了创建预定义的属性集外,还没有其他方法可以解决此问题,然后用户为该属性分配点(或者存在?)。联赛得分将决定如何为一组预测(用户预测)计算预测系列。联赛得分也可以具有一组League_questions,具有一个Question和操作员类型的答案(是/否,字符串或数字)的额外预测类型问题以及分配给该问题的多个分数。因此,如果用户预测该问题的答案,他们将获得分配的分数,例如“游戏Y中印度将获得多少检票口”。
我创建了数据模型,我刚刚复制了得分部分,因为我认为不需要其他模型来理解我的问题。
我提供了用于预测序列计算的代码。本质上是为给定用户预定义的预测列表。迭代每个用户的预测,将其与实际(当前/全职)结果进行比较,并更新排名(表格)。
List<Prediction> predictionsForCurrentResultList = predictionsByUserMap.get(result.equalsFixture());
if(predictionsForCurrentResultList != null) {
for (Prediction prediction : predictionsForCurrentResultList) {
logger.info("Prediction is " + prediction);
logger.info("Result is " + result);
Standing tmpStanding = userStandingMap.get(prediction.getPlayerId().trim().toUpperCase());
if(tmpStanding == null) {
tmpStanding = new Standing();
tmpStanding.setPlayerId(prediction.getPlayerId());
}
boolean wrongResult = true;
if(prediction.equalsFixture().equals(result.equalsFixture())) {
if(prediction.equalsString().equals(result.equalsString())) {
tmpStanding.setCorrectScores(leagueScoring.getCorrectScorePoints());
wrongResult = false;
}
if(prediction.getHomeTeamScore().equals(result.getHomeTeamScore())) {
tmpStanding.setHomeScorePoints(leagueScoring.getHomeScorePoints());
tmpStanding.setPointsTotal(1);
tmpStanding.setPointsForRound(1);
}
if(prediction.getAwayTeamScore().equals(result.getAwayTeamScore())) {
tmpStanding.setPointsTotal(1);
tmpStanding.setAwayScorePoints(leagueScoring.getAwayScorePoints());
tmpStanding.setPointsForRound(1);
} //2 - 2 is 0 = 3 - 3 is 0
//3 - 1 is 2 = 5 - 3 is 2
if(prediction.getHomeTeamScore() - result.getHomeTeamScore() == prediction.getAwayTeamScore() - result.getAwayTeamScore()) {
//correct result and margin is
tmpStanding.setPointsTotal(leagueScoring.getCorrectMarginPoints());
tmpStanding.setPointsForRound(1);
tmpStanding.setPointsTotal(2);
wrongResult = false;
} else if((prediction.getHomeTeamScore() > prediction.getAwayTeamScore() && result.getHomeTeamScore() > result.getAwayTeamScore())
|| (prediction.getAwayTeamScore() > prediction.getHomeTeamScore() && result.getAwayTeamScore() > result.getHomeTeamScore())) {
wrongResult = false;
tmpStanding.setPointsTotal(2);
}
if(wrongResult) {
tmpStanding.setWrongResults(1);
} else if(!wrongResult && !prediction.equalsString().equals(result.equalsString())){
tmpStanding.setCorrectResults(1);
}
userStandingMap.put(tmpStanding.getPlayerId().trim().toUpperCase(), tmpStanding);
}
}
return new ArrayList<>(userStandingMap.values());
}
return standings;
我真的不想进入dsl或类似的规则操作类型。我不想在评分或问题上引入限制。我正在考虑几种方法,但是上面的代码是蛮力的if / else逻辑。我宁愿使用函数回调或某种其他通用评分形式,但不受我的预定义模型的限制。也许模型需要更加灵活。本质上,我希望用户能够使用任何计分系统和用户定义的问题来定义联赛。
如何使以上代码更通用,以允许基于上述模型的任何计分系统?还是调整模型以允许使用更通用的算法?