programing

부울 체크에 xor 연산자를 사용하는 것이 좋은 관행인가?

prostudy 2022. 5. 23. 21:28
반응형

부울 체크에 xor 연산자를 사용하는 것이 좋은 관행인가?

는 개인적으로 독점적인 것을 좋아하거나,^, 연산자는 부울 체크의 맥락에서 의미가 있을 때 그것의 구체성 때문에.나는 쓰는 것을 훨씬 더 좋아한다.

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

보다

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

하지만 나는 종종 경험 많은 다른 자바 개발자들로부터 혼란스러운 표정을 짓기도 하고, 때로는 그것이 어떻게 비트 운영에만 사용되어야 하는지에 대한 코멘트를 받기도 한다.

이용에 관한 베스트 프랙티스가 궁금하다.^교환원의

간단히 사용할 수 있다.!=대신에

나는 당신이 당신 자신의 질문에 대답했다고 생각한다 - 만약 당신이 사람들로부터 이상한 시선을 받는다면, 아마도 더 명시적인 선택을 하는 것이 더 안전할 것이다.

만약 당신이 그것에 대해 언급할 필요가 있다면, 당신은 아마도 그것을 좀 더 장황한 버전으로 대체하는 것이 더 나을 것이다. 그리고 사람들이 처음에 질문을 하도록 하지 않는 것이 좋을 것이다.

나는 비슷한 대화를 많이 한다는 것을 알아.한편으로, 당신은 자신의 목표를 달성하는 작고 효율적인 방법을 가지고 있다.반면 나머지 팀원들도 이해할 수 없는 부분이 있어 앞으로 유지하기가 어렵다.

나의 일반적인 규칙은 사용하고 있는 기술이 프로그래머들이 일반적으로 알기를 기대하는 것이 합당한 것인지 묻는 것이다.이 경우 프로그래머가 부울 연산자의 사용법을 알기를 기대하는 것이 타당하다고 생각하므로 if 문장에 xor를 사용하는 것은 괜찮다.

좋지 않을 수 있는 예로서 xor를 사용하여 임시 변수를 사용하지 않고 두 변수를 교환하는 요령을 취하십시오.그것은 내가 모든 사람들이 친숙할 거라고 기대하지 않는 속임수야. 그래서 그것은 코드 리뷰를 통과하지 못할 것이다.

예를 들어 코멘트를 해주면 괜찮을 것 같아.// ^ == XOR.

항상 장황한 이름을 붙이는 함수로 포장하면 된다.

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

하지만, 내가 보기엔 ^ 연산자가 무엇인지 모르는 사람이라면 구글을 정말 빨리 검색하는 것이 어렵지 않을 것 같다.처음이 지나면 기억하기 어렵지 않을 겁니다.다른 용도를 요청했으므로 비트 마스킹에 XOR를 사용하는 것이 일반적이다.

또한 XOR를 사용하여 번째 임시 변수를 사용하지 않고변수의 값을 스왑할 수 있다.

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

XOR 스와핑과 관련된 Stackoverflow 질문이 있다.

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

IMHO 이 코드는 다음과 같이 단순화할 수 있다.

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

코드 명료성을 염두에 두고, 부울 체크에서 XOR를 사용하는 것은 XOR 비트 와이즈 운영자에게 일반적인 용도가 아니라고 생각한다.내 경험상, 자바의 비트 XOR는 일반적으로 마스크를 구현하는 데 사용된다.flag toggle동작:

flags = flags ^ MASK;

Vipan Singla의 이 기사는 사용 사례를 더 자세히 설명한다.

예시와 같이 비트와이즈 XOR를 사용해야 하는 경우, 여러분이 왜 사용하는지를 설명하십시오. 왜냐하면 여러분이 비트와이즈가 있는 독자들이 왜 그것을 사용하는지 이해하기 위해 트랙에서 멈추어야 할 가능성이 높기 때문이다.

나는 개인적으로 "boolean1 ^ boolean2" 표현이 간결하기 때문에 선호한다.

내가 (팀에서 일하는) 당신의 상황이라면, "boolean1 ^ boolean2" 논리를 "isDifferent(boolean1, boolean2)"와 같은 서술적 이름의 함수에 캡슐화하여 타협점을 찾겠다.

예를 들어 "boolean1 ^ boolean2"를 사용하는 대신 다음과 같이 "isDifferent(boolean1, boolean2)"를 호출하십시오.

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

"IsDifferent(부울1, 부울2)" 함수는 다음과 같다.

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

물론 이 해결책은 표면상으로는 무관한 함수 호출의 사용을 수반하는데, 그 자체는 베스트 프랙티스의 정밀조사를 받지만 장황한(그리고 못생긴) 표현(부울1&!부울2) |||(부울2&!부울1)은 피한다!

사용 패턴이 정당화되면 왜 안 되는가?당신 팀은 교환원을 바로 알아보지 못하지만 시간이 지나면 알아볼 수 있을 겁니다.인간은 항상 새로운 단어를 배운다.왜 프로그래밍이 안 되는가?

내가 언급할 수 있는 유일한 주의사항은 "^"가 두 번째 부울 체크의 단락 의미론적 의미를 가지고 있지 않다는 것이다.만약 당신이 정말로 단락 의미론이 필요하다면, 정적 활용법도 또한 작동한다.

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

!= 두 변수를 비교해도 괜찮다.하지만 다중 비교로는 효과가 없다.

비트의 연산자로서 xor는 그것을 대체하는 다른 어떤 수단보다 훨씬 빠르다.따라서 성능이 중요하고 확장 가능한 계산을 위해서는 xor가 필수적이다.

내 주관적인 개인적인 의견:술주정뱅이에게 평등(== 또는 !=)을 사용하는 것은 어떤 목적을 위해서도 절대 금지되어 있다.그것을 사용하는 것은 기본적인 프로그래밍 윤리와 기초가 부족하다는 것을 보여준다.당신에게 혼란스러운 시선을 주는 사람은 누구나 부울대수의 기초로 돌아가야 한다(여기서 "믿음의 강으로"라고 쓰고 싶은 유혹을 받았다 :)).

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

내가 보기엔 더 좋아 보인다.

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

참조URL: https://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the-xor-operator-for-boolean-checks

반응형