If statement if和else if做同样的事情

If statement if和else if做同样的事情,if-statement,refactoring,logic,If Statement,Refactoring,Logic,我正在尝试重构一个看起来不是特别好的if-else链。我的常识告诉我,我应该只能调用我的方法一次,但我想不出一个优雅的方法来实现它。目前我拥有的是: if(condition1) do method1; else if(condition2) do method1; 看起来很可怕。有重复代码!我能想到的最好办法是: if(condition1 || (!condition1 && condition2)) do method1; 但这看起来也很糟糕,因为我在or之

我正在尝试重构一个看起来不是特别好的if-else链。我的常识告诉我,我应该只能调用我的方法一次,但我想不出一个优雅的方法来实现它。目前我拥有的是:

if(condition1)
  do method1;
else if(condition2)
  do method1;
看起来很可怕。有重复代码!我能想到的最好办法是:

if(condition1 || (!condition1 && condition2))
  do method1;
但这看起来也很糟糕,因为我在or之后否定了
condition1
,这似乎是不必要的

我做了一个真相表:

 c1| c2| r
 0 | 0 | 0
 0 | 1 | 1
 1 | 0 | 1
 1 | 1 | 1
如果有人感兴趣,我面临的现实问题是,我在javascript中有两个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);              
}

您可以进行更多简化-如果第一个条件为
true
,则应调用该方法,而不管第二个条件如何。所以
!重构代码中的条件1
是多余的。相反,您可以:

if(condition1 || condition2)
  do method1;
在现代编程语言中,if条件甚至会短路。这意味着当第一个条件被计算为
true
时,第二个条件甚至不会被计算。

您的建议

if(condition1 || (!condition1 && condition2))
  do method1;
逻辑上与

if(condition1 || condition2)
  do method1;
所以我认为这是你最好的答案

但是,它在逻辑上与真值表不同,所以如果真值表r是要这样做的话,那么你的真值表或你当前的代码都是错误的
do方法1

以书面形式

if (condition1 || condition2) {
    //code1
}
如果条件1正确,则执行代码1,如果条件1不正确,则只检查条件2,代码相应地继续。因此,它将与

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

在第二个代码中否定第一个条件有意义吗?如果condition1为true,它将不会转到condition2,如果它返回false,它将转到检查condition2。您在第一个代码段中拥有的是一个简单的
。真值表在我看来似乎是错误的:您能检查吗?它不是。我需要否定
上的条件1。如果我不这样做(最后参考javascript代码),我将不允许有子节点的树B节点移动。您的真值表是错误的。对于你的真理表来说,它将是!条件1 | |条件2但上面的代码不是这样写的。你是对的。我觉得我什么都没做,浪费了大家的时间。我觉得自己很笨。很抱歉