2013-03-14 20 views
6

Ich muss Berichte basierend auf den Benutzereingaben erstellen. Benutzer beantworten eine Frage, und dann abhängig von der Antwort gehe ich links oder rechts in einer baumartigen Struktur und stelle eine neue Frage. Einige Knoten haben die gleiche Frage, aber unterschiedliche Kinder. Ich bin nicht sicher, was wäre der beste Weg, dies in Bezug auf die Lesbarkeit des Codes zu tun?Optimierung der baumartigen Kontrollstruktur

Ich mag würde große Steuerstruktur zu vermeiden, da es extrem unleserlich sein würde, wie folgt aus:

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

Gibt es einen besseren Weg, damit umzugehen? Hier ist ein Bild, wie mein Baum sieht aus wie

enter image description here

+0

Ich denke, dass es nicht mehr optimiert werden kann, weil Kontrollstruktur der grundlegende Teil einer Sprache ist, wenn Ihre Logik sehr kompliziert ist, dann muss Ihr Programm auch kompliziert sein. Sie können jedoch die Elternkonditionen mit den Nachkommenkonditionen kombinieren, indem Sie '&&' verwenden, um die Kontrollstruktur 'plainer' zu machen, zB'if (COND1 && COND2) {} if (COND1 && COND3) {} ... 'also wird es weniger geben Verschachtelung – LotusH

Antwort

2

Speichern Sie den Baum als Daten und dann kann Ihr Code wirklich ziemlich klein sein. Wenn wir die Antwort ändern gegeben durch @ jam6549 ein wenig, was wir mit so etwas wie dies oben kommen kann:

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

Dies unterstützt nur einfache j/n Antworten, damit ich bestätigen verwenden könnte, sollten Sie ein Array verwenden, um mit ein Eintrag für jede mögliche Antwort.

Sie sagen, dass einige der Fragen wiederholt werden, so würde ich versucht sein, ein Array mit jedem eindeutigen Fragetext zu haben. Dann speichert Ihr Antwort-Array einen Index in das Frage-Array, um doppelten Text zu speichern.

+0

danke für deine antwort, ich fing an sowas zu machen, nachdem @ jam6549 mir eine idee mit seiner antwort gegeben hat! es ist ein bisschen komplizierter, da die Antworten nicht einfach Ja oder Nein sind, es kann sein, ein Datum einzugeben und dann zu prüfen, ob es größer ist als ein bestimmtes usw., aber es ist definitiv ein guter Ansatz! Ich habe auch ein Array mit jeder einzelnen Frage gemacht, um sie nicht zu wiederholen, wie Sie vorgeschlagen haben! Danke noch einmal! –

2

Wenn Sie MySQL verwenden, dann einfach eine Tabelle für Fragen und einen Tisch für Antworten wie so:

Frage Tabelle:

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

Antworten:

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

Wenn der Benutzer auf Frage 1 und wählt die erste Antwort, sie gehen Sie mit Frage 2 Wenn sie die zweite Antwort wählen gehen sie 3.

Also in Ihrem Code nur die Datenbank abfragen nach jeder Antwort mit der ID in Frage:

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

dann die nächsten Antworten bekommen wie so:

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

Hoffnung, das hilft.

+0

Vielen Dank für Ihre Antwort, es hat mir geholfen, auf die richtige Spur zu kommen! Ich habe nicht mysql verwendet, aber ich habe deine Idee benutzt, um etwas wie @SpacedMonkey in seiner Antwort vorzuschlagen! +1 –