Question

Personnellement, j'aime bien l'opérateur exclusif ou , ^ , lorsque cela est logique 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 j’obtiens souvent des regards confus d’autres développeurs Java expérimentés (pas seulement les débutants) et des commentaires sur la manière dont il ne devrait être utilisé que pour les opérations au niveau du bit.

Je suis curieux de connaître les meilleures pratiques en matière d'utilisation de l'opérateur ^ .

Était-ce utile?

La solution

Vous pouvez simplement utiliser ! = à la place.

Autres conseils

Je pense que vous avez répondu à votre propre question: si vous avez un regard étrange, il est probablement plus prudent d'utiliser l'option plus explicite.

Si vous devez 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 en premier lieu.

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 pourrait 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 une 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. L’utilisation de xor dans une instruction if est donc acceptable.

Par exemple, utilisez 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 l'examen du code.

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

Vous pouvez toujours l'envelopper dans une fonction pour lui donner un nom détaillé:

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 ^ de 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 également utiliser XOR pour permuter les valeurs de deux variables sans utiliser de troisième variable temporaire .

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

Voici une question Stackoverflow relative à l'échange XOR .

J'ai récemment utilisé un xor dans un projet JavaScript au travail et ajouté 7 lignes de commentaires pour expliquer ce qui se passait. L'utilisation de xor dans ce contexte a été justifiée par le fait que 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 ( terme2 ) pourrait être vrai ou faux . J'aurais dû ajouter une vérification supplémentaire pour les observations undefined , mais avec xor, les éléments suivants étaient suffisants, car xor oblige le premier terme à être évalué pour la première fois comme un booléen, laissant undefined être traité comme false :

if (term1 ^ term2) { ...

C’était finalement un peu exagéré, mais je voulais tout de même le conserver là-bas, comme une sorte d’œuf de Pâques.

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

IMHO ce code pourrait être simplifié:

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

En gardant à l’esprit la clarté du code, j’estime que l’utilisation de XOR dans les contrôles booléens n’est pas une utilisation typique de l’opérateur bit à bit XOR. D'après mon expérience, le format XOR binaire en Java est généralement utilisé pour implémenter un comportement masque indicateur :

flags = flags ^ MASK;

Cet article de Vipan Singla explique l'utilisation plus en détail.

Si vous devez utiliser XOR au niveau du bit, comme dans votre exemple, expliquez pourquoi, car il est probable que même un public peu averti, averti au niveau du bit, s’arrête pour comprendre pourquoi vous l’utilisez.

Si le modèle d'utilisation le justifie, pourquoi pas? Bien que votre équipe ne reconnaisse pas l'opérateur tout de suite, avec le temps, elle le pourrait. Les humains apprennent de nouveaux mots tout le temps. Pourquoi pas en programmation?

Le seul avertissement que je puisse dire est que " ^ " n'a pas la sémantique de court-circuit de votre deuxième vérification booléenne. Si vous avez vraiment besoin de la sémantique de court-circuit, une méthode statique utilise aussi.

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}

Personnellement, je préfère le "boolean1 ^ boolean2" expression en raison de sa concision.

Si j'étais dans votre situation (travaillant en équipe), je trouverais un compromis en encapsulant le "boolean1 ^ boolean2" logique dans une fonction avec un nom descriptif tel que "isDifferent (boolean1, boolean2)".

Par exemple, au lieu d'utiliser "boolean1 ^ boolean2", vous appelez "isDifferent (boolean1, boolean2)". comme si:

if (isDifferent(boolean1, boolean2))
{
  //do it
}

Votre "isDifferent (boolean1, boolean2)" la fonction ressemblerait à:

private boolean isDifferent(boolean1, boolean2)
{
    return boolean1 ^ boolean2;
}

Bien sûr, cette solution implique l’utilisation d’un appel de fonction ostensiblement étranger, lui-même soumis au contrôle des meilleures pratiques, mais il évite l’expression verbeuse (et laide) "(boolean1 & amp; & boolean2) | | (boolean2 & amp; & boolean1) "!

! = accepte de comparer deux variables. Cela ne fonctionne pas, cependant, avec des comparaisons multiples.

str.contains("!=") ^ str.startsWith("not(")

me semble meilleur que

str.contains("!=") != str.startsWith("not(")

En tant qu’opérateur au niveau des bits, xor est beaucoup plus rapide que tout autre moyen de le remplacer. Donc, pour les calculs de performances critiques et évolutifs, xor est impératif.

Mon opinion personnelle subjective: Il est absolument interdit d'utiliser l'égalité (== ou! =) pour les booléens. Son utilisation montre l'absence d'éthique et de principes fondamentaux en matière de programmation. Toute personne qui vous donne un regard confus sur ^ devrait être renvoyée aux bases de l’algèbre booléenne (j’ai été tenté d’écrire "aux rivières de croyance" ici :)).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top