2015-05-29 60 views
2

我试图重构一个if-else链看起来不太好。我的常识是告诉我,我应该只能打电话给我的方法一次,但我无法找到一个优雅的方式来做到这一点。目前我所拥有的是:如果和如果做同样的事

if(condition1) 
    do method1; 
else if(condition2) 
    do method1; 

看起来很丑陋。有重复的代码!我能想出的最好的是:

if(condition1 || (!condition1 && condition2)) 
    do method1; 

但是,这也很糟糕,因为我否定后condition1或者,这似乎是不必要的...

我做了一个真值表如下:

c1| c2| r 
0 | 0 | 0 
0 | 1 | 1 
1 | 0 | 1 
1 | 1 | 1 

而如果有人有兴趣,我在现实生活中的问题是,我得到了2个intances Fancytree的JavaScript和我想要一些规则设置为它们之间传输的节点。树中只能孤独的节点转移到树B,而B树可以自由重新排序本身,所以我把这个B树的dragDrop事件:

if(data.otherNode.tree === node.tree){ 
    data.otherNode.moveTo(node, data.hitMode); 
} 
else if(!data.otherNode.hasChildren()){ 
    data.otherNode.moveTo(node, data.hitMode);    
} 
+1

是否有一个否定第二个代码中的第一个条件的一点?如果condition1给出true,它将不会进入condition2,如果它返回false,它会去检查condition2。 – SEJBR

+0

你在第一个代码片段中有一个简单的'OR'。 – dasblinkenlight

+2

真相表对我来说似乎不对,你能检查吗? –

回答

3

您可以更加简化 - 如果第一个条件是true时,方法应该被调用而不管第二个条件是。所以重构代码中的!condition1是多余的。相反,您可能只有:

if(condition1 || condition2) 
    do method1; 

在现代编程语言中,if条件甚至会短路。这意味着当第一个条件评估为true时,第二个条件甚至不会被评估。

+0

这就是我要说的。 – Belicosus

+0

你是对的。我觉得我没有什么可怕的东西,浪费了每个人的时间。我觉得很愚蠢。抱歉。 – bpromas

1

你的建议是什么,

if(condition1 || (!condition1 && condition2)) 
    do method1; 

在逻辑上是一样的

if(condition1 || condition2) 
    do method1; 

所以我认为这是你最好的答案。

这不是逻辑上与您的真值表虽然如此,无论是你的真理表或当前的代码是错误的,如果真值表r为意思做 do method1;

1

在写

if (condition1 || condition2) { 
    //code1 
} 

如果条件1是正确的,则执行代码1,并且如果条件1不正确,则只检查条件2并且代码相应地继续。因此,它会是相同的

if (condition1) { 
    //method1 
} else if (condition2) { 
    //method1 
} 
相关问题