优化树状控制结构

时间:2013-03-14 09:26:05

标签: php javascript algorithm code-readability

我必须根据用户输入创建报告。用户回答一个问题,然后根据答案我在树状结构中向左或向右走,并提出一个新问题。一些节点将有相同的问题,但不同的孩子。我不确定在代码可读性方面最好的方法是什么?

我想避免使用巨大的控制结构,因为它非常难以理解,如下所示:

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

有没有更好的方法来处理它?这是我的树看起来像的图像

enter image description here

2 个答案:

答案 0 :(得分: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.如果他们选择第二个答案,他们会转到问题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

希望有所帮助。

答案 1 :(得分: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答案,因此我可以使用确认,您将要使用带有每个可能答案的条目的数组。

你说有些问题是重复的,所以我很想有一个带有每个独特问题文本的数组。然后你的答案数组将一个索引存储到问题数组中以保存重复的文本。