Pergunta

Eu, pessoalmente, como o exclusivo ou , ^, operador quando faz sentido no contexto de verificações boolean por causa de sua concisão. Eu prefiro muito mais para escrever

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

de

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

mas eu muitas vezes se parece confuso de outros desenvolvedores Java experientes (não apenas os iniciantes), e às vezes comentários sobre como ele só deve ser usado para operações bit a bit.

Estou curioso para saber as melhores práticas sobre o uso do operador ^.

Foi útil?

Solução

Você pode simplesmente usar != vez.

Outras dicas

Eu acho que você respondeu a sua própria pergunta -. Se você receber olhares estranhos de pessoas, é provavelmente mais seguro ir com a opção mais explícito

Se você precisa de comentá-lo, então você é provavelmente melhor fora de substituí-lo com o mais detalhado versão e não fazer as pessoas fazem a pergunta em primeiro lugar.

Eu acho que eu tenho conversas semelhantes muito. Por um lado, você tem um método compacto e eficiente de alcançar seu objetivo. Por outro lado, você tem algo que o resto de sua equipe pode não entender, tornando-se difícil de manter no futuro.

A minha regra geral é perguntar se a técnica a ser utilizada é algo que é razoável esperar que os programadores em geral a conhecer. Neste caso, eu acho que é razoável esperar que os programadores para saber como usar operadores booleanos, portanto, usando xor em uma declaração se está tudo bem.

Como um exemplo de algo que não ficaria bem, tomar o truque de usar xor para trocar duas variáveis ??sem usar uma variável temporária. Isso é um truque que eu não esperaria que todos estejam familiarizados com, por isso não passaria de revisão de código.

Eu acho que seria bom se você comentou que, por exemplo, // ^ == XOR.

Você pode sempre apenas envolvê-la em uma função para dar-lhe um nome por extenso:

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

Mas, parece-me que não seria difícil para qualquer um que não sabia o que o operador ^ é para a Google realmente rápido. Não vai ser difícil lembrar depois da primeira vez. Desde que você pediu para outros usos, sua comum usar o XOR para bit mascaramento.

Você também pode uso XOR para trocar os valores em duas variáveis ??sem usar uma terceira variável temporária .

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

Aqui está um Stackoverflow questão relacionada com XOR trocando .

Recentemente eu o usei um xor em um projeto de JavaScript no trabalho e acabou adicionando 7 linhas de comentários para explicar o que estava acontecendo. A justificação para a utilização de xor nesse contexto que era um dos termos (term1 no exemplo abaixo) pode assumir nem dois, mas três valores: undefined, true ou false enquanto o outro (term2) poderia ser true ou false. Eu teria que adicionar uma verificação adicional para os casos undefined mas com XOR, o seguinte foi suficiente desde que as forças XOR o primeiro termo a ser primeira avaliadas como um booleano, deixando undefined são tratados como false:

if (term1 ^ term2) { ...

Foi, no final, um pouco de um exagero, mas eu queria mantê-lo lá de qualquer maneira, como uma espécie de ovo de páscoa.

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

IMHO este código pode ser simplificado:

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

Com clareza código em mente, minha opinião é que o uso de XOR em cheques boolean não é típico de uso para o operador XOR bit a bit. Da minha experiência, XOR bit a bit em Java é tipicamente usado para implementar um comportamento máscara flag toggle:

flags = flags ^ MASK;

Este artigo por vipan Singla explica o caso de uso mais em detalhe.

Se você precisa usar XOR como no seu exemplo, comentar por que você usá-lo, já que é provável que exigem mesmo um público alfabetizado bit a bit de parada em suas trilhas para entender por que você está usando.

Se os justifica padrão de uso, por que não? Embora sua equipe não reconhece o operador imediatamente, com o tempo que podiam. Os seres humanos aprendem novas palavras o tempo todo. Por que não na programação?

O único cuidado que eu poderia declarar é que "^" não tem a semântica de circuitos curtos de sua segunda verificação boolean. Se você realmente precisa a semântica de curto-circuito, em seguida, uma estática util método funciona também.

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

Eu pessoalmente prefiro a expressão "boolean1 ^ boolean2" devido à sua concisão.

Se eu estivesse na sua situação (trabalhar em equipe), eu iria encontrar um compromisso por encapsular o "^ boolean2 boolean1" lógica em uma função com um nome descritivo, como "isDifferent (boolean1, boolean2)".

Por exemplo, em vez de usar "boolean1 ^ boolean2", você chamaria de "isDifferent (boolean1, boolean2)" como assim:

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

Seu "isDifferent (boolean1, boolean2)" função seria algo como:

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

É claro que esta solução implica a utilização de uma chamada de função aparentemente irrelevantes, o que em si mesmo está sujeito a Melhores Práticas escrutínio, mas evita a detalhada (e feio) a expressão "(boolean1 &&! Boolean2) || (boolean2 && ! boolean1) "!

! = É OK para comparar duas variáveis. Ele não funciona, porém, com comparações múltiplas.

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

parece melhor para mim do que

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

Como um operador bit a bit, xor é muito mais rápido do que qualquer outro meio para substituí-lo. Assim, para desempenho crítico e cálculos escaláveis, xor é imperativo.

A minha opinião pessoal subjetivo: É absolutamente proibido, para qualquer finalidade, com a igualdade de uso (== ou =!) Para booleans. Usando isso mostra a falta de ética básicas de programação e fundamentos. Qualquer um que lhe dá confuso olhares sobre ^ deve ser enviado de volta para o básico da álgebra booleana (eu estava tentado a escrever "para os rios de crença" aqui :)).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top