J'ai une fonction JavaScript avec plusieurs commutateurs imbriqués, ce qui est un désordre total. La fonction a été étendue au cours des derniers mois, j'aimerais maintenant restructurer le code. Dans tous les cas, une valeur différente doit être poussée vers une var déjà existante.
Voici un exemple de mon code:
switch(var1){
case 1:
switch(var2){
case 0:
switch(var3){
case 'test':
switch(i){
case 0: endresult.push({id: i, content: '123'}); break;
case 2: endresult.push({id: i, content: '124'}); break;
}
break;
default:
endresult.push({id: i, content: '125'}); break;
}
break;
case 1:
endresult.push({id: i, content: '126'}); break;
}
break;
case 2:
switch(var2){
case 0:
switch(i){
case 0: endresult.push({id: i, content: '127'}); break;
case 2: endresult.push({id: i, content: '128'}); break;
}
break;
case 1:
switch(i){
case 0: endresult.push({id: i, content: '128'}); break;
case 2: endresult.push({id: i, content: '129'}); break;
}
break;
}
break;
}
Quelle serait la meilleure façon de réécrire ceci?
3 Réponses :
Ayez une carte de toutes les variations possibles et ses valeurs:
// Key is composite of `"" + var1 + "_" + var2 + "_" + i` and trimmed `_` from back
let tree = {
'1_0_test_0': '123',
'1_0_test_2': '124',
'1_0_test': '125',
'1_0_1': '126',
...
}
let key = ("" + var1 + var2 + i).replace(/_{2,}|_+$/, '');
if (typeof tree[key] !== 'undefined') {
endresult.push({id: i, content: tree[key]});
}
mais où est var 3?
@ACD Manqué de réponse, mais le concept est clair, je pense. Devrait l'ajouter aussi.
cela ne fonctionnera pas s'il passe au cas 2 et que var3 a une valeur. et perdrait le but si vous ajoutez la condition if (var1 == 2) var3 = '' ;
Votre préoccupation est la lisibilité, n'est-ce pas? Vous devez probablement diviser un peu votre code. Et utilisez des noms de variables au lieu de 0 et 1. Vous devez également fournir plus de détails. Comme peut-il aller au-delà de 0 et 1 à 2 et 3, etc. Je ne sais pas comment vous appelez votre code.
Cependant, vous pouvez essayer (un mélange d'objets et if-else):
const decideFn = ({ var1, var2, var3, i }) = {
const decision = {
1: {
0: {
cond(i) {
if (var3 === 'test') {
if (i === 0)
endresult.push({id: i, content: '123'})
else if (i === 2)
endresult.push({id: i, content: '124'})
else
endresult.push({id: i, content: '125'})
}
else endresult.push({id: i, content: '125'})
}
},
1: {
cond(i) {
endresult.push({id: i, content: '126'})
}
}
}
2: {
0: {
cond(i) {
if (i === 0)
endresult.push({id: i, content: '127'})
else if (i === 2)
endresult.push({id: i, content: '128'})}
},
1: {
cond(i) {
if (i === 0)
endresult.push({id: i, content: '128'})
else if (i === 2)
endresult.push({id: i, content: '129'})
}
}
}
}
// usage
// does i go in a loop ?
// your qn needs more details. but i hope you get the idea
decision[var1][var2].cond(i)
}
En fin de compte, cela se résume vraiment à la façon dont vous pensez comprendre le mieux le code et comment les autres développeurs liront votre code mais personnellement, je pense que vos instructions de commutation sont correctes.
Les objets peuvent cependant donner plus de flexibilité.
Si dans tous les cas vous poussez vers la même variable, j'envisagerais de créer une fonction dont le seul travail est de déterminer la bonne valeur en fonction des variables.
Cela pourrait ressembler à ceci:
const getContentValue(var1, var2, var3, i) {
if (var1 === 1) {
if (var2 === 0) {
if (var3 === 'test') {
if (i === 0) return '123'
if (i === 2) return '124'
return '125'
}
if (var2 === 1) {
return '126'
}
}
if (var1 === 2) {
if (var2 === 0) {
if (i === 0) return '127'
if (i === 2) return '128'
}
if (var2 === 1) {
if (i === 0) return '128'
if (i === 2) return '129'
}
}
}
endResult.push({ id: i, content: getContentValue(var1, var2, var3, i) })
(Le code n'a pas été testé.)
Quelques points à noter et quelques principes à retenir:
if . Le passage d'un cas à l'autre est, à mon avis, quelque chose que l'on fait quand on a beaucoup de cas, pas quand on bascule entre deux choses. Les instructions if fonctionnent très bien lorsque vous basculez entre deux options. Si vous travaillez vraiment avec un tas de cas, disons que votre var1 pourrait en fait être plus de 10 nombres différents, il pourrait être plus simple de s'en tenir à un commutateur . switch dans votre code, il y en a beaucoup qui sont identiques dans tous les cas. Une astuce consiste à regarder les changements dans la réponse pour chaque cas. i est le même. Seuls les chiffres changent. C'est une bonne voie à suivre pour simplifier les choses. switch et d'une instruction if . Dans une fonction, si vous avez une instruction return, elle agira comme le break d'une instruction switch . Si vous revenez après chaque cas if , vous aurez l'équivalent d'un cas default lorsque vous aurez suffisamment d'informations pour savoir quoi renvoyer. (Par exemple, voyez la ligne qui dit return '125' . Nous savons que si nous arrivons à ce point, 125 devrait être renvoyé.)
pouvez-vous s'il vous plaît montrer comment vous appelez cela
J'envisagerais d'utiliser un objet pour cela. Bien qu'il puisse être un peu difficile de travailler sur l'option
defaultavez-vous des valeurs inconnues qui ne sont pas dans la structure, où vous ne voulez rien faire?
Il s'agit essentiellement d'un ensemble de conditions, par exemple, il peut être réécrit comme
if (var1 == 1 && var2 == 0 & var3 == 'test' && i == 0). La présence de tant de drapeaux apparemment disparates remet le design en question. Il n'est probablement pas nécessaire de réécrire autant que de redessiner pour simplifier complètement la logique. Il est cependant difficile de dire exactement comment être repensé sans une image plus complète. Cela pourrait également être une bonne question pour SoftwareEngineering .