2013-02-10 96 views
-1

我碰到一个程序是一些具有特殊的输出中,我有几个if语句是这样的:||和&&在一个单一的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; 
} 

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

这段代码,我现在编写的方式,是否正确执行此检查?也许更重要的是,写这样的陈述是否可怜的形式?将它分成两个陈述会更好吗?

我不确定我看到的特性是由这些语句还是别的,我的问题更多的是关于一般性的最佳实践。

编辑:谢谢你的所有输入。我很怀疑(这太复杂了),这就是为什么我按照我的方式构思了我的问题。

EDIT(一年后,回头看)(重述以上更发奋)对上帝的爱,不要写类似于上面的if声明任何东西。如果您发现自己的代码行类似,请记住occam's razor可能比编程更适用。

+4

您的if语句非常复杂。我认为这使得难以理解。我认为您需要的REAL解决方案是将其分解为两个if语句,或者重构您的方法以不需要这种复杂化。 – theJollySin 2013-02-10 06:11:17

+2

我看不到这里的复杂性或真正的问题。如果前两个条件中的任何一个解析为“真”,并且后两个条件中的任何一个解析两个“真”......则将“检查”设置为“真”。这是一个非常基本的if语句。 – 2013-02-10 06:20:25

回答

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()

+0

...为什么不直接将'check'赋值为布尔比较的结果...? – Makoto 2013-02-10 06:25:41

+0

@Makoto是的,也将这样做。 – 2013-02-10 06:26:09

1

它在我看来它正确执行,但它很难阅读。

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

+0

如果有一个else语句,它就不一样了,您将不得不复制该代码以获得相同的效果。 – Arjan 2013-02-10 06:24:38

+0

@Arjan在那里你会使用一个重复代码的else语句 - 如果我理解你的话,你最好使用'||'。但即便如此,这就是为什么我在大多数情况下基本上说,而不是绝对。 – Enfyve 2013-02-10 06:27:14

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); 
1

使用另一个IF insted的使用&&的:

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; 
    } 
} 
+0

这是......完全一样的东西。 – 2013-02-10 06:23:17