【问题标题】:Optimising treelike control structure优化树状控制结构
【发布时间】:2013-03-14 09:26:05
【问题描述】:

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

我想避免庞大的控制结构,因为它非常难以阅读,像这样:

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

有没有更好的方法来处理它?这是我的树的样子

【问题讨论】:

  • 我认为它不能再优化了,因为控制结构是一门语言非常基础的部分,如果你的逻辑很复杂,那么你的程序也一定很复杂。然而,您可以使用&& 将父条件与子条件结合起来,使控制结构“更简单”,例如if(COND1 && COND2){}if(COND1 && COND3){} ...,这样嵌套就会减少

标签: php javascript algorithm code-readability


【解决方案1】:

将树存储为数据,然后您的代码可以非常小。如果我们稍微修改@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 答案,因此我可以使用确认,您需要使用一个数组,每个可能的答案都有一个条目。

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

【讨论】:

  • 感谢您的回答,在@jam6549 给了我一个想法后,我开始做类似的事情!它有点复杂,因为答案不是简单的是或否,它可以是输入日期然后检查它是否大于某个特定的等等,但这绝对是一个好方法!我还为每个独特的问题制作了一个数组,不要按照您的建议重复它们!再次感谢!
【解决方案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

希望对您有所帮助。

【讨论】:

  • 非常感谢您的回答,它帮助我走上了正轨!我没有使用mysql,但我用你的想法制作了@SpacedMonkey 在他的回答中建议的东西! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2020-02-27
相关资源
最近更新 更多