2013-03-14 18 views
6

Muszę tworzyć raporty na podstawie danych wprowadzanych przez użytkownika. Użytkownik odpowiada na pytanie, a następnie, w zależności od odpowiedzi, podążam w prawo lub w lewo w strukturze przypominającej prążek i pytam o nowe pytanie. Niektóre węzły będą miały to samo pytanie, ale inne dzieci. Nie jestem pewien, jaki byłby najlepszy sposób, aby to zrobić w zakresie czytelności kodu?Optymalizowanie struktury kontrolnej w oparciu o prążki

Chciałbym uniknąć ogromną strukturę kontroli, ponieważ byłoby to bardzo nieczytelny, tak:

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

Czy jest jakiś lepszy sposób, aby sobie z tym poradzić? Oto obraz, jak moje drzewo wygląda

enter image description here

+0

Myślę, że nie można już zoptymalizować, ponieważ struktura kontroli jest bardzo podstawową częścią języka, jeśli twoja logika jest bardzo skomplikowana, to twój program również musi być skomplikowany. Możesz jednak łączyć warunki rodzicielskie z warunkami potomnymi, używając '&&', aby struktura kontrolna była "jaśniejsza", np. 'If (COND1 && COND2) {} jeśli (COND1 && COND3) {} ...' w ten sposób będzie mniej Nesting – LotusH

Odpowiedz

2

Przechowuj drzewo jako dane, a Twój kod może być naprawdę mały. Jeśli będziemy modyfikować odpowiedź udzieloną przez @ jam6549 trochę możemy wymyślić coś takiego:

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

obsługuje tylko proste T/N odpowiedzi, więc mogłem używać potwierdzić, będziemy chcieli wykorzystać tablicę wpis dla każdej możliwej odpowiedzi.

Mówisz, że niektóre pytania są powtarzane, więc chciałbym mieć tablicę z każdym unikalnym tekstem pytania. Następnie tablica odpowiedzi przechowuje indeks w tablicy pytań, aby zapisać powielony tekst.

+0

dzięki za odpowiedź, zacząłem robić coś takiego, po @ jam6549 dał mi pomysł z jego odpowiedzią! Jest to nieco bardziej skomplikowane, ponieważ odpowiedzi nie są proste tak lub nie, może to być data wprowadzenia, a następnie sprawdzenie, czy jest większa niż konkretna itd., ale zdecydowanie jest to dobre podejście! Zrobiłem także tablicę z każdym unikalnym pytaniem, aby nie powtarzać ich tak, jak sugerowałeś! dzięki jeszcze raz! –

2

Jeśli używasz mysql po prostu mieć stolik na pytania i stół dla odpowiedzi tak:

Pytanie Tabela:

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

odpowiedzi Tabela:

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

Jeśli użytkownik na pytanie 1 i wybiera pierwszej odpowiedzi, idą na pytanie 2. Jeżeli wybierz drugą odpowiedź idą na pytanie 3.

to w kodzie tylko kwerendy bazy danych po każdej odpowiedzi za pomocą ID:

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

następnie uzyskać następujące odpowiedzi tak:

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

nadzieję, że pomoże.

+0

wielkie dzięki za odpowiedź, pomógł mi przejść na właściwą drogę! Nie użyłem mysql, ale użyłem twojego pomysłu, aby w jego odpowiedzi zasugerować coś takiego jak @SpacedMonkey! +1 –