我正在尝试重构一个看起来不是特别好的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中有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);
}
您可以进一步简化-如果第一个条件是true
,则无论第二个条件如何,都应该调用方法。因此,重构代码中的!condition1
是多余的。相反,您可以输入:
if(condition1 || condition2)
do method1;
在现代编程语言中,if条件甚至会短路。这意味着当第一个条件被计算为true
时,第二个条件甚至不会被计算。
你的建议,
if(condition1 || (!condition1 && condition2))
do method1;
在逻辑上与
相同if(condition1 || condition2)
do method1;
所以我认为这是你最好的答案。
它在逻辑上与你的真值表不一样,所以如果真值表r是要做的,那么你的真值表或你当前的代码是错误的do method1;
文字
if (condition1 || condition2) {
//code1
}
如果condition1正确,则执行code1,如果condition1不正确,则只检查condition2,并相应地执行代码。因此,它将与
相同if ( condition1 ) {
//method1
} else if ( condition2 ) {
//method1
}