2016-04-08 14 views
0

私はこのようになりますいくつかのjsコードを見つけました:式(condition 4 && condition 5)falseとして評価された場合&&および||が多いステートメントを評価する方法条件

if (
    (condition 1) && 
    (condition 2 == condition 3) && 
    (
    (condition 4 && condition 5) && 
    (condition 6 == condition 7) || 
    (
     (condition 8 && condition 9) && 
     (condition 10 == condition 11) 
    ) 
) 
) 

は、次のコードは、trueまたはfalseとして評価するのでしょうか?そして、それはなぜtrueまたはfalseと評価されますか? &&||ステートメントが混在したステートメントを読む方法を知ろうとしています。私はこれもそうかもしれないと思ったが、もしこのコードをリファクタリングする方法があれば教えてください。

+0

varsがtrueまたはfalseでない限り、trueまたはfalseを返しません。 – dandavis

+0

@dandavisこれは間違いです。 JavaScriptでは、リテラル値以外にも、すべての値が真実性を保持します。たとえば、 'if("真実である "){alert("真実! "); } 'はアラートボックスを実行します。 – OzBarry

+1

@OzBarry:私は、4/5が 'false'なのでOPのIFが常に' false'であるとは限りません。 '0 && 1'は精神的に" not true "を読むので、' x =(0 && 1 || 0) 'は' false'と考えていますが、実際には "0 else 0"結果は「0」です。比較結果ではなくデータム結果。 IF内の式の値は、 'false'とfalseys(' 0'のように)は同じ効果を持ちます。 – dandavis

答えて

0
if(
    (condition 1) && 
    (condition 2 == condition 3) && 
    (false && (condition 6 == condition 7) 
     || ((condition 8 && condition 9) && (condition 10 == condition 11))) 
) 

"condtion4 & &条件5" が偽であることを評価された場合、文は偽です。このような複雑なif条件に直面した場合、スペーシングとインデントの適切な使用は可読性に役立ちます。また、ブール値を生成するより小さな条件文に分割することもできます。

0

各条件文を関数として読み込み、読みやすくしてください。意味を持たせるような方法で名前を付けるようにしてください(条件付きチェックは何ですか?)

function satisfiesXYZCondition = function(){ 
    (condition 4 && condition 5) && (condition 6 == condition 7) 
} 

理想的にはあなたがチェックしているものについて説明し一つの関数とif文で条件文のすべてを置き換える必要があります。

2

括弧は、トップ優先さ &&

||よりも優先されます (condition 4 && condition 5)falseであれば、結果はまだ (condition 8 && condition 9) && (condition 10 == condition 11)

if(
    (condition 1) 
    && (condition 2 == condition 3) 
    && (         --> false && x || x --> false || x = x 
     (condition 4 && condition 5) 
      && (condition 6 == condition 7) 
      || 
      (
       (condition 8 && condition 9) 
       && (condition 10 == condition 11) 
      ) 
    ) 
) 
に依存することになり MDNこの SO question

にJavaScriptで演算子の優先順位を参照してください。

これをリファクタリングすることはできますか?どうやって?条件とロジックによって異なります。

1

私は個人的に、変数に分解します。

var isAEqualToB = a === b 
var isCEqualToD = c === d 
var isEEqualToA = e === a 
var isAOrDTruthy = a || d 

var isEEqualToAAndAOrDTruthy = isEEqualToA && isAOrDTruthy 

if ((isAEqualToB || isCEqualToD) && isEEqualToAAndAOrDTruthy) { 
    // Do your thing here 
} 

多くの人が少ないのラインを持つことは良いコードの兆候であると思いますが、それは間違いなくませです。可読性と保守性は、コードを処理するすべての開発者にとってはるかに意味があります。

非常に理解しやすい変数(条件を説明する変数名を使用)に条件を分割し、単純なものに減らします。完全な条件を小さな関数に分割することも役に立ちます。

もう一つ意味のあるブール式を考えてみましょう。我々は場合にのみ、コードのブロックを実行したいとしましょう:

  • それは
  • skyColorの値が「グレー」です
  • 午前6時と午後の間であなたの名前は「ozbarry」または「ウェブ - のいずれかですDEV」
  • nの値は2またはあなたの現在の例に基づいて

