2017-09-05 9 views
2

繰り返し回数を減らしてコードを改善しようとしています。Javascript改善コード切り替えステートメント

このコードでは、比較演算子===!==を除いて、異なるケースが同じであるため、この切り替え手順を避けたいと思います。

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

私に役立つ解決策を提案するのをためらってください。

これはたくさんのケースの1つです。 コードを改善したほうがよいと思われるときに、どのようにしてヘルプを見つけることができますか?

ありがとうございました。

+6

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

+0

各例各ボディを見てください。それぞれが同じで何が違うのかを理解する。同様のパーツを関数の本体にし、異なるパーツパラメータを関数に付けます。それがコードを一般化する基本的な方法です。 – Carcigenicate

+0

@ j08691私はそれがクールなものであることを知らなかった。 – jcollum

答えて

1

同等性の処理方法を示すパラメータを受け取る関数を使用できます。ここでは、ビット単位の操作を利用して、望ましい記述を与えることができます。

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

compareパラメータが第1等価比較をINGのORの結果を記述する名前付き定数を通過する第二の等式比較して(左に1ビットシフト)。

trueは番号1false0に強制されるため、これが機能します。したがって、次の4つの結果が得られます。

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:そうです、私はそれを逃しました。更新されます。 – spanky

+0

ビット操作が素晴らしい!あなたの例は良いです、私はswitch文を必要とせず、私は単純にconst変数をそのまま私のstep変数の代わりに使うことができます。 – jardindeden

+0

@ jardindeden:はい、あなたが 'ステップ'を変更できるなら、それは間違いなく行く方法です。 – spanky

0

多分このようなものです。

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; 
} 
関連する問題