重构空的 if 语句

Refactoring empty if-statements

我目前正在做一个项目,我需要删除一个 class,它正被不同的其他 classes 使用。在某些情况下,我可以删除包含 class 的一行代码,它永远不会影响程序的功能,但在某些情况下,您想要删除 class在 if 语句中。主要问题是,一旦我删除了由 class 组成的代码行,它在 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();
}

您可以将此代码放在单独的方法中 (https://refactoring.com/catalog/extractFunction.html),然后这样写:

public void DoSomeStuff() {

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

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

  doAnything();
}    

如果我没理解错的话,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();,这意味着它现在应该什么也不做,但您的代码将调用 doAnything(); 当 "A" 为真时。

您可以发表评论。声纳 should accept that 它也可以帮助 reader.

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