1
votes

Refactoriser des instructions if vides

Je travaille actuellement sur un projet dont j'ai besoin pour supprimer une classe qui est utilisée par différentes autres classes. Il y a des cas où je peux supprimer la ligne de code qui se compose de cette classe où cela n'affectera jamais la fonctionnalité du programme, mais il y a aussi des cas où la classe que vous souhaitez supprimer se trouve dans une instruction if. Le problème principal est qu'une fois que j'ai supprimé la ligne de code constituée de cette classe où se trouve-t-elle à l'intérieur de l'instruction if, ce sera une instruction if vide qui violera le sonar.

Y a-t-il un autre moyen de refactoriser un vide if-statement autre que nier la condition de l'un des énoncés? Parce que lorsque je nie simplement la condition, la lisibilité du code diminue.

Par exemple:

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

Refactorisé:

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


4 commentaires

où est removeThisClass () dans le code refactorisé?


Peut-être pouvez-vous envisager de déplacer les conditions vers une méthode privée. Automatisez-vous cette tâche pour supprimer / refactoriser?


La plupart du temps, nous pouvons réduire if (! ((Example_A> = 0) && (condition_A)) && ((example_B> =)) && (condition_B))) (instruction refactorisée) en quelque chose de plus simple .


Lors de ces refactorisations, vous devez vous fier à votre IDE. Eclipse a une assistance rapide "inverse if statement" que vous pouvez suivre avec une "push negation down" sur la condition. Voir help.eclipse.org/mars/… et veerasundar.com/blog/2012/10/eclipse-refactoring-on-steroids


3 Réponses :


1
votes

Vous pouvez mettre ce code dans une méthode distincte ( https://refactoring.com/catalog/extractFunction. html ) et écrivez-le comme ceci:

public void DoSomeStuff() {

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

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

  doAnything();
}    


1 commentaires

En fonction du code environnant qui ne nous a pas été montré, il peut même ne pas avoir besoin d'une méthode supplémentaire (bien que celles-ci améliorent généralement la lisibilité en soi), peut-être que vous pouvez retourner ou continuer ou break déjà.



0
votes

Si je vous comprends bien, la ligne removeThisClass (); devrait être supprimée, et vous ne voulez pas vous retrouver avec un bloc vide comme celui-ci:

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

Afin de ne pas faire les tests "A" deux fois, vous devez annuler la condition, par exemple comme ceci:

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

Votre code refactorisé est faux, car si la condition "A" est vraie, le code d'origine exécutera removeThisClass (); , ce qui signifie qu'il ne devrait plus rien faire, mais votre code appellera doAnything (); quand "A" est vrai.


0 commentaires

0
votes

Vous pouvez mettre un commentaire. Le sondeur devrait accepter cela et pourrait également aider le lecteur.

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 commentaires