2013-09-25 3 views
0

Je suis en cours d'exécution par mon code JSHint, et je suis frappé cette erreur:Ce 'commutateur' devrait être un 'si' - pourquoi?

This switch should be an if

Sur ce bloc de code:

switch(true) 
{ 
    case Major === 0 && Minor === 0 && Patch < 433: 
     upgraded = upgraded.replace(/(\s+)skill(\d)=/gm, '$1section_8_$2_body='); 
    /* falls through */ 
    case Major === 0 && Minor === 0 && Patch < 442: 
     upgraded = upgraded.replace(/test=/gm, 'void='); 
    /* falls through */ 
    case Major === 0 && Minor === 0 && Patch < 459: 
     upgraded = upgraded.replace(/another=/gm, 'void='); 
    /* falls through */ 
} 

De googler j'ai trouvé this Github issue, mais il ressemble c'était parce qu'il n'y avait que 1 case.

Comment puis-je résoudre ce problème? Je ne vois pas pourquoi ce switch devrait être un if. Est-ce que le fait que j'utilise le switch(true) a quelque chose à voir avec ça? A côté: le code se termine bien sur la version en ligne (j'utilise le plugin Notepad ++).

+4

Je suis d'accord avec JSHint. Ce 'switch' n'a pas l'air trop beau ... – elclanrs

+0

@elclanrs Comment le réécrire? Je suis un peu d'accord ... cela pourrait devenir un monstre quand il y a beaucoup de chemins de mise à niveau. –

+0

Eh bien, 'Patch' (pourquoi les majuscules?) Semble être la seule variable là-bas. Vous pouvez utiliser 'if, elseif' ou trouver un motif pour le résumer dans une recherche de dictionnaire. Je ne peux pas vous le dire sans voir d'autres parties du code. – elclanrs

Répondre

-1

Une déclaration switch est destiné à tester une seule variable ou une expression à une liste connue finie de valeurs possibles (une énumération )

var userColor = 'red'; 

switch(userColor){ 
    case 'red': 
     alert('Stop'); 
     break; 
    case 'yellow': 
     alert('Slow'); 
     break; 
    case 'green': 
     alert('Go'); 
     break; 
} 

Ce code est essentiellement un raccourci pour:

if(userColor == 'red'){ 
    alert('Stop'); 
}else if(userColor == 'yellow'){ 
    alert('Slow'); 
}else if(userColor == 'green'){ 
    alert('Go') 
} 

Dans le code que vous avez fourni, le seul facteur déterminant est la valeur de Patch puisque le reste des variables sont toujours 0.

Je recommande refactorisation votre code à une série de if/else

if(Patch < 433){ 
    //... 
}else if(Patch < 442){ 
    //... 
}else if(Patch < 459){ 
    //... 
}else{ 
    //... fall through 
} 
+0

Les autres variables * ne sont pas * toujours 0. En réalité, ce 'switch' a actuellement environ 50' cases'. De plus, votre bloc de code inférieur pourrait facilement être réécrit comme 'switch (Patch) {case 433: ... case 442: ... case 459: ...}' –

+0

Nous pouvons seulement vous aider en fonction des informations fournies. S'il y a plus à savoir éditer votre question et fournir les détails – providencemac

+0

Vous pouvez lire les commentaires sur la question pour plus d'informations. –

1

je ferais quelque chose comme:

if(Major === 0 && Minor === 0){ 
    if(Patch < 433) { 
     upgraded = upgraded.replace(/(\s+)skill(\d)=/gm, '$1section_8_$2_body='); 
    } 
    if(Patch < 442) { 
     upgraded = upgraded.replace(/test=/gm, 'void='); 
    } 
    if(Patch < 459) { 
     upgraded = upgraded.replace(/another=/gm, 'void='); 
    } 
} 

Il maintient les états sèche et est un peu plus facile à lire imo . Un commutateur serait utile si vous faisiez de l'égalité directe sur une valeur mais le < enlève tous les "avantages" d'une instruction switch.

+0

La différence avec ceci et la question est que dans la question si le commutateur évalue vrai dans tous les cas, il fait toujours les choses suivantes. Dans votre solution, il n'en fait qu'un. Par exemple, si le patch est <433, le commutateur changera de mise à jour trois fois, dans votre solution il ne le changera qu'une fois. – dajavax

+3

@dajavax Je ne pense pas que ce soit le cas (excusez le jeu de mots). Pouvez-vous me dire votre raisonnement derrière votre pensée? Si 'Patch' <433, c'est aussi <442 et 459, donc le code de pllee changerait' upgraded' trois fois aussi, non? –

+0

Les commutateurs continuent à exécuter les cas suivants, même s'ils ne sont pas vrais, sauf si vous ajoutez une interruption avant le début du cas. Edit: rien, je ne faisais pas les maths. – dajavax

Questions connexes