6

ユーザー入力に基づいてレポートを作成する必要があります。ユーザーが質問に答えると、その答えに応じて、ツリー状の構造で左または右に移動し、新しい質問をします。一部のノードには同じ質問がありますが、子は異なります。コードの可読性の観点から、それを行うための最良の方法は何でしょうか?

次のように非常に判読できないため、巨大な制御構造は避けたいと思います。

if() {
    if() {
        if() {
            if() {
                ... 
            }
        }
        else {
            if() {
                ...
            }
        }
    }
    else {
        ...
    }
}
else {
    if() {
        if() {
            if() {
                ...
            }
        }
        else {
            if () {
                ...
            }
        }
    }
}

それに対処するためのより良い方法はありますか?これが私のツリーがどのように見えるかの画像です

ここに画像の説明を入力してください

4

2 に答える 2

2

mysqlを使用している場合は、次のような質問用のテーブルと回答用のテーブルを用意してください。

質問表:

+----------+-----------+
| id       | question  |
+----------+-----------+
| 1        | Question 1|
+----------+-----------+
| 2        | Question 2|
+----------+-----------+
| 3        | Question 3|
+----------+-----------+

回答表:

+----------+-----------+-----------+---------------+
| id       | answer    | question  | next_question |
+----------+-----------+-----------+---------------+
| 1        | Answer 1  | 1         | 2             |
+----------+-----------+-----------+---------------+ 
| 2        | Answer 2  | 1         | 3             | 
+----------+-----------+-----------+---------------+

ユーザーが質問1にいて、最初の回答を選択した場合は、質問2に進みます。2番目の回答を選択した場合は、質問3に進みます。

したがって、コードでは、IDを使用してすべての回答の後にデータベースにクエリを実行するだけです。

SELECT next_question FROM answers WHERE id = ?; // Change '?' depending on answer to get next question

次に、次のような答えを取得します。

SELECT answer FROM answers WHERE question = ?; // Change '?' depending on previous value retrieved

お役に立てば幸いです。

于 2013-03-14T09:59:16.010 に答える
2

ツリーをデータとして保存すると、コードを非常に小さくすることができます。@ jam6549によって与えられた答えを少し変更すると、次のようなものを思い付くことができます。

var answer = [ {t: "Does it have fur?", y: 1,  n: 2},
               {t: "Is it a kitten?",   y: 3,  n: 4},
               {t: "Is it a goldfish?", y: 5,  n: 4},
               {t: "Found a kitten",    y: -1, n: -1},
               {t: "I'm stumped",       y: -1, n: -1},
               {t: "Found a goldfish",  y: -1, n: -1} ];
var state = 0;

while ( answer[state].y >= 0 ) {
    var choice = confirm(answer[state].t);
    state = choice? answer[state].y: answer[state].n;
}
alert(answer[state].t);

これは単純なy/n回答のみをサポートするため、confirmを使用できます。可能な回答ごとに、エントリを含む配列を使用することをお勧めします。

いくつかの質問が繰り返されているとおっしゃっていますので、それぞれの固有の質問テキストを含む配列を作成したいと思います。次に、回答配列は、重複するテキストを保存するために質問配列にインデックスを格納します。

于 2013-03-15T15:57:46.110 に答える