使用xor运算符进行布尔检查是否是一种好习惯?

时间:2020-03-06 15:00:28  来源:igfitidea点击:

我个人喜欢在布尔检查的上下文中有意义的排他或者^运算符,因为它简洁。我更喜欢写

if (boolean1 ^ boolean2)
{
  //do it
}

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

但是我经常会从其他经验丰富的Java开发人员(不仅是新手)中获得困惑的外观,有时还会评论如何仅将其用于按位运算。

我对有关使用^运算符的最佳做法感到好奇。

解决方案

我们可以简单地使用!=代替。

我认为,如果我们发表评论的话就可以了。 // ^ == XOR

如果使用方式合理,为什么不呢?尽管团队无法立即识别出操作员,但他们会及时识别。人类一直在学习新单词。为什么不在编程中?

我可能要指出的唯一警告是" ^"不具有第二个布尔检查的短路语义。如果我们确实需要短路语义,那么静态util方法也可以使用。

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}

我想我们已经回答了自己的问题,如果我们发现别人看起来很奇怪,那么使用更明确的选项可能更安全。

如果我们需要对其进行评论,那么最好将其替换为更详细的版本,而不要让人们首先问这个问题。

我最近在工作的JavaScript项目中使用了xor,最后添加了7行注释来解释发生了什么。在这种情况下使用xor的理由是其中一个术语(在下面的示例中为term1)可以取两个值,而不是三个值:undefined,true或者false,而另一个则取为term2. )可以是" true"或者" false"。我将不得不为undefined情况添加一个额外的检查,但是使用xor,以下内容就足够了,因为xor强制第一个条件首先被评估为布尔值,而将'undefined'视为'false':

if (term1 ^ term2) { ...

最后,这有点过分了,但是我还是想把它保留在那儿,就像是个复活节彩蛋。

我发现我有很多类似的对话。一方面,我们有一种紧凑,有效的方法来实现自己的目标。另一方面,团队其他成员可能不了解某些内容,因此将来很难维护。

我的一般规则是询问所使用的技术是否合理,可以期望一般程序员知道。在这种情况下,我认为期望程序员知道如何使用布尔运算符是合理的,因此在if语句中使用xor是可以的。

例如,使用xor交换两个变量而不使用临时变量的技巧将使事情变得不正常。我不希望所有人都熟悉这种技巧,因此不会通过代码审查。

!=比较两个变量是可以的。但是,进行多次比较无法正常工作。

if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
}

恕我直言,此代码可以简化:

if(boolean1 != boolean2) 
{ 
  //do it 
}

str.contains("!=") ^ str.startsWith("not(")

对我来说比看起来更好

str.contains("!=") != str.startsWith("not(")