Javascript DRY-如何将此if语句转换为不太复杂的语句

Javascript DRY-如何将此if语句转换为不太复杂的语句,javascript,if-statement,dry,Javascript,If Statement,Dry,假设我们有这六个变量:a,b,c,x,y,z。 有没有更好的方法来写这个不太难读的if语句 if (((!a && !x) || a === x) && ((!b && !y) || b === y) && ((!c && !z) || c === z)) 现在,让这些变量更长一些,这段代码会更复杂,可读性更低。一个明显的方法是对重复的代码进行函数化: function checkVars(a, b) { re

假设我们有这六个变量:
a,b,c,x,y,z
。 有没有更好的方法来写这个不太难读的if语句

if (((!a && !x) || a === x) && ((!b && !y) || b === y) && ((!c && !z) || c === z))

现在,让这些变量更长一些,这段代码会更复杂,可读性更低。

一个明显的方法是对重复的代码进行函数化:

function checkVars(a, b) {
  return !a && !b  ||  a === b;
}

// ...
if (checkVars(a, x) && checkVars(b, y) && checkVars (c, z)) {
// ...
}
正如非常正确地提到的,您应该给这个函数一个描述性的名称,显示它真正的功能。显然,它检查给定的变量是否错误或是否相同,因此一个明显的选择是
falsyordentical
。然后您的
if
语句将变成真正的自我评论:

if (falsyOrIdentical(a, x) 
 && falsyOrIdentical(b, y) 
 && falsyOrIdentical(c, z)) {

 // here goes the code
} 

如果有更多的变量需要检查,Pavlo的方法(使用
slice.call(arguments)
的单个函数将所有变量转换为一个数组,然后使用
every
方法将此函数应用到该数组的每个元素,直到失败)是最好的方法。但是,再一次,我真的想知道,所有这些变量不应该都是集合的一部分吗?因此,您可以立即使用
每个

您应该使用布尔变量以便于比较。

示例:
!a&&!x可以转换成

var aAndBeIsNotTrue = !a && !x
var bAndYIsNotTrue = !b && !y
如果声明看起来像

if(aAndBIsNotTrue || a === x) && (bAndYIsNotTrue || b === y)
我想你明白了。您还可以使用可读名称创建新方法,并将布尔逻辑放入这些方法中。这些也可以很好地进行单元测试


Clean Code book包含了使用布尔变量简化复杂if语句的好例子。

扩展函数方法。比较函数可以用作数组方法内部的回调函数。为了不将数组作为函数参数传递,我将在
参数上使用
call()

function compare() {
  return Array.prototype.every.call(arguments, function (e) {
    return !e[0] && !e[1] || e[0] === e[1];
  });
}

if (compare([a, x], [b, y], [c, z])) {
  // Do something
}

您好,我们可以使用if-else梯形图解决此问题: 这里我使用一个返回值为bool的函数CheckCondition()

CheckCondition()
  {
if((!a&&!x)||a==x)
{
if((!b&&!y)||b==y)
{
if((!c&&!z)||c==z)
{
return true;
}
else return false;
}
else return false;
}
else return false;
}

if条件也可以进一步分解为if-else梯形图。

如果可能,请记住将函数命名为描述性的。如果要检查的变量超过6个,该怎么办?是否有一些不写入的选项,例如10次
falsyoridential
?这强烈建议您应该实际使用集合(数组或对象),而不仅仅是一组变量。在本例中,Array.each看起来是此作业非常简单的解决方案。
函数checkAll(){for(var i=0;i@Tibos看起来更像是一个答案。+1,非常好的方法。)再次强调,描述性名称不会有什么坏处。您不需要创建新数组,只需调用
array.prototype.every.call(参数、函数…)
这个答案似乎更具普遍性,因此我认为它是最好的答案(当然还有投票权)@Tibos,或者更简单:使用
参数作为
every()的第二个参数
。通常使用bind创建新函数可以节省时间。您可以在许多情况下找到它,在这些情况下,您应该提供回调。使用20个变量,此函数将占用100行代码-这不是干的
!a&&!b!(a | | b)
如果这使它更容易。我总是发现在我的控制结构中尽可能少的否定更容易。