Se le istruzioni vs casi di interruttore? in un gioco JavaScript e se usare una funzione [duplicato]

5

Sto sviluppando un gioco in JavaScript dove inizi con un input utente, memorizzato nella variabile "controller". Le opzioni per l'utente consistono in iniziare a iniziare il gioco o in procinto di apprendere il gioco. Stavo per usare il seguente codice

if(controller === "start"){
    // Game code sitting here
}
else if(controller === "about"){
    // All about the Game
}
else{
    // Tells the user again to type start to start or about to learn about the game
}

quando ho capito che forse dovrei usare i casi di interruttore invece ...

Quindi, la mia domanda è quando utilizzare casi di switch invece di istruzioni if e che dovrei usare in questo caso. Vorrei anche sapere se pensi che dovrei memorizzare il mio codice di gioco in una funzione e chiamarlo se il controller è uguale a "start" o semplicemente averlo seduto all'interno dell'istruzione if / caso di commutazione come è atm?

    
posta Ben Watkins 23.12.2013 - 01:18
fonte

3 risposte

8

When to use switch instead of if statements?

Utilizza switch anziché if quando:

  1. Stai confrontando più condizioni possibili di un'espressione e l'espressione stessa non è banale.
  2. Hai più valori che potrebbero richiedere lo stesso codice.
  3. Hai alcuni valori che richiedono essenzialmente l'esecuzione di un altro valore, oltre a poche dichiarazioni.

Utilizza if anziché switch quando:

  1. Vuoi testare per la veridicità di un'espressione.
  2. Hai solo un singolo test affermativo.
  3. Devi valutare diverse espressioni per ogni ramo.

which I should use in this case?

Qualunque sia la tua maggiore comodità. Per una valutazione del motore statale, otterresti un po 'di flessibilità con un'istruzione switch , in quanto potresti aggiungere più facilmente dei sinonimi. Ma la differenza è troppo piccola per avere importanza.

Should [I] store my game code in [seperate] functions, or just have it sitting inside the if statement/switch case as it is atm?

Dovresti assolutamente spostare il codice interno di ciascun ramo in funzioni distinte. Non è possibile testare facilmente la funzionalità se si trova nel mezzo di una funzione di mille righe.

    
risposta data 23.12.2013 - 06:02
fonte
4

Semantica, semantica, semantica.

Personalmente, in una situazione come questa, faccio un giudizio su quale sarà più facile da capire.

Ciò che influenza la facilità di comprensione, ancora una volta, a mio parere, è forse una combinazione di diversi fattori:

  1. Collettivamente esauriente - Esiste un modo specifico per gestire ogni valore legale? Se è così, un interruttore potrebbe essere in ordine.
  2. Dipendenza / mutua esclusiva - Le condizioni dipendono l'una dall'altra? In tal caso, un'istruzione if potrebbe essere più flessibile.
  3. Più di 2 casi: switch / case ha un overhead cognitivo per me, quindi sarei irritato nel vedere un interruttore / caso per vero / falso. Forse perché if (x) { } else { } è più snello.
  4. Quanto sono simili le azioni? Cadono nello stesso dominio? Se un caso imposta o restituisce una variabile, mentre un altro caso esegue una funzione che muta alcuni stati e un altro caso stampa / emette un'informazione, non lo farei perché i casi non sono affatto correlati. Se tutti, tuttavia, attivano una selezione di menu ed eseguono una funzione diversa come passaggio successivo, questo è un buon passaggio perché tutti i casi scelgono un "passaggio successivo".

I primi due, collettivamente esaurienti e mutuamente esclusivi, vengono da me pensando a un passaggio fisico. Diciamo che ho un interruttore che può essere in 5 stati. Per essere davvero un interruttore, può essere solo in uno stato in un dato momento. Non può mai non avere uno stato e non può coesistere con un altro stato. Nel software, è come dire che per ogni input, almeno una delle case statement deve corrispondere (incluso il default) ..

Ancora una volta, questa è la mia preferenza personale. Non so se ci sono delle linee guida ufficiali su questo.

    
risposta data 23.12.2013 - 04:49
fonte
0

I casi si adattano bene a questa operazione. È inoltre possibile creare un'istanza di un dizionario Singleton e quindi popolarlo con tutte le funzioni necessarie per il controller e quindi passare semplicemente attraverso il dizionario ogni volta che viene attivato il controller.

L'uso di if / then risulterebbe problematico poiché sarebbe molto più difficile da gestire rispetto a un'istruzione case o a un dizionario.

    
risposta data 23.12.2013 - 01:21
fonte

Leggi altre domande sui tag