If statement if和else if做同样的事情
我正在尝试重构一个看起来不是特别好的if-else链。我的常识告诉我,我应该只能调用我的方法一次,但我想不出一个优雅的方法来实现它。目前我拥有的是: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(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但上面的代码不是这样写的。你是对的。我觉得我什么都没做,浪费了大家的时间。我觉得自己很笨。很抱歉