web-dev-qa-db-fra.com

Qu'est-ce qui est mieux ? Plusieurs déclarations si, ou une si plusieurs conditions

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: 

  • Ces instructions if sont exécutées à chaque itération dans une boucle (environ 20 000 itérations)
  • Le boolean_condition est une boolean calculée à chaque itération à l'aide d'une fonction externe
  • Si boolean est défini sur false, je n'ai pas besoin de tester l'expression régulière pour les correspondances.

Merci de votre aide

33
3rgo

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!

48
adarshr

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).

17
Jonathan

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 !.

3
JB Nizet

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.

2
Farrell

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

1
Petter Friberg

En termes de performance, ce sont les mêmes.

  • Mais même s'ils n'étaient pas

ce qui est presque certain de dominer le temps dans ce code est matcher.find(string) car c'est un appel de fonction.

1
Mike Dunlavey

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.

1
Robby Pond

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.

0
sm14