如果和其他如果做同样的事情

时间:2015-05-29 13:07:25

标签: if-statement refactoring logic

我试图重构一个看起来并不特别好的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

如果有人感兴趣,我遇到的现实生活中的问题是我在javascript中获得了2个Fancytree的内容,并且我想设置一些规则来在它们之间传输节点。树A只能将单个节点传输到树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);              
}

3 个答案:

答案 0 :(得分:3)

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

if(condition1 || condition2)
  do method1;

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

答案 1 :(得分:1)

你的建议,

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

在逻辑上与

相同
if(condition1 || condition2)
  do method1;

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

它在逻辑上与你的真值表不一样,所以你的真值表或你当前的代码都是错的,如果真值表r是有意的话 do method1;

答案 2 :(得分:1)

写作

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

如果condition1正确,则执行code1并且如果condition1不正确,则仅检查condition2并且代码相应地进行。因此它与

相同
if ( condition1 ) {
    //method1
} else if ( condition2 ) {
    //method1
}