2013-03-14 35 views
6

Tôi phải tạo báo cáo dựa trên đầu vào của người dùng. Người dùng trả lời một câu hỏi, và sau đó tùy thuộc vào câu trả lời tôi đi sang trái hoặc phải trong một cấu trúc treelike, và đặt một câu hỏi mới. Một số nút sẽ có cùng một câu hỏi, nhưng các trẻ khác nhau. Tôi không chắc chắn những gì sẽ là cách tốt nhất để làm điều đó về khả năng đọc mã?Tối ưu cấu trúc điều khiển treelike

Tôi muốn tránh cấu trúc điều khiển rất lớn, vì nó sẽ là vô cùng không đọc được, như thế này:

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

Có một số cách tốt hơn để đối phó với nó? Dưới đây là một hình ảnh như thế nào cây của tôi trông giống như

enter image description here

+0

Tôi nghĩ rằng nó không thể được tối ưu hóa nữa vì cấu trúc điều khiển là phần rất cơ bản của một ngôn ngữ, nếu logic của bạn rất phức tạp thì chương trình của bạn cũng phải phức tạp. Tuy nhiên, bạn có thể kết hợp các điều kiện cha với điều kiện hậu duệ bằng cách sử dụng '&&' để làm cho cấu trúc điều khiển 'đồng nhất', ví dụ 'if (COND1 && COND2) {} nếu (COND1 && COND3) {} ...' do đó sẽ ít hơn làm tổ – LotusH

Trả lời

2

Lưu trữ cây dưới dạng dữ liệu và sau đó mã của bạn có thể thực sự khá nhỏ. Nếu chúng ta thay đổi câu trả lời được đưa ra bởi @ jam6549 một chút chúng ta có thể đưa ra một cái gì đó như thế này:

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); 

này chỉ hỗ trợ đơn giản y/n câu trả lời vì vậy tôi có thể sử dụng xác nhận, bạn sẽ muốn sử dụng một mảng với một mục cho mỗi câu trả lời có thể.

Bạn nói một số câu hỏi được lặp lại vì vậy tôi sẽ bị cám dỗ để có một mảng với mỗi văn bản câu hỏi duy nhất. Sau đó mảng câu trả lời của bạn lưu trữ một chỉ mục vào mảng câu hỏi để lưu văn bản trùng lặp.

+0

cảm ơn câu trả lời của bạn, tôi đã bắt đầu làm một việc như thế, sau khi @ jam6549 cho tôi một ý tưởng với câu trả lời của anh ấy! nó phức tạp hơn một chút, vì câu trả lời không đơn giản có hay không, có thể nhập ngày và sau đó kiểm tra xem nó có lớn hơn một số cụ thể hay không, nhưng đó chắc chắn là một cách tiếp cận tốt! tôi cũng đã tạo một mảng với mỗi câu hỏi duy nhất không lặp lại chúng như bạn đã đề xuất! cảm ơn một lần nữa! –

2

Nếu bạn đang sử dụng mysql sau đó chỉ cần có một bảng cho các câu hỏi và một bảng cho câu trả lời như vậy:

Câu hỏi Bảng:

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

Đáp Bảng:

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

Nếu người dùng là về câu hỏi 1 và chọn câu trả lời đầu tiên, họ đi đến câu hỏi 2. Nếu họ chọn câu trả lời thứ hai họ đi đến câu hỏi 3.

Vì vậy, trong mã của bạn chỉ cần truy vấn cơ sở dữ liệu sau mỗi câu trả lời bằng cách sử dụng id:

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

sau đó, nhận được câu trả lời tiếp theo như sau:

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

Hy vọng rằng sẽ giúp.

+0

cảm ơn rất nhiều vì câu trả lời của bạn, nó giúp tôi đi đúng hướng! Tôi đã không sử dụng mysql, nhưng tôi đã sử dụng ý tưởng của bạn để làm một cái gì đó như @SpacedMonkey đề xuất trong câu trả lời của mình! +1 –

Các vấn đề liên quan