Это легче реализовать, если правильно смоделировать.Я не уверен в вашем проблемном контексте, но я сделал несколько предположений.
Повествование
A Quiz
- это набор Question
«s.Каждый вопрос имеет один или несколько Answer
, каждый ответ содержит определенный weight
.Вы prepare
Викторина для определенного сценария (Java, c #) и представляете пользователю один за другим.Пользователь selects
ответит на поставленный вопрос, а затем вы покажете ему currentScore
и следующий вопрос.После того, как представлены все вопросы, вычисляется finalScore
.
Абстракции
- Викторина (подготовка, currentScore (), finalScore ())
- Вопрос (scoreFor)
- Ответ (weightedScore)
Реализация
public class Quiz
{
List<Question> questions = new ArrayList<Question>();
List<String> selectedAnswers = new ArrayList<String>();
private int currentScore;
public void prepare()
{
questions.add(new Question("What comes after A?", Arrays.asList(new Answer("B", 10), new Answer("Z", 5))));
questions.add(new Question("What comes after B?", Arrays.asList(new Answer("A", -5), new Answer("C", 10))));
}
public int finalScore()
{
int result = 0;
for (int i = 0; i < questions.size(); i++)
{
result = result + questions.get(i).scoreFor(selectedAnswers.get(i));
}
return result;
}
public void setSelectedAnswerFor(int questionIndex, String selectedAnswer)
{
assert questionIndex < questions.size();
selectedAnswers.add(questionIndex, selectedAnswer);
currentScore = currentScore + questions.get(questionIndex).scoreFor(selectedAnswer);
}
public int currentScore()
{
return currentScore;
}
public static void main(String args[])
{
Quiz quiz = new Quiz();
quiz.prepare();
quiz.setSelectedAnswerFor(0, "B");
System.out.println("Current Score " + quiz.currentScore());
quiz.setSelectedAnswerFor(1, "A");
System.out.println("Current Score " + quiz.currentScore());
System.out.println("Final Score " + quiz.finalScore());
}
}
public class Question
{
private final String text;
private final Map<String, Integer> weightedAnswers;
public Question(String text, List<Answer> possibleAnswers)
{
this.text = text;
this.weightedAnswers = new HashMap<String, Integer>(possibleAnswers.size());
for (Answer ans : possibleAnswers)
{
weightedAnswers.put(ans.text, ans.score);
}
}
public int scoreFor(String selectAnswer)
{
return weightedAnswers.get(selectAnswer);
}
public String getText()
{
return text;
}
}
public class Answer
{
final String text;
final int score;
public Answer(String text, int score)
{
this.text = text;
this.score = score;
}
}
Вывод
Current Score 10
Current Score 5
Final Score 5
Это решение может быть улучшено, но суть в том, чтобы представить решение в терминах бизнес-концепций ( вездесущий язык ), и решение будет естественным.#