【问题标题】:Simplify if condition?简化if条件?
【发布时间】:2011-11-28 13:36:26
【问题描述】:

我有这个代码:

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

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

如您所见,someCondition 始终相同,只是返回的值不同。有没有办法进一步简化?

【问题讨论】:

  • 你能给所涉及的变量更多的语义名称吗?可能有一种方法可以简化这一点,只有在我们能够理解代码的目的时才有意义。
  • 我唯一能看到的是我会在 if (x == 6) 之前放一个 else
  • 我经常得到完全相同的 IF。你对冗长无能为力:)

标签: c# if-statement refactoring


【解决方案1】:

让我们看看,你怎么看?

int someValue = 100;

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

【讨论】:

    【解决方案2】:

    这取决于您所说的简化是什么意思...

    以下代码行数更少,并且不会牺牲任何可读性 (IMO):

    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;
      

      【讨论】:

        【解决方案4】:

        你有不同的方法来处理同一个条件语句的结果。正因为如此,保持原样可能更有效(也更容易让人赏心悦目)。

        如果每个条件语句的 return 表达式都相同,那么我会修改代码,但每个代码块都有不同的 return 值,因此它是唯一的。

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

        【讨论】:

          【解决方案5】:

          您有两个变量(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 :)
          【解决方案6】:

          一行代码:

          condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);
          

          这很简单吗?我想是的。
          这很容易阅读吗?在某种程度上。
          这样好吗?强> 我不会这么说。 (+生成的IL略有不同)

          【讨论】:

          • 可读性的一条经验法则是在单个表达式中最多使用一个条件。
          • 这是一个单行命令,但我发现这比接受的答案更难阅读。
          【解决方案7】:

          您可以切换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;
            }
          }
          

          【讨论】:

            【解决方案8】:

            真的很多,怎么样

            Double scalar = 12;
            switch(x)
            {
              case 5 : 
                scalar = 1f/12;
                break;
              case 6 : 
                break;
              default : 
                return 100;
            }
            if (someCondition)     
            {         
              return someValue;     
            }     
            return someValue * scalar; 
            

            【讨论】:

              【解决方案9】:
              switch(x) {
                  case 5: return someCondition ? someValue : someValue / 12;
                  case 6: return someCondition ? someValue * 12 : someValue;
              }
              

              【讨论】:

                【解决方案10】:

                我个人会使用 switch 语句而不是两个 if 语句。或者您可以创建一个函数,在其中传递 x * 12 或 x / 12...

                【讨论】:

                  【解决方案11】:

                  使用对象而不是开关,添加了“采用”测试。

                  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)}`)
                  })))

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-04-12
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-08-31
                    • 1970-01-01
                    相关资源
                    最近更新 更多