2017-09-05 3 views
2

J'essaie d'améliorer mon code en réduisant le nombre de répétitions.Javascript Améliorer l'instruction de changement de code

Dans le code ici, je veux éviter cette étape de commutation, car les différents cas sont les mêmes à l'exception des opérateurs de comparaison === et !==.

function Test(step, nb_change, name, value, previous_name){ 
    switch (step) { 
     case 1: 
      for (var i = 0; i < nb_change; i++) { 
       if (name === previous_name[nb_change-1-i][1] && value === 'nd') { 
        To_change(i); 
        return true; 
       } 
      } 
      return false; 
     case 2: 
      for (var i = 0; i < nb_change; i++) { 
       if (name === previous_name[nb_change-1-i][1] && value !== 'nd') { 
        To_change(i); 
        return true; 
       } 
      } 
      return false; 
     case 3: 
      for (var i = 0; i < nb_change; i++) { 
       if (select_name !== previous_name[nb_change-1-i][1] && value !== 'nd') { 
        To_change(i); 
        return true; 
       } 
      } 
      return false; 
     default: 
      alert('ERROR'); 
      break; 
    } 
} 

N'hésitez pas à proposer une solution qui pourrait m'aider.

Ceci est juste un cas d'un lot! Comment puis-je trouver de l'aide pour améliorer mon code quand je suppose que cela aurait pu être mieux écrit?

Nous vous remercions de votre aide.

+6

https://codereview.stackexchange.com/ – j08691

+0

Regardez chaque corps de chaque cas. Déterminez ce qui est pareil dans chacun, et ce qui est différent. Faire les parties semblables le corps d'une fonction, et faire les différents paramètres de pièces à la fonction. C'est la méthode de base pour généraliser le code. – Carcigenicate

+0

@ j08691 Je ne savais pas que c'était une chose, cool. – jcollum

Répondre

1

Vous pouvez utiliser une fonction qui reçoit un paramètre qui décrit comment l'égalité doit être gérée. Ici, nous pouvons tirer parti des opérations au niveau du bit pour donner la description désirée.

function Test(step, nb_change, name, value, previous_name) { 
    const BOTH_EQ = 3; 
    const NAME_EQ = 2; 
    const NO_EQ = 0; 

    switch (step) { 
     case 1: 
      return myFunc(BOTH_EQ, nb_change, name, previous_name, value); 
     case 2:   
      return myFunc(NAME_EQ, nb_change, name, previous_name, value); 
     case 3:   
      return myFunc(NO_EQ, nb_change, name, previous_name, value) 
     default: 
      alert('ERROR'); 
      break; 
    } 
} 

function myFunc(compare, nb_change, name, previous_name, value) { 
    for (var i = 0; i < nb_change; i++) { 
     const first_eq = (name === previous_name[nb_change-1-i][1]) << 1; 
     const second_eq = value === 'nd'; 

     if (compare === (first_eq | second_eq)) { 
      To_change(i); 
      return true; 
     } 
    } 
    return false; 
} 

Le paramètre compare passe constantes nommées qui décrivent le résultat de OR ing le premier comparateur d'égalité (décalée d'un bit vers la gauche) avec la deuxième comparaison d'égalité.

Cela fonctionne parce que true sera contraint au numéro 1 et false à 0. Nous avons donc quatre résultats possibles:

true, true == ((true << 1) | true) == ((1 << 1) | 1) == (0010 | 0001) == 3 
true, false == ((true << 1) | false) == ((1 << 1) | 0) == (0010 | 0000) == 2 
false, true == ((false << 1) | true) == ((0 << 1) | 1) == (0000 | 0001) == 1 
false, false == ((false << 1) | false) == ((0 << 1) | 0) == (0000 | 0000) == 0 
+0

@JamesThorpe: Vous avez raison, j'ai raté ça. Mettra à jour. – spanky

+0

Grand les opérations au niveau du bit! Votre exemple est bon, mais je n'ai pas besoin de l'instruction switch et je peux simplement utiliser l'égalité const directement à la place de ma variable step. – jardindeden

+0

@jardindeden: Oui, si vous pouvez changer de «step», c'est définitivement la voie à suivre. – spanky

0

Peut-être quelque chose comme ça.

function Test(step, nb_change, name, value, previous_name){ 
 
    var result = false;  
 
    for (var i = 0; i < nb_change; i++) { 
 
    var result = false; 
 
    switch (step) { 
 
     case 1: 
 
     result = name === previous_name[nb_change-1-i][1] && value === 'nd'; 
 
     break; 
 
     case 2: 
 
     result = name === previous_name[nb_change-1-i][1] && value !== 'nd'; 
 
     break; 
 
     case 3: 
 
     result = name !== previous_name[nb_change-1-i][1] && value !== 'nd' 
 
     break; 
 
    default: 
 
     alert('ERROR'); 
 
     break; 
 
    } 
 

 
    if (result) { 
 
     To_change(i); 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
}

0
function Test(step, nb_change, name, value, previous_name){ 
    var valueCheck, 
     nameCheck; 

    switch (step) { 
     case 1: 
      valueCheck = value === 'nd'; 
      nameCheck = name === previous_name[nb_change-1-i][1]; 
     case 2: 
      valueCheck = value !== 'nd'); 
      nameCheck = name === previous_name[nb_change-1-i][1]; 
     case 3: 
      valueCheck = value !== 'nd'; 
      nameCheck = select_name !== previous_name[nb_change-1-i][1]; 
     default: 
      alert('ERROR'); 
      break; 
    } 

    for (var i = 0; i < nb_change; i++) { 
     if (nameCheck && valueCheck) { 
      To_change(i); 
      return true; 
     } 
    } 
    return false; 
}