Pour mon travail, je dois développer une petite application Java qui analyse des fichiers XML très volumineux (~ 300 000 lignes) pour sélectionner des données très spécifiques (à l'aide de Pattern
). J'essaie donc de l'optimiser un peu. Je me demandais ce qui était mieux entre ces 2 extraits:
if(boolean_condition && matcher.find(string))
{
...
}
OU
if(boolean_condition)
{
if(matcher.find(string))
{
...
}
}
Plus de précisions:
boolean_condition
est une boolean
calculée à chaque itération à l'aide d'une fonction externeboolean
est défini sur false
, je n'ai pas besoin de tester l'expression régulière pour les correspondances.Merci de votre aide
Une règle d'or que je suis est de éviter de nidifier autant que je peux. Mais si c’est au prix de rendre mon unique condition si complexe, cela ne me dérange pas de l’emboîter.
De plus, vous utilisez l'opérateur &&
de court-circuit. Donc si le booléen est faux, il ne tentera même pas de faire correspondre!
Alors,
if(boolean_condition && matcher.find(string))
{
...
}
est le chemin à parcourir!
Les deux méthodes suivantes:
public void oneIf(boolean a, boolean b)
{
if (a && b)
{
}
}
public void twoIfs(boolean a, boolean b)
{
if (a)
{
if (b)
{
}
}
}
produira exactement le même code d'octet pour le corps de la méthode afin d'éviter toute différence de performances, ce qui signifie qu'il s'agit uniquement d'une question de style que vous utilisez (personnellement, je préfère le premier style).
Les deux méthodes sont acceptables et la deuxième condition ne sera pas testée si la première est fausse.
Utilisez celui qui rend le code plus lisible et compréhensible. Pour deux conditions seulement, le premier moyen est plus logique et lisible. Ce n'est peut-être plus le cas avec 5 ou 6 conditions liées à &&
, ||
et !
.
Java utilise le court-circuit pour ces opérateurs booléens, les deux variantes sont donc fonctionnellement identiques. Par conséquent, si le boolean_condition
est faux, il ne passera pas à la recherche correspondante
En fin de compte, il est plus facile de lire et de déboguer, mais l’imbrication en profondeur peut devenir difficile à manier si vous vous retrouvez avec une quantité massive d’accolades à la fin.
Une façon d'améliorer la lisibilité, si la condition devient plus longue, consiste simplement à la diviser en plusieurs lignes:
if(boolean_condition &&
matcher.find(string))
{
...
}
Le seul choix à ce stade est de mettre ou non les options && et || à la fin de la ligne précédente, ou le début du courant.
Si vous souhaitez vous conformer à Squar, règle du sonar: S1066 vous devez réduire les instructions if pour éviter les avertissements, car elle indique
Les instructions "if" pliables doivent être fusionnées
En termes de performance, ce sont les mêmes.
ce qui est presque certain de dominer le temps dans ce code est matcher.find(string)
car c'est un appel de fonction.
Le premier. J'essaie d'éviter si imbriquer comme ça, je pense que c'est du code pauvre/laid et que && va court-circuiter et tester uniquement avec matcher.find () si le booléen est vrai.
J'ai tendance à en voir trop && et || enfermés dans une soupe logique et sont souvent la source d'insectes subtils.
Il est trop facile d'ajouter simplement un autre && ou || à ce que vous pensez est le bon endroit et casser la logique existante.
Pour cette raison, en règle générale, j'essaie de ne pas utiliser l'un ou l'autre pour éviter la tentation d'en ajouter d'autres à mesure que les exigences changent.