我从程序中得到了一些特殊的输出,其中我有一些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可能比编程更有用。
答案 0 :(得分:1)
在我看来,它表现得很好,但是阅读相当困难。
如果你要在if语句中使用&&
,你也可以嵌套一个新的if语句,在大多数情况下它基本上都是一样的。
答案 1 :(得分:1)
分解你的布尔语句,它的内容如下:
(a == x_1 || a == x_2) && (b == x_3 || b == x_4)
不幸的是,这就像特定的布尔语句一样简单。有一些方法可以让疼痛变得更容易:
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()
。