부울 검사에 xor 연산자를 사용하는 것이 좋습니다? [대기 중]
나는 개인적으로 같은 독점 또는 , ^
이 때문에 간결의 여부를 확인의 맥락에서 의미가, 연산자. 나는 글 쓰는 것을 훨씬 좋아한다
if (boolean1 ^ boolean2)
{
//do it
}
...보다
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
그러나 나는 종종 초보자뿐만 아니라 다른 숙련 된 Java 개발자들로부터 혼란스러워 보이고 때로는 비트 연산에만 사용해야하는 방법에 대한 의견을 얻습니다.
^
운영자 의 사용에 관한 모범 사례에 대해 궁금합니다 .
!=
대신 간단하게 사용할 수 있습니다 .
나는 당신이 당신의 자신의 질문에 대답했다고 생각합니다-사람들로부터 이상한 외모를 얻는다면 더 명확한 옵션을 사용하는 것이 더 안전 할 것입니다.
주석을 달아야 할 경우, 더 자세한 버전으로 바꾸고 사람들이 처음에 질문하지 않도록하는 것이 좋습니다.
비슷한 대화를 많이합니다. 한편으로는 목표를 달성하는 작고 효율적인 방법이 있습니다. 반면에, 당신은 다른 팀원들이 이해하지 못할 수있는 것을 가지고 있기 때문에 앞으로 유지하기가 어렵습니다.
나의 일반적인 규칙은 사용되는 기술이 프로그래머가 일반적으로 알기를 기대하는 것이 합리적인지 묻는 것입니다. 이 경우 프로그래머가 부울 연산자를 사용하는 방법을 알고 있으므로 if 문에 xor를 사용하는 것이 좋습니다.
좋지 않은 것의 예로서, xor를 사용하여 임시 변수를 사용하지 않고 두 변수를 교환하는 트릭을 가져 가십시오. 그것은 모든 사람이 익숙하지 않을 것이라고 생각하는 트릭이므로 코드 검토를 통과하지 못합니다.
예를 들어 댓글을 달면 괜찮을 것 같습니다 // ^ == XOR
.
항상 함수로 감싸서 자세한 이름을 지정할 수 있습니다.
public static boolean XOR(boolean A, boolean B) {
return A ^ B;
}
그러나 ^ 연산자가 무엇인지 Google에 정말로 알지 못하는 사람에게는 어렵지 않을 것 같습니다. 처음으로 기억하기 어렵지 않습니다. 다른 용도를 요청 했으므로 비트 마스킹에 XOR을 사용하는 것이 일반적입니다.
XOR을 사용하여 세 번째 임시 변수를 사용하지 않고 두 변수의 값을 바꿀 수도 있습니다 .
// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;
다음은 XOR 스와핑과 관련된 Stackoverflow 질문 입니다.
나는 최근에 직장에서 JavaScript 프로젝트에서 xor를 사용하여 무슨 일이 있었는지 설명하기 위해 7 줄의 주석 을 추가 했습니다. 그 상황에서 배타적 사용을위한 정당성 (용어의 하나 term1
없는 두하지만 세 가지 값을 취할 수에 아래의 예) undefined
, true
또는 false
다른 상태 ( term2
) 일 수 true
또는 false
. 나는에 대한 추가 검사를 추가해야했습니다 undefined
경우 만 XOR로, 다음은 첫 학기 첫 번째 부울로 평가되는 XOR 힘 때문에셔서 충분했다 undefined
로 취급받을 false
:
if (term1 ^ term2) { ...
결국 약간의 과잉 이었지만 어쨌든 일종의 이스터 에그로 보관하고 싶었습니다.
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
이 코드는 IMHO 단순화 될 수 있습니다
if(boolean1 != boolean2)
{
//do it
}
코드 명확성을 염두에두고 부울 검사에 XOR을 사용하는 것이 XOR 비트 연산자의 일반적인 사용법이 아니라고 생각합니다. 내 경험상 Java의 비트 XOR은 일반적으로 마스크 flag toggle
동작 을 구현하는 데 사용됩니다 .
flags = flags ^ MASK;
Vipan Singla 의이 기사에서는 사용 사례에 대해 자세히 설명합니다.
예제에서와 같이 비트 XOR을 사용해야하는 경우 비트를 사용하는 이유를 이해하기 위해 비트 리터럴 청중조차도 트랙에서 멈추어야 할 가능성이 있기 때문에 사용 이유를 설명하십시오.
나는 간결함으로 인해 "boolean1 ^ boolean2"표현을 개인적으로 선호합니다.
If I was in your situation (working in a team), I would strike a compromise by encapsulating the "boolean1 ^ boolean2" logic in a function with a descriptive name such as "isDifferent(boolean1, boolean2)".
For example, instead of using "boolean1 ^ boolean2", you would call "isDifferent(boolean1, boolean2)" like so:
if (isDifferent(boolean1, boolean2))
{
//do it
}
Your "isDifferent(boolean1, boolean2)" function would look like:
private boolean isDifferent(boolean1, boolean2)
{
return boolean1 ^ boolean2;
}
Of course, this solution entails the use of an ostensibly extraneous function call, which in itself is subject to Best Practices scrutiny, but it avoids the verbose (and ugly) expression "(boolean1 && !boolean2) || (boolean2 && !boolean1)"!
If the usage pattern justifies it, why not? While your team doesn't recognize the operator right away, with time they could. Humans learn new words all the time. Why not in programming?
The only caution I might state is that "^" doesn't have the short circuit semantics of your second boolean check. If you really need the short circuit semantics, then a static util method works too.
public static boolean xor(boolean a, boolean b) {
return (a && !b) || (b && !a);
}
!= is OK to compare two variables. It doesn't work, though, with multiple comparisons.
As a bitwise operator, xor is much faster than any other means to replace it. So for performance critical and scalable calculations, xor is imperative.
My subjective personal opinion: It is absolutely forbidden, for any purpose, to use equality (== or !=) for booleans. Using it shows lack of basic programming ethics and fundamentals. Anyone who gives you confused looks over ^ should be sent back to the basics of boolean algebra (I was tempted to write "to the rivers of belief" here :) ).
str.contains("!=") ^ str.startsWith("not(")
looks better for me than
str.contains("!=") != str.startsWith("not(")
'IT' 카테고리의 다른 글
명령 줄을 사용하여 JSON 객체의 항목을 계산하는 방법은 무엇입니까? (0) | 2020.06.12 |
---|---|
바이트 배열을 기본 null 이외의 특정 값으로 초기화 하시겠습니까? (0) | 2020.06.12 |
Java 응용 프로그램 내부에서 VM 인수를 얻는 방법은 무엇입니까? (0) | 2020.06.12 |
CSS에서 최대 문자 길이 설정 (0) | 2020.06.12 |
Java에서 더 이상 사용되지 않는 메소드 또는 클래스를 사용하는 것이 잘못 되었습니까? (0) | 2020.06.12 |