2013-03-14 13 views
6

Devo creare report in base all'input dell'utente. L'utente risponde a una domanda, quindi, a seconda della risposta, vado a sinistra o a destra in una struttura simile a un albero e faccio una nuova domanda. Alcuni nodi avranno la stessa domanda, ma diversi bambini. Non sono sicuro quale sarebbe il modo migliore per farlo in termini di leggibilità del codice?Ottimizzazione della struttura di controllo del treelike

Vorrei evitare di enorme struttura di controllo, come sarebbe estremamente leggibile, in questo modo:

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

C'è qualche modo migliore per trattare con esso? Ecco un'immagine di come il mio albero assomiglia

enter image description here

+0

Penso che non possa essere più ottimizzato perché la struttura di controllo è la parte basilare di un linguaggio, se la tua logica è molto complicata allora anche il tuo programma deve essere complicato. Tuttavia puoi combinare le condizioni genitore con le condizioni discendenti usando '&&' per rendere la struttura di controllo 'più semplice', ad esempio '(COND1 && COND2) {} if (COND1 && COND3) {} ...' quindi ci saranno meno nidificazione – LotusH

risposta

2

Archivia l'albero come dati e quindi il tuo codice può essere davvero piccolo. Se modifichiamo la risposta data da @ jam6549 un po 'siamo in grado di trovare qualcosa di simile:

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

Questo supporta solo semplice S/N risposte in modo da poter usare conferma, ti consigliamo di utilizzare un array con una voce per ogni possibile risposta.

Hai detto che alcune delle domande sono state ripetute, quindi sarei tentato di disporre di un array con ciascun testo di domanda univoco. Quindi l'array di risposte memorizza un indice nell'array delle domande per salvare il testo duplicato.

+0

grazie per la tua risposta, ho iniziato a fare qualcosa del genere, dopo @ jam6549 mi ha dato un'idea con la sua risposta! è un po 'più complicato, dal momento che le risposte non sono semplici sì o no, può essere inserire la data e poi verificare se è maggiore di una specifica ecc., ma è sicuramente un buon approccio! ho anche creato un array con ogni domanda unica per non ripeterli come suggerivi tu! grazie ancora! –

2

Se si utilizza MySQL poi semplicemente avere un tavolo per domande e un tavolo per le risposte in questo modo:

Domanda Tabella:

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

risposte Tabella:

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

Se l'utente è su domanda 1 e seleziona la prima risposta, vanno alla domanda 2. Se si seleziona la seconda risposta vanno a mettere in discussione 3.

Quindi nel tuo codice appena interrogare il database dopo ogni risposta utilizzando l'ID:

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

quindi ottenere i prossimi risposte in questo modo:

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

Speranza che aiuta.

+0

grazie mille per la tua risposta, mi ha aiutato ad andare sulla buona strada! non ho usato mysql, ma ho usato la tua idea per fare qualcosa come @SpacedMonkey suggerito nella sua risposta! +1 –

Problemi correlati