Рефакторинг пустых if-операторов - PullRequest
0 голосов
/ 07 января 2019

Я сейчас работаю над проектом, который мне нужен, чтобы удалить класс, который используется другими классами. Есть случаи, когда я могу удалить одну строку кода, которая состоит из этого класса, когда это никогда не повлияет на функциональность программы, но также есть случаи, когда класс, который вы хотите удалить, находится внутри оператора if. Основная проблема состоит в том, что, как только я удалил строку кода, состоящую из этого класса, где он находится внутри оператора if, это будет пустой оператор if, который нарушит сонар.

Есть ли другой способ реорганизовать пустое выражение if, отличное от условия одного из операторов? Потому что, когда я просто отрицаю условие, читаемость кода снижается.

Например:

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

Refactored:

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

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Если я вас правильно понимаю, строка removeThisClass(); должна быть удалена, и вы не хотите оставлять такой пустой блок, как этот:

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

Чтобы не выполнять тесты «А» дважды, необходимо отменить условие, например, как это:

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

Ваш измененный код неверен, потому что, если условие «A» истинно, исходный код будет выполняться removeThisClass();, что означает, что теперь он ничего не должен делать, но ваш код будет вызывать doAnything();, когда «A» истинно .

0 голосов
/ 07 января 2019

Вы можете оставить комментарий. Сонар должен принять это , и это также может помочь читателю.

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
  }
}
0 голосов
/ 07 января 2019

Вы можете поместить этот код в отдельный метод (https://refactoring.com/catalog/extractFunction.html) и написать его так:

public void DoSomeStuff() {

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

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

  doAnything();
}    
...