program story

Java에서 if (b == false)와 같이 부울 상수와 명시 적으로 비교하는 것이 좋지 않습니까?

inputbox 2020. 10. 28. 08:04
반응형

Java에서 if (b == false)와 같이 부울 상수와 명시 적으로 비교하는 것이 좋지 않습니까?


작성하는 것이 나쁜가요?

if (b == false) //...

while (b != true) //...

대신 작성 하는 것이 항상 더 낫 습니까?

if (!b) //...

while (!b) //...

아마도 성능에는 차이가 없지만 둘 사이의 명확성, 간결성, 명확성, 가독성 등을 어떻게 평가합니까?

최신 정보

주관성을 제한하기 위해 권위있는 코딩 스타일 가이드 라인의 인용문 중 어느 것이 항상 선호되거나 언제 사용되는지 감사하겠습니다.


참고 : 변수 이름 b은 ala foobar.


반드시 나쁘지 않고 불필요한 것입니다. 또한 실제 변수 이름에는 많은 가중치가 있습니다. 나는 예를 들어 if (userIsAllowedToLogin)if (b)또는 더 나쁜 것을 선호합니다 if (flag).

성능 문제와 관련하여 컴파일러는 어떤 식 으로든이를 최적화합니다.

업데이트 : 권위있는 소스에 관해서는 Sun Coding Conventions 에서 명시 적으로 뭔가를 찾을 수 없지만 적어도 Checkstyle 에는 SimplifyBooleanExpression그것에 대해 경고 하는 모듈이 있습니다.


첫 번째 스타일을 사용하면 안됩니다. 사람들이 다음을 사용하는 것을 보았습니다.

  • if ( b == true )
  • if ( b == false )

개인적으로 읽기는 어렵지만 무난합니다. 그러나 그 스타일에 대해 내가 가진 큰 문제는 그것이 당신이 보여준 믿을 수 없을 정도로 반 직관적 인 예제로 이어진다는 것입니다.

  • if ( b != true )
  • if ( b != false )

저자의 의도를 결정하기 위해서는 독자가 더 많은 노력을 기울여야합니다. 개인적으로 진실 또는 거짓에 대한 명시적인 비교를 포함하여 중복되므로 읽기가 더 어렵다는 것을 알지만 그게 나입니다.


이것은 강하게 맛의 문제입니다.

