Есть ли лучший способ реализовать? - PullRequest
0 голосов
/ 01 февраля 2012

Я задаю пользователю 10 вопросов с несколькими вариантами ответов после получения ответов на вопросы. Я бы хотел, чтобы результаты отображались на основе их ответов.Мне было интересно, если есть лучший способ выяснить их счет, чем просто делать много утверждений, если?

Int result = 100;
if (answer1 == 10) {
  result = result +10;

  if (answer2 ==20 ) {
    result = result -5;

    if (answer3 == 50) {
      result = result +20;
    }
    else if (answer3 == 10)

    ...

и он продолжит ...

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012

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

Повествование

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

Это решение может быть улучшено, но суть в том, чтобы представить решение в терминах бизнес-концепций ( вездесущий язык ), и решение будет естественным.#

3 голосов
/ 01 февраля 2012

РЕДАКТИРОВАТЬ: Ой, подождите, я вижу, что это вложенный .. Вы все еще могли бы пойти на поиски решения. Вместо Map<String, Integer> вы можете использовать что-то вроде Map<Map<String,Boolean>, Integer>, где Integer является окончательным результатом.


Это один из распространенных способов сделать это:

Map<String, Integer> choice_delta = // new Map

// Define choice delta pairing
choice_delta.put("answer5", -5);
choice_delta.put("answer6", 20);
// etc. etc.

int calculate(String[] answers){
    int result = 0;
    for (String answer : answers){
        int delta = choice_delta.get(answer);
        result += delta;
    }
    return result;
}
0 голосов
/ 01 февраля 2012

Как правило, если вы выйдете за пределы 4-5 категорий, я придумаю какой-то табличный подход.Именно то, что будет зависеть от деталей (и моего настроения), но Энно хороший и типичный для концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...