【问题标题】:Refactoring empty if-statements重构空的 if 语句
【发布时间】:2019-01-07 06:29:00
【问题描述】:

我目前正在处理一个项目,我需要删除一个正在被其他不同类使用的类。在某些情况下,我可以删除由该类组成的一行代码,它永远不会影响程序的功能,但在某些情况下,您要删除的类位于 if 语句中。主要问题是,一旦我删除了包含该类的代码行,它在 if 语句中的位置,它将是一个空的 if 语句,这将违反声纳。

除了否定其中一个语句的条件之外,还有其他方法可以重构一个空的 if 语句吗?因为当我只是否定条件时,代码的可读性降低了。

例如:

if((example_A >= 0) && (condition_A))
{
     removeThisClass();
}
else if((example_B >= )) && (condition_B))
{
     doSomething();
}
else
{
     doAnything();
}

重构:

if(!((example_A >= 0) && (condition_A)) && ((example_B >= )) && (condition_B)))
{
     doSomething();
}
else
{
     doAnything();
}

【问题讨论】:

  • 重构代码中的removeThisClass()在哪里?
  • 也许您可以考虑将条件移至私有方法。您是否要自动执行此任务以删除/重构?
  • 大多数时候我们可以将if(!((example_A >= 0) && (condition_A)) && ((example_B >= )) && (condition_B)))(重构语句)简化为更简单的东西。
  • 在进行此类重构时,您应该依赖您的 IDE。 Eclipse 有一个“反向 if 语句”快速辅助,您可以在条件下使用“向下推否定”。见help.eclipse.org/mars/…veerasundar.com/blog/2012/10/eclipse-refactoring-on-steroids

标签: java if-statement refactoring readability


【解决方案1】:

你可以把这段代码放在单独的方法(https://refactoring.com/catalog/extractFunction.html)中,这样写:

public void DoSomeStuff() {

  if((example_A >= 0) && (condition_A))
    return;  

  if((example_B >= )) && (condition_B)) {
    doSomething();
    return;
  }

  doAnything();
}    

【讨论】:

  • 根据我们未显示的周围代码,它甚至可能不需要额外的方法(尽管这些方法通常会提高可读性),也许你可以returncontinue或@ 987654325@ 已经。
【解决方案2】:

如果我的理解正确,removeThisClass(); 行应该被删除,并且你不想留下这样的空块:

if((example_A >= 0) && (condition_A))
{
}
else if((example_B >= )) && (condition_B))
{
    doSomething();
}
else
{
    doAnything();
}

为了不进行两次“A”测试,您需要否定条件,例如像这样:

if ((example_A < 0) || ! (condition_A))
{
    if ((example_B >= )) && (condition_B))
    {
        doSomething();
    }
    else
    {
        doAnything();
    }
}

您的重构代码是错误的,因为如果“A”条件为真,原始代码将执行removeThisClass();,这意味着它现在应该什么也不做,但是当“A”为真时,您的代码将调用doAnything(); .

【讨论】:

    【解决方案3】:

    您可以发表评论。声纳should accept that,它也可以帮助读者。

    void doSomething() {
      for (int i = 0; i < 42; i++)        // Non-Compliant
      {
      }
      for (int i = 0; i < 42; i++);       // Compliant
    
      if (myVar == 4)                     // Compliant - contains a comment
      {
        // Do nothing because of X and Y
      }
      else                                // Compliant
      {
        doSomething();
      }
    
      try                                 // Non-Compliant
      {
      }
      catch (Exception e)                 // Compliant
      {
        // Ignore
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多