Метод Расчета Пользователь Отвечает


Я пишу весна приложение гибернации, чтобы сделать онлайн тест и этот метод для вычисления ранга пользователя у меня есть один-ко-многим отношения между несколькими вариантами вопросов и ответов.

Также, пожалуйста, проверьте этот вопрос

@Service
public class StudentServiceImpl implements StudentService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    QuestionRepository questionRepository;

    @Autowired
    UserRepository userRepository;

    @Autowired
    Transformer transformer;

    @Override
    @Transactional
    public void correctAnswer(List<StudentAnswersDTO> questionAnswers) {
        logger.info("****** start correct answers ********");
        Long grade = 0L;
        List<QuestionRightAnswerDTO> rightAnswerDTOS = questionRepository.getRightAnswers();
        for (StudentAnswersDTO questionAnswer : questionAnswers) {
            if (questionAnswer.getType().toLowerCase().equals(AppConstants.MULTI_CHOICE)) {
                if (isCorrectAnswer(questionAnswer.getId(), questionAnswer.getAnswerId(), rightAnswerDTOS))
                    grade++;
            }
        }

        User currentStudent = userRepository.findByMobileNumber(SecurityHelper.getCurrentUser());
        ((Student) currentStudent).setGrade(grade);
        ((Student) currentStudent).setStudentAnswers(transformer.transform(questionAnswers, AnswerSelected.class));

        logger.info("****** end correct answers ********");
    }


    private boolean isCorrectAnswer(Long id, Long answerId, final List<QuestionRightAnswerDTO> rightAnswerDTOS) {
        for (QuestionRightAnswerDTO rightAnswer : rightAnswerDTOS) {
            if (id.equals(rightAnswer.getQuestionId()) && answerId.equals(rightAnswer.getAnswerId()))
                return true;
        }
        return false;
    }
}


137
0
задан 7 февраля 2018 в 07:02 Источник Поделиться
Комментарии
2 ответа

Прежде всего я рекомендую вам использовать конструктор на основе внедрения зависимостей. Тогда я не вижу связи между Question, QuestionAnswer, and QuestionRightAnswer лица... в данный момент Вы выбрали все правильные ответы из БД, которые вы не должны делать! Вы должны получить все правильные ответы только на этот вопрос. Используйте question.id от QuestionAnswer просто, чтобы соответствовать QuestionRightAnswer.questionId FK. Также вы заботиться о MULTI_CHOICE только на вопросы, но почему?

Рассмотрим реализации, такие как:

@Service
public class StudentServiceImpl implements StudentService {

private Logger logger = LoggerFactory.getLogger(this.getClass());

QuestionRepository questionRepository;
UserRepository userRepository;
Transformer transformer;

@Autowired
public NotificationService(QuestionRepository questionRepository,
UserRepository userRepository,
Transformer transformer) {
this.questionRepository = questionRepository;
this.userRepository = userRepository;
this.transformer = transformer;
}

@Override
@Transactional
public void correctAnswer(List<StudentAnswersDTO> questionAnswers) {
logger.info("****** start correct answers ********");
Long grade = questionAnswers
.stream()
.filter(questionAnswer -> questionAnswer.getType().toLowerCase().equals(AppConstants.MULTI_CHOICE))
.filter(questionAnswer -> questionRepository
.getRightAnswersByQuestionId(questionAnswer.getId())
.stream()
.anyMatch(rightAnswer -> questionAnswer.getAnswerId().equals(rightAnswer.getAnswerId())))
.count();

User currentStudent = userRepository.findByMobileNumber(SecurityHelper.getCurrentUser());
((Student) currentStudent).setGrade(grade);
((Student) currentStudent).setStudentAnswers(transformer.transform(questionAnswers, AnswerSelected.class));
}
}

0
ответ дан 7 февраля 2018 в 12:02 Источник Поделиться


        User currentStudent = userRepository.findByMobileNumber(SecurityHelper.getCurrentUser());
((Student) currentStudent).setGrade(grade);

Почему просто не сказать

        Student currentStudent 
= (Student) userRepository.findByMobileNumber(SecurityHelper.getCurrentUser());
currentStudent.setGrade(grade);

Тогда вам не придется повторять бросок.

0
ответ дан 7 февраля 2018 в 05:02 Источник Поделиться