||和&&在单个if语句中

时间:2013-02-10 06:06:55

标签: java

我从程序中得到了一些特殊的输出,其中我有一些if语句:

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border) 
    && (m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){
    check = true;
}

我有两个&&和||在相同的if条件下使用。如果getLeft()的单元格是墙或边框,并且getBelow()的单元格是打开的或访问过的,我希望布尔检查成为真。

这段代码,我现在编写的方式,是否正确执行此检查?也许更重要的是,写这样的声明是不是很糟糕?把它分成两个陈述会更好吗?

我不确定我所看到的特殊情况是由这些陈述或其他因素引起的,我的问题更多是关于一般最佳做法。

编辑:感谢所有的输入。我怀疑它(太复杂了),这就是我按照我的方式设置问题的原因。

编辑(一年后,回头看看) (为了更加努力地重申上述内容)对于上帝的爱,不要写任何像{{1上面的语句。如果您发现自己有类似的代码,请记住occam's razor可能比编程更有用。

4 个答案:

答案 0 :(得分:1)

在我看来,它表现得很好,但是阅读相当困难。

如果你要在if语句中使用&&,你也可以嵌套一个新的if语句,在大多数情况下它基本上都是一样的。

答案 1 :(得分:1)

分解你的布尔语句,它的内容如下:

(a == x_1 || a == x_2) && (b == x_3 || b == x_4)

不幸的是,这就像特定的布尔语句一样简单。有一些方法可以让疼痛变得更容易:

  • 将代码重构为不需要复杂的语句,将其分解为两个if-blocks(如下面的重构中所示)或
  • 将其解压缩为方法并将返回值指定给check。老实说,它要么是真的要么是假的。

这是重构方法的一个例子。我不知道m究竟是什么:

public boolean isCheck(M m, Position p) {
    boolean retVal = false;

    if(m.getLeft(p).state == p.state.wall || m.getLeft(p).state == p.state.border)) {
        if((m.getBelow(p).state == p.state.open || m.getBelow(p).state == p.state.visited))
            retVal = true;
         }
     }

     return retVal;
 }

 // call it as such

 check = isCheck(m, position);

答案 2 :(得分:1)

使用其他IF代替&&

if(m.getLeft(position).state == position.state.wall || 
   m.getLeft(position).state == position.state.border){
   if(m.getBelow(position).state == position.state.open || 
      m.getBelow(position).state == position.state.visited){
         check = true;
   }
}

答案 3 :(得分:1)

您复杂的if语句可以重构为:

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) {
    if((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){
        check = true;
    }
}

感谢@Makoto:

check = ((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) && ((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited));

您的代码以及此代码“有效”。

但是,请记住,坚持Java风格指南中提到的命名约定。我不知道代码中的m是什么。必须避免这种命名对象引用。此外,state似乎是您班级中的public字段(假设)。还应该避免这种公共访问领域。而是使用getters()setters()