简化 if 条件语句?

4

I have this code:

int someValue = 100;
if (x == 5)
{
    if (someCondition)
    {
        return someValue;
    }
    return someValue / 12;
}

if (x == 6)
{
     if (someCondition)
     {
         return someValue * 12;
     }
    return someValue;
}

如您所见,someCondition 总是相同的,只有返回值不同。是否有更简单的方法来进一步简化这个过程?


2
你能给这些变量命名一些更具语义化的名称吗?只有当我们理解代码的目的时,可能才有简化它的方法。 - Jon Skeet
我能看到的唯一一件事是,在 if (x == 6) 之前加上一个 else。 - Davide Piras
我经常遇到完全相同的 IF 语句。对于冗长无法做什么 :) - sinni800
11个回答

7

让我们看看,你觉得这个怎么样?

int someValue = 100;

if (x == 5)
 return someCondition ? someValue : (someValue / 12);
else if (x == 6)
 return someCondition ? (someValue * 12) : someValue;

4

这取决于你所说的简化意思...

下面的代码行数更少,但在可读性方面没有任何牺牲(在我看来):

var someValue = 100;
switch (x)
{
  case 5:
    return someCondition ? someValue : someValue / 12;
  case 6:
    return someCondition ? someValue * 12 : someValue;
  default:
    return someValue;
}

3
这段代码没有“嵌套”语句,所以在我看来更加清晰简洁:
int someValue = 100;

if ((x == 5 && someCondition) || (x == 6 && !someCondition))
    return someValue;

if (x == 5)
    return someValue / 12;

if (x == 6)
    return someValue * 12;

2
您处理同一条件语句的结果有不同的方式。因此,保持原样可能更有效(且易于阅读)。如果每个条件语句的return表达式相同,则应修改代码,但是由于每个代码块都具有不同的return值,因此使其独特。因此,没有简化您所做的方法。

2

你有两个变量 (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;
} 

嗯,比我的好看。+1 :) - Bazzz

2
一行代码:
condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);

这个简单吗? 我认为是的。
这容易阅读吗? 在某种程度上是的。
这好吗? 我不这么认为。(+生成的IL略有不同)


1
可读性的一个经验法则是在单个表达式中最多使用一个条件。 - Andy Thomas
这是一行命令,但我发现这比被接受的答案更难读。 - Gabriel Mongeon

1
switch(x) {
    case 5: return someCondition ? someValue : someValue / 12;
    case 6: return someCondition ? someValue * 12 : someValue;
}

1

你可以调换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;
  }
}

1
其实差不多,怎么样?
Double scalar = 12;
switch(x)
{
  case 5 : 
    scalar = 1f/12;
    break;
  case 6 : 
    break;
  default : 
    return 100;
}
if (someCondition)     
{         
  return someValue;     
}     
return someValue * scalar; 

0
个人建议您使用switch语句而非两个if语句。或者您可以编写一个函数,在该函数中传递x * 12或x / 12...的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接