web-dev-qa-db-fra.com

Est-ce une bonne pratique d'utiliser l'opérateur xor pour les contrôles booléens?

Personnellement, j'aime bien le exclusif o, ^, opérateur lorsque cela a du sens dans le contexte des contrôles booléens en raison de sa concision. Je préfère de beaucoup écrire

if (boolean1 ^ boolean2)
{
  //do it
}

que

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

mais souvent les regards confus de Java (pas seulement les débutants)) sont confus, et parfois des commentaires sur la manière dont il devrait être utilisé uniquement pour les opérations sur les bits.

Je suis curieux de connaître les meilleures pratiques concernant l’utilisation de la ^ _ opérateur.

148
Peter

Vous pouvez simplement utiliser != au lieu.

296
Mike F

Je pense que vous avez répondu à votre propre question - si vous avez un regard étrange de la part des gens, il est probablement plus prudent d’utiliser l’option plus explicite.

Si vous avez besoin de le commenter, vous feriez probablement mieux de le remplacer par la version plus détaillée et de ne pas forcer les gens à poser la question au départ.

27
Martin

Je trouve que j'ai beaucoup de conversations similaires. D'une part, vous disposez d'une méthode compacte et efficace pour atteindre votre objectif. D'autre part, vous avez quelque chose que le reste de votre équipe peut ne pas comprendre, ce qui rend difficile sa maintenance dans le futur.

Ma règle générale est de demander si la technique utilisée est quelque chose que l'on peut raisonnablement attendre des programmeurs en général. Dans ce cas, je pense qu'il est raisonnable de s'attendre à ce que les programmeurs sachent comment utiliser les opérateurs booléens. Il est donc correct d'utiliser xor dans une instruction if.

Comme exemple de quelque chose qui ne va pas, prenez l’astuce d’utiliser xor pour échanger deux variables sans utiliser de variable temporaire. C'est un truc que je ne m'attendrais pas à ce que tout le monde connaisse, donc il ne passerait pas la révision du code.

16
Dave Tarkowski

Je pense que ça irait si vous commentiez, par exemple // ^ == XOR.

14
Dre

Vous pouvez toujours l'envelopper dans une fonction pour lui donner un nom prolixe:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

Mais, il me semble que ce ne serait pas difficile pour ceux qui ne savent pas à quoi sert l'opérateur ^ pour faire une recherche sur Google très rapidement. Ce ne sera pas difficile de se souvenir après la première fois. Puisque vous avez demandé d'autres utilisations, il est courant d'utiliser le XOR pour le masquage de bits).

Vous pouvez aussi tiliser XOR pour échanger les valeurs dans deux variables sans utiliser une troisième variable temporaire .

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

Voici une question Stackoverflow liée à XOR swapping .

9
Cory Gross

J'ai récemment utilisé un xor dans un projet JavaScript au travail et en ajoutant 7 lignes de commentaires pour expliquer ce qui se passait. L’utilisation de xor dans ce contexte a été justifiée par l’un des termes (term1 dans l'exemple ci-dessous) pourrait prendre non pas deux mais trois valeurs: undefined, true ou false alors que l'autre (term2) pourrait être true ou false. J'aurais dû ajouter un contrôle supplémentaire pour les cas undefined, mais avec xor, les éléments suivants étaient suffisants, car xor oblige le premier terme à être d'abord évalué en tant que booléen, laissant undefined traité. comme false:

if (term1 ^ term2) { ...

À la fin, c’était un peu exagéré, mais je voulais tout de même le garder là-bas, en quelque sorte comme un œuf de Pâques.

6
Ates Goral
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

IMHO ce code pourrait être simplifié:

if(boolean1 != boolean2) 
{ 
  //do it 
} 
5
Y--

En gardant à l'esprit la clarté du code, je suis d'avis que l'utilisation de XOR dans les contrôles booléens n'est pas une utilisation typique pour l'opérateur de bit XOR. D'après mon expérience, XOR au niveau du bit dans Java est généralement utilisé pour implémenter un comportement de masque flag toggle:

flags = flags ^ MASK;

This article de Vipan Singla explique le cas d'utilisation plus en détail.

Si vous devez utiliser bitwise XOR comme dans votre exemple, expliquez pourquoi vous l'utilisez, car il est probable que même un public peu averti, averti des bits, doit s'arrêter pour comprendre pourquoi vous l'utilisez.

5
Gunnar Karlsson