Я пытаюсь написать универсальную систему подсчета очков для лиги прогнозирования.У меня есть модель, определенная (почти полностью завершенная) для системы начисления баллов.Система начисления очков основана на Лиге.У лиги будет система league_scoring, определенная как super_user.Я не думаю, что есть способ обойти это, кроме создания предопределенного набора атрибутов, и пользователь затем назначает точки для этого (или есть?).Оценка лиги будет определять, как рассчитывается ряд прогнозов для набора прогнозов (пользовательских прогнозов).Оценка лиги также может иметь набор вопросов League_questions, дополнительных вопросов типа прогнозирования с вопросом и ответом типа оператора (да / нет, либо строкой, либо числом), а также количеством баллов, назначенных этому вопросу.Таким образом, если пользователь предсказывает ответ на этот вопрос, он получает назначенные очки, например, «сколько калиток Индия получит в игре Y».
Я создал модель данных, из которой только что скопировал скоринговую часть, так как не верю, что другая нужна для понимания моего вопроса.
![enter image description here](https://i.stack.imgur.com/WBKcP.jpg)
Я предоставил код для расчета ряда прогнозов.По сути, существует список прогнозов, предопределенных для данного пользователя.Выполните итерацию этих прогнозов для каждого пользователя, сравните их с фактическим (текущим / полным) результатом и обновите результаты (таблица).
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.Я бы предпочел функциональные обратные вызовы или какую-то другую общую форму оценки, которая не ограничена моей заранее определенной моделью.Возможно, модель должна быть более гибкой.По сути, я хочу, чтобы пользователь мог определить Лигу с любой системой подсчета очков и вопросами, которые задает пользователь.
Как сделать приведенный выше код более универсальным, чтобы можно было использовать любую систему подсчета очков, основанную на приведенной выше модели?Или настроить модель, чтобы учесть более общий алгоритм?