999、我々のようなもので開始したいです:

var skyColor = 'grey'; 
var name = 'ozbarry'; 
var n = 2; 

if (
    // Condition 1, time is between 6am and 2pm 
    ((new Date()).getHours() >= 6 && (new Date()).getHours() <= 14) && 

    // Condition 2, skyColor is 'grey' 
    (skyColor === 'grey') && 

    // Condition 3, name is either 'ozbarry' or 'web-dev' 
    (name == 'ozbarry' || name == 'web-dev') && 

    // Condition 4, n is either 2 or 999 
    (n == 2 || n == 999) 
) { 
    // Do a thing here 
} 

これは正しいことですが、これは維持する悪夢となります。これはかなり基本的な例です。リファクタリングをしましょう!

まず、変数名は、我々がテストしているものが反映されますので、私たちは、よりよいそれらを追跡し、コメントを削除することができますので、のは、変数にこれらの条件のいくつかを引いてみましょう:

var skyColor = 'grey'; 
var name = 'ozbarry'; 
var n = 2; 

var isHourBetween6And14 = (new Date()).getHours() >= 6 && (new Date()).getHours() <= 14; 
var isSkyGrey = skyColor === 'grey'; 
var isNameValid = name === 'ozbarry' || name === 'web-dev' 
var isN2Or999 = n === 2 || n === 999 

if (
    isHourBetween6And14 && 
    isSkyGrey && 
    isNameValid && 
    isN2Or999 
) { 
    // Do a thing here 
} 

これは良いですが、そこまだいくつかの問題があります。コードの観点からは、まだまだ長いか不明確な条件があります。私は主にisHourBetween6And14を見ているんだけど、最後の二つはまた、いくつかの注意を使用して、それでは意味のある機能の中にこれらを分割しましょうことができます:最後に

function isNumberBetween(value, min, max) { 
    return value >= min && value <= max 
} 

function isValueOneOf(value, validValues) { 
    for(validIdx=0; validIdx < validValues.length; validIdx++) { 
    if (validValues[validIdx] === value) { 
     return true; 
    } 
    } 
    return false; 
} 

var skyColor = 'grey'; 
var name = 'ozbarry'; 
var n = 2; 

var isHourBetween6And14 = isNumberBetween((new Date()).getHours(), 6, 14) 
var isSkyGrey = skyColor === 'grey'; 
var isNameValid = isValueOneOf(name, ['ozbarry', 'web-dev']); 
var isN2Or999 = isValueOneOf(n, [2, 999]) 

if (
    isHourBetween6And14 && 
    isSkyGrey && 
    isNameValid && 
    isN2Or999 
) { 
    // Do a thing here 
} 

、私がやりたい事は、if文の前に長い結合条件であります。これは、将来の開発者は、それがブロックを実行するかどうかを知るために精神的にロジックを毎回行う必要がありませんが、あなたの条件がはるかに読みやすくなります。これは、物事を行うには、完全に独断的な方法です

function isNumberBetween(value, min, max) { 
    return value >= min && value <= max 
} 

function isValueOneOf(value, validValues) { 
    for(validIdx=0; validIdx < validValues.length; validIdx++) { 
    if (validValues[validIdx] === value) { 
     return true; 
    } 
    } 
    return false; 
} 

var skyColor = 'grey'; 
var name = 'ozbarry'; 
var n = 2; 

var isHourBetween6And14 = isNumberBetween((new Date()).getHours(), 6, 14) 
var isSkyGrey = skyColor === 'grey'; 
var isNameValid = isValueOneOf(name, ['ozbarry', 'web-dev']); 
var isN2Or999 = isValueOneOf(n, [2, 999]) 

var canDoThing = isHourBetween6And14 && isSkyGrey && isNameValie && isN2Or999; 

if (canDoThing) { 
    // Do a thing here 
} 

を、最も人々はリファクタリング後にコードが大きくなるのが好きではありませんが、より小さなコードよりも保守可能なコードを持つ方が良いです。

関連する問題