154 votes

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

J'aime personnellement le exclusif ou , ^ Il s'agit d'un opérateur qui a du sens dans le contexte des contrôles booléens en raison de sa concision. Je préfère de loin écrire

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

que

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

mais je reçois souvent des regards confus de la part d'autres développeurs Java expérimentés (pas seulement des débutants), et parfois des commentaires sur le fait qu'il ne devrait être utilisé que pour les opérations de type bit à bit.

Je suis curieux de savoir quelles sont les meilleures pratiques en matière d'utilisation de l'outil d'évaluation de la qualité de l'eau. ^ opérateur.

309voto

Vous pouvez simplement utiliser != à la place.

27voto

Martin Points 1185

Je pense que vous avez répondu à votre propre question : si les gens vous regardent bizarrement, il est probablement plus sûr de choisir l'option la plus explicite.

Si vous devez le commenter, il est probablement préférable de le remplacer par la version la plus verbeuse et de ne pas inciter les gens à poser la question en premier lieu.

6 votes

Je peux vous assurer que je vous regarderai bizarrement si vous écrivez sérieusement (boolean1 && !boolean2) || (boolean2 && !boolean1) dans un code d'application réelle

17voto

Dave Tarkowski Points 416

Je trouve que j'ai souvent des conversations similaires. D'un côté, vous avez une méthode compacte et efficace pour atteindre votre objectif. D'autre part, vous avez quelque chose que le reste de votre équipe risque de ne pas comprendre, ce qui rendra difficile son maintien à l'avenir.

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

Comme exemple de quelque chose qui ne serait pas correct, prenez l'astuce consistant à utiliser xor pour échanger deux variables sans utiliser de variable temporaire. Il s'agit d'une astuce avec laquelle je ne m'attendrais pas à ce que tout le monde soit familier, et qui ne passerait donc pas l'examen du code.

14voto

Dre Points 2813

Je pense que ce serait bien si tu le commentais, par exemple. // ^ == XOR .

11voto

Cory Gross Points 3118

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

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

Mais, il me semble qu'il ne serait pas difficile pour quelqu'un qui ne sait pas à quoi sert l'opérateur ^ de le rechercher très rapidement sur Google. Il ne sera pas difficile de s'en souvenir après la première fois. Puisque vous avez demandé d'autres utilisations, il est courant d'utiliser le XOR pour masquer des bits.

Vous pouvez également utiliser XOR pour échanger les valeurs de deux variables sans utiliser une troisième variable temporaire .

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

Voici un Question Stackoverflow relative à la permutation XOR .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X