개인적으로 나는 그것이 코드를 나중에 유지할 때보 다 if (!a) {훨씬 덜 읽기 쉽고 (편집 : 나에게) if (a == false) {오류가 발생하기 쉽다 는 것을 발견 했으며 후자의 형식을 사용하도록 변환했습니다.

기본적으로 단어 (C 대 Pascal) 대신 논리 연산을위한 기호를 선택하는 것을 싫어합니다. 왜냐하면 나에게 a = 10 and not b = 20 보다 읽기 쉽기 때문입니다 a == 10 && !(b==20). 그러나 그것이 Java에서하는 방식입니다.

"== false"접근 방식을 "!"에 찬성하는 사람 코드를 너무 오랫동안 쳐다 본 적이 없었고 느낌표를 놓친 적이 없었습니다. 예, 코드 블라인드를 얻을 수 있습니다.


첫 번째 스타일을 사용하지 않아야하는 가장 중요한 이유는 다음 두 가지가 모두 유효하기 때문입니다.

if (b = false) //...

while (b = true) //...

즉, 실수로 한 문자를 생략하면 비교 대신 할당이 생성됩니다. 할당 식은 할당 된 값으로 평가되므로 위의 첫 번째 문은 값 false을에 할당 b하고로 평가합니다 false. 두 번째 양수인 trueb, 항상로 평가 있도록 true, 당신이 무슨 상관없이 b루프 내부.


초보자가 작성한 코드를 제외하고는 전자를 본 적이 없습니다. 그것은 항상 후자이고 누구도 그것에 대해 정말로 혼란스럽지 않다고 생각합니다. 반면에

int x;
...
if(x) //...

vs

if(x != 0) //...

훨씬 더 논쟁의 여지가 있습니다.이 경우 두 번째를 선호합니다.


IMHO, 앞에 붙은 bool 변수 이름을 만들면 "Is"자명하고 더 의미가있을 것입니다. 그러면 true또는 와의 명시적인 비교를 제거 할 수 있습니다.false

예:

isEdited  // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names

기타


나는 더 명확하기 때문에 첫 번째를 선호합니다. 기계는 똑같이 잘 읽을 수 있지만 나는 기계뿐만 아니라 다른 사람들 이 읽을 수 있도록 코드를 작성하려고 합니다.


나는 긴 접근 방식을 선호하지만 99 %의 시간 ==대신 사용 비교 !=합니다.

이 질문이 Java에 관한 C#것임을 알고 있지만 종종 언어 간을 전환 하며 예를 들어에서 (isntance의 경우)와 비교 == false하면 nullable bool 유형을 처리하는 데 도움이 될 수 있습니다. 그래서 나는 연산자 와 비교 true하거나 false사용하는 습관을 얻었습니다 ==.

나는 이것을한다 :

if(isSomething == false) 또는 if(isSomething == true)

하지만 나는 이것들이 싫어 :

if(isSomething != false) 또는 if(isSomething != true)

분명한 가독성을 위해!

코드를 읽기 쉽게 유지하는 한 중요하지 않습니다.


개인적으로 코드를 리팩토링하여 부정적인 테스트를 사용하지 않습니다. 예를 들면.

if (b == false) {
   // false
} else {
   // true
}

또는

boolean b = false;
while(b == false) {
  if (condition)
      b = true;
}

IMHO, 90 %의 경우 코드를 리팩토링 할 수 있으므로 음성 테스트가 필요하지 않습니다.


제 생각에는 단순히 성가신 일입니다. 그래도 내가 소동을 일으키지 않을 것입니다.


일반적인 지침은 부울에 대해 테스트하지 않는 것입니다. 일부는 추가 장황함이 명확성을 추가한다고 주장합니다. 추가 된 코드는 일부 사람들에게 도움이 될 수 있지만 모든 독자는 더 많은 코드를 읽어야합니다.

오늘 아침 저는 버그를 찾기 위해 1/2 시간을 잃었습니다. 코드는

    if ( !strcmp(runway_in_use,"CLOSED") == IPAS_FALSE)
      printf(" ACTIVE    FALSE \n");   else
      printf(" ACTIVE    TRUE \n");

정상적인 규칙으로 코딩 되었다면 그것이 틀렸다는 것을 훨씬 더 빨리 보았을 것입니다.

    if (strcmp(runway_in_use, "CLOSED"))
      printf(" ACTIVE    FALSE \n");   else
      printf(" ACTIVE    TRUE \n");

이것은 StackOverflow에 대한 나의 첫 번째 대답이므로 멋지다 ... 최근 리팩토링하는 동안 2 블록의 코드가 거의 똑같은 코드를 가지고 있지만 사용 된 하나는

for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}

and the other had

for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (!vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}

so in this case it made sense to create a method which worked for both conditions like this using boolean == condition to flip the meaning

private void appendCustomersToNotify(List<Alert> alerts
        List<Alert> customersToNotify, List<Long> vipList, boolean vip){

    for (Alert alert : alerts) {
        Long currentId = alertItem.getUserId();

        if (vip == vipList.contains(currentId)) {
            customersToNotify.add(alertItem);

            if (customersToNotify.size() == maxAlerts) {
                break;
            }
        }
    }
}

I would say it is bad.

while (!b) {
    // do something 
}

reads much better than

while (b != true) {
    // do something 
}

One of the reasons the first one (b==false) is frowned upon is that beginners often do not realize that the second alternative (!b) is possible at all. So using the first form may point at a misconception with boolean expressions and boolean variables. This way, using the second form has become some kind of a sjiboleth: when someone writes this, he/she probably understands what's going on.

I believe that this has caused the difference to be considered more important than it really is.

참고URL : https://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-e-g-if-b-false-i

반응형