简化条件

本文关键字:条件 | 更新日期: 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值,因此它是唯一的。

所以,不,真的没有办法简化你所做的。

你有两个变量(xsomeCondition)和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)}`)
})))