使用xor运算符进行布尔检查是否是一种好习惯?
我个人喜欢在布尔检查的上下文中有意义的排他或者^
运算符,因为它简洁。我更喜欢写
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(")