简化条件
本文关键字:条件 | 更新日期: 2023-09-27 18:16:11
我有这样的代码:
int someValue = 100;
if (x == 5)
{
if (someCondition)
{
return someValue;
}
return someValue / 12;
}
if (x == 6)
{
if (someCondition)
{
return someValue * 12;
}
return someValue;
}
如您所见,someCondition总是相同的,只是返回值不同。有没有办法再简化一下?
让我们看看,你觉得这个怎么样?
int someValue = 100;
if (x == 5)
return someCondition ? someValue : (someValue / 12);
else if (x == 6)
return someCondition ? (someValue * 12) : someValue;
这取决于你所说的简化是什么意思。
下面的代码行数更少,并且在可读性(IMO)方面没有牺牲任何东西:
var someValue = 100;
switch (x)
{
case 5:
return someCondition ? someValue : someValue / 12;
case 6:
return someCondition ? someValue * 12 : someValue;
default:
return someValue;
}
这没有嵌套语句,所以对我来说看起来更干净:
int someValue = 100;
if ((x == 5 && someCondition) || (x == 6 && !someCondition))
return someValue;
if (x == 5)
return someValue / 12;
if (x == 6)
return someValue * 12;
处理同一条件语句的结果有不同的方法。因此,保持原来的样子可能更有效(也更省眼)。
如果你的return
表达式对于每个条件语句都是相同的,那么我会修改代码,但是每个代码块都有不同的return
值,因此它是唯一的。
所以,不,真的没有办法简化你所做的。
你有两个变量(x
和someCondition
)和3个不同的结果;所以,是的,你可以做得比两对嵌套测试更好。你能做的最好的就是:
if (((x == 5) && someCondition)) ||
((x == 6) && !someCondition)))
{
return someValue;
}
else if (x == 5)
{
return someValue / 12;
}
else if (x == 6)
{
return someValue * 12;
}
一行代码:
condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);
这简单吗?我想是的。
这个容易读吗?在某种程度上。
好吗?我不这么认为。(+生成的IL略有不同)
您可以切换if
语句,以便您只重复一次条件。您可以使用switch
来检查x
的值:
int someValue = 100;
if (someCondition) {
switch (x) {
case 5: return someValue;
case 6: return someValue * 12;
}
} else {
switch (x) {
case 5: return someValue / 12;
case 6: return someValue;
}
}
真是太多了,
Double scalar = 12;
switch(x)
{
case 5 :
scalar = 1f/12;
break;
case 6 :
break;
default :
return 100;
}
if (someCondition)
{
return someValue;
}
return someValue * scalar;
switch(x) {
case 5: return someCondition ? someValue : someValue / 12;
case 6: return someCondition ? someValue * 12 : someValue;
}
我个人会使用一个switch语句而不是两个if语句。或者你可以创建一个函数传递x * 12或者x/12。
使用对象代替开关,添加"采用"测试。
const state = {
5: {
true: (someValue) => someValue,
false: (someValue) => someValue / 12
},
6: {
true: (someValue) => someValue * 12,
false: (someValue) => someValue
}
}
const test_values = [0, -1 , 1, 12, -12, 1.2, -1.2]
test_values.map(value => Object.keys(state).map(x => Object.keys(state[x]).map(condition => {
console.log(`value = ${value}, x = ${x}, result = ${state[x][condition](value)}`)
})))