将 2 个 if 语句简化为一个循环

simplification of 2 if statements into a loop

我想简化一个代码片段,其中我有一个主循环,其中放置了 2 个 if 语句。第一个 if 语句是关于测试“if (test1 or test2)”,第二个是测试“if (test1 and test2)”。

目前,为了区分它们,我必须在更高级别(但仍在主循环中)放置另一个 "if"(在 diagExpression boolean 上测试,见下文);这是代码:

// Main loop 
  while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1]) 
  {   
   if (diagExpression)
     {   
      if ((a > b) || (b > c))
        return;
      else if (d)
       {   
        //do stuff1
       }   
     }   
  else
    {   
     if ((a > b) && (b > c))
        return;
     else if (d)
       {   
        //do stuff1
       }   
     }   
  }

我不知道如何简化此代码段并避免使用 stuff1 2 次。

如果有人能看到解决方案。

更新:

diagExpression 在主循环之前计算:

// Boolean for 2 versions
  var diagExpression = false;

  if (Hit.direction == 'rightbottom')
    { 
      diagExpression = true;
      shift_x = 1;
      shift_y = 1;
      factor_x = 1;
      factor_y = 1;
      limit_x = 7;
      limit_y = 7;
    }
 else if (Hit.direction == 'left')
    {
      shift_x = -1;
      shift_y = 0;
      factor_x = -1;
      factor_y = 1;
      limit_x = 0;
      limit_y = -1;
    }

...

// Main loop 
  while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1])

我在我的代码中使用了不同的方向值,如果我有对角线方向,这个布尔值是真,vertical/horizontal 方向是假。

你可以这样使用:

if (diagExpression) {
     if ((a > b) || (b > c))
        return;
     if ((a > b) && (b > c))
        return;
}
if (d){   
     //do stuff1
} 

我相信@Daniel Daranas 也是这个意思。

首先,您可以简化代码,这样 stuff1 只需编写一次:

while (…) {   
  if (diagExpression) {  
    if ((a > b) || (b > c))
      return;
  } else {
    if ((a > b) && (b > c))
      return;
  }
  if (d) {
    // do stuff1
  }
}

甚至

while (…) {   
  if (diagExpression ? (a > b) || (b > c) : (a > b) && (b > c)) {
    return;
  } else if (d) {
    // do stuff1
  }
}

然后你可以得到更高级的东西,比如

while (…) {   
  if ((a > b) + (b > c) >= 2 - diagExpression) {
    return;
  } else if (d) {
    // do stuff1
  }
}

虽然这变得相当难读,甚至可能更慢。