2011-02-16 22 views
2

我有下面的代码行:Java编码标准和多种IF的

if(
    checker.this()==false || 
    checker.that()==false || 
    checker.what()==true|| 
    checker.cool()==false || 
    checker.damm()==true 
    (...) 
) 
{ 
    option = Option.FALSE; 
} 

拥有约20确认了必须执行。我发现这是编写这个if与多个OR序列最“可视的容忍”的形式,但我还没有满意。这是否有编码标准?

谢谢。

回答

11

的最接近编码围绕这一标准的是史蒂夫麦康纳尔,其权威着作“代码完整”建议复杂的条件被考虑到他们自己的方法中,即使他们只使用一次。这允许方法的名称描述正在发生的事情。

if (checkValid(checker)) {...} 

private boolean checkValid(Checker checker) {...} 

checkValid当然不是一个好名字,应该用一些更具描述性的名称来代替。在这种情况下,您可能希望使“checker”对象的检查方法成为部分。

您还应该避免“something == true”和“something == false”,并使用“something”和“!something”。如果您给布尔方法适当的名称,比如“isOpen()”,“isEmpty()”,而不是“open()”和“empty()”,这个过程是有帮助的。 “checker.isOpen()& &!checker.isEmpty()”是完全清楚的阅读。

11

foo==false应更好地与!foo

可能写的,你可以将这个大如果在一个单独的方法:if (checker.complexConditionMet())if (complexConditionMet(checker))。它会提高可读性。

+0

@Bozho同意,不过我的问题在于多行“OR”的冗长行...... – Frankie 2011-02-16 14:06:12

+4

为了清晰起见,我更喜欢`foo == false'而不是`!foo`,因为`!`可以容易被忽视。这都是(个人)品味的问题 – 2011-02-16 14:07:02

+1

是的,我认为这是总结。推动代码到一个单独的方法,并把垃圾放在那里,好主意。 – Frankie 2011-02-16 14:08:31

4

checker.this()==false可以通过!checker.this()

3

我从来没有听到这样的事一个编码标准所取代。就个人而言,我会将几个if组合成考虑可读性的方法。例如,如果你有这样的:

if (this || that || what || where || why || cool || wow){ ... } 

你可以将其替换为:

if (pronouns() || questions() || exclamations()){ ... } 
2

我会想办法找到任何的各种检查之间共同的意义,并从他们创造的功能。

当将它们捆绑在一起描述某种离散的,有意义的事务或需求状态时,可以使代码变得更加神奇,更易于阅读,更易于测试。

即这样的事情,这是一个有点“神奇”

if (a == "world" || b == "dolly" || c == 42 || murder()) { 

} 

可以通过它改变的东西更多类似这样的呈现更易读:

if (canSayHello() || canMeanLife()) { 

} 
... 

boolean canSayHello() { 
    return a == "world" || b == "dolly" 
} 

boolean canMeanLife() { 
    return c == 42 || murder(); 
}