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(); }
3 Réponses :
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(); }
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à.
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.
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 } }
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