-1

我从一个程序中得到一些特殊的输出,其中我有一些这样的 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() 处的单元格是打开的或已访问,我希望布尔检查为真。

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

我不确定我所看到的特殊性是由这些陈述还是其他原因引起的,我的问题更多是关于一般最佳实践。

编辑:感谢所有输入。我也有同样的怀疑(它太复杂了),这就是为什么我以我的方式提出我的问题。

编辑(一年后,回首往事)(更努力地重申以上内容)为了上帝的爱,不要写任何类似上述if声明的东西。如果您发现自己有类似的代码行,请记住occam 的剃刀可能比编程更适用。

4

4 回答 4

1

在我看来,它执行得很好,但是阅读起来相当困难。

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

于 2013-02-10T06:16:30.077 回答
1

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

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

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

  • 通过将代码分解为两个 if 块(如下面的重构所示),重构您的代码以不需要如此复杂的语句,或者
  • 将其提取为方法并将返回值分配给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);
于 2013-02-10T06:19:41.993 回答
1

使用另一个IFinsted 的 using &&

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;
   }
}
于 2013-02-10T06:22:23.430 回答
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()

于 2013-02-10T06:25:18.280 回答