Domanda

Personalmente mi piace l'operatore esclusivo o , ^ quando ha senso nel contesto dei controlli booleani a causa della sua concisione. Preferisco di gran lunga scrivere

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

di

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

ma ricevo spesso sguardi confusi da altri sviluppatori Java esperti (non solo i neofiti), e talvolta commenti su come dovrebbe essere usato solo per operazioni bit per bit.

Sono curioso di sapere quali sono le migliori pratiche relative all'uso dell'operatore ^ .

È stato utile?

Soluzione

Puoi semplicemente usare ! = invece.

Altri suggerimenti

Penso che tu abbia risposto alla tua stessa domanda: se ottieni strani sguardi dalle persone, probabilmente è più sicuro scegliere l'opzione più esplicita.

Se devi commentarlo, probabilmente stai meglio sostituendolo con la versione più dettagliata e non facendo in modo che le persone facciano la domanda in primo luogo.

Trovo di avere conversazioni simili molto. Da un lato, hai un metodo compatto ed efficiente per raggiungere il tuo obiettivo. D'altra parte, hai qualcosa che il resto della tua squadra potrebbe non capire, rendendo difficile mantenere in futuro.

La mia regola generale è di chiedere se la tecnica utilizzata è qualcosa che è ragionevole aspettarsi che i programmatori in generale sappiano. In questo caso, penso che sia ragionevole aspettarsi che i programmatori sappiano come usare gli operatori booleani, quindi usare xor in un'istruzione if va bene.

Come esempio di qualcosa che non andrebbe bene, prendi il trucco di usare xor per scambiare due variabili senza usare una variabile temporanea. Questo è un trucco che non mi aspetto che tutti conoscano, quindi non passerebbe la revisione del codice.

Penso che andrebbe bene se lo commentassi, ad es. // ^ == XOR .

Potresti sempre avvolgerlo in una funzione per dargli un nome dettagliato:

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

Ma, mi sembra che non sarebbe difficile per chiunque non sapesse a cosa l'operatore ^ sia per Google molto veloce. Non sarà difficile da ricordare dopo la prima volta. Poiché hai richiesto altri usi, è comune utilizzare XOR per il mascheramento dei bit.

Puoi anche utilizzare XOR per scambiare i valori in due variabili senza usare una terza variabile temporanea .

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

Ecco una domanda Stackover relativa allo scambio XOR .

Di recente ho usato un xor in un progetto JavaScript al lavoro e ho finito per aggiungere 7 righe di commenti per spiegare cosa stava succedendo. La giustificazione per l'uso di xor in quel contesto era che uno dei termini ( term1 nell'esempio seguente) poteva assumere non due ma tre valori: undefined , true o false mentre l'altro ( term2 ) potrebbe essere true o false . Avrei dovuto aggiungere un ulteriore controllo per i casi undefined ma con xor, il seguente era sufficiente poiché il xor forza il primo termine a essere valutato per la prima volta come booleano, lasciando undefined viene trattato come false :

if (term1 ^ term2) { ...

Alla fine era un po 'eccessivo, ma volevo comunque tenerlo lì dentro, come una specie di uovo di Pasqua.

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

IMHO questo codice potrebbe essere semplificato:

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

Tenendo presente la chiarezza del codice, la mia opinione è che l'uso di XOR nei controlli booleani non sia un utilizzo tipico per l'operatore XOR bit a bit. Dalla mia esperienza, XOR bit a bit in Java è in genere utilizzato per implementare un comportamento maschera flag toggle :

flags = flags ^ MASK;

Questo articolo di Vipan Singla spiega il caso d'uso in modo più dettagliato.

Se hai bisogno di usare XOR bit a bit come nell'esempio, commenta il motivo per cui lo usi, poiché è probabile che anche un pubblico alfabetizzato a bit bit si fermi nelle loro tracce per capire perché lo stai usando.

Se il modello di utilizzo lo giustifica, perché no? Mentre la tua squadra non riconosce subito l'operatore, con il tempo potrebbe. Gli umani imparano sempre nuove parole. Perché non in programmazione?

L'unica avvertenza che potrei affermare è che " ^ " non ha la semantica di corto circuito del secondo controllo booleano. Se hai davvero bisogno della semantica del corto circuito, funziona anche un metodo util statico.

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

Preferisco personalmente il " boolean1 ^ boolean2 " espressione dovuta alla sua succinta.

Se fossi nella tua situazione (lavorando in una squadra), colpirei un compromesso incapsulando il "booleano1 ^ booleano2". logica in una funzione con un nome descrittivo come " isDifferent (boolean1, boolean2) " ;.

Ad esempio, invece di utilizzare " boolean1 ^ boolean2 " ;, chiameresti " isDifferent (boolean1, boolean2) " in questo modo:

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

Il tuo " isDifferent (boolean1, boolean2) " la funzione sarebbe simile:

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

Naturalmente, questa soluzione implica l'uso di una chiamata di funzione apparentemente estranea, che di per sé è soggetta al controllo delle Best Practices, ma evita l'espressione verbosa (e brutta) " (boolean1 & amp; & amp;! boolean2) | | (boolean2 & amp; & amp;! boolean1) " ;!

! = è OK per confrontare due variabili. Non funziona, tuttavia, con confronti multipli.

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

sembra migliore per me di

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

Come operatore bit a bit, xor è molto più veloce di qualsiasi altro mezzo per sostituirlo. Quindi, per calcoli critici e scalabili in termini di prestazioni, xor è indispensabile.

La mia opinione personale soggettiva: è assolutamente vietato, per qualsiasi scopo, usare l'uguaglianza (== o! =) per i booleani. Usarlo mostra la mancanza di etica e fondamenti della programmazione di base. Chiunque ti dia uno sguardo confuso su ^ dovrebbe essere rispedito alle basi dell'algebra booleana (ero tentato di scrivere " ai fiumi di credenza " qui :)).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top