web-dev-qa-db-ja.com

ブール定数と明示的に比較するのは悪いですか? if(b == false)in Java?

書くのは悪いですか:

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

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

always代わりに書く方が良い:

if (!b) //...

while (!b) //...

おそらく、パフォーマンスに違いはありません(またはありますか?)

更新

主観性を制限するために、常に望ましいまたはいつ使用するかについての信頼できるコーディングスタイルガイドラインからの引用も歓迎します。


:変数名bは単なる例として使用されています。alafoobarです。

70

必ずしも悪いわけではありません、ただ余分です。また、実際の変数名は非常に重要です。たとえば、if (userIsAllowedToLogin)上記if (b)またはさらに悪いことにif (flag)を好むでしょう。

パフォーマンスの問題に関しては、コンパイラーはそれを最適化します。

Update:信頼できる情報源については、 Sun Coding Conventions で明確に何かを見つけることはできませんが、少なくとも- Checkstyle には SimplifyBooleanExpression モジュールがあり、これについて警告します。

63
BalusC

最初のスタイルを使用しないでください。私は人々が使用するのを見ました:

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

個人的には読みにくいと思いますが、まずまずです。しかし、そのスタイルで私が抱えている大きな問題は、あなたが示した信じられないほど直感に反する例につながることです。

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

これは、読者の側で著者の意図を決定するためにより多くの努力を必要とします。個人的には、trueまたはfalseとの明示的な比較を含めることは冗長であるため、読みにくいと思いますが、それは私です。

47
Thomas

これは好みの問題です。

個人的には、if (!a) {if (a == false) {よりもはるかに少ない読み取り可能(編集:私にとって)なので、後でコードを保守するときにエラーが発生しやすいことがわかりました。後者の形式を使用するように変換しました。

me _a = 10 and not b = 20_はa == 10 && !(b==20)よりも読みやすいため、基本的には、単語ではなく論理演算のシンボルの選択を嫌います(C対Pascal)。 Javaにあります。

「== false」アプローチを採用して「!」を支持する人明らかに長い間コードを見つめたことがなく、その感嘆符を見逃したことはありませんでした。はい、コードブラインドを取得できます。

最初のスタイルを使用するべきではない理由は、これらの両方が有効であるためです。

if (b = false) //...

while (b = true) //...

つまり、1つの文字を誤って削除した場合、比較ではなく割り当てを作成します。割り当て式は割り当てられた値に評価されるため、上記の最初のステートメントは値falsebに割り当て、falseに評価します。 2番目はtruebに割り当てるため、ループ内でtrueを使用して何をしても、常にbに評価されます。

25
Alan Moore

前者は、初心者が書いたコードを除いて見たことがありません。それは常に後者であり、誰もが本当に混乱しているとは思わない。一方、私は思う

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

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

より議論の余地があり、その場合、私は2番目を好む

11
Michael Mrozek

私見、bool変数名の先頭に"Is"、それは自明でより有意義であり、trueまたはfalseとの明示的な比較を削除できます。

例:

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

7
Mahesh Velaga

明確だから、私は最初のほうが好きだ。マシンはどちらも同様に読むことができますが、私はマシンだけでなく、他のpeopleを読むためのコードを書きます。

5
Head Geek

私は長いアプローチを好みますが、99%の時間で_==_の代わりに_!=_を使用して比較します。

私はこの質問がJavaに関するものであることを知っていますが、私はしばしば言語を切り替えます。例えば、_C#_では、(可能性のために)_== false_と比較するとnull可能なbool型を扱うときに役立ちます。だから私はtrueまたはfalseと比較するという習慣がありましたが、_==_演算子を使用しました。

私はこれらを行います:

if(isSomething == false)またはif(isSomething == true)

しかし、私はこれらが嫌い:

if(isSomething != false)またはif(isSomething != true)

明らかな読みやすさの理由から!

コードを読みやすくする限り、問題はありません。

3
Joel

これはStackOverflowに対する私の最初の答えです。ニースです...最近、リファクタリング中に、2つのコードブロックがほぼ同じコードを持っているのに気づきました。

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

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

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

そしてもう一方は

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

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

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

そのため、この場合、boolean == condition意味をひっくり返す

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;
            }
        }
    }
}
2
lifesoordinary

個人的には、コードをリファクタリングして、ネガティブテストを使用しないようにします。例えば。

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

または

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

私見、90%の場合、コードをリファクタリングできるため、ネガティブテストは不要です。

2
Peter Lawrey

私の意見では、それは単に迷惑です。私が騒ぎを引き起こすものではありませんが。

1
ChaosPandion

通常のガイドラインは、ブール値に対してテストしないことです。追加の冗長性が明快さを増すと主張する人もいます。追加されたコードは一部の人々を助けるかもしれませんが、すべての読者はより多くのコードを読む必要があります。

今朝、私はバグを見つけるために30分を失いました。コードは

    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");
1
BOC

最初のもの(b == false)が眉をひそめている理由の1つは、初心者が2番目の選択肢(!b)がまったく可能でないことにしばしば気付かないことです。そのため、最初の形式を使用すると、ブール式とブール変数の誤解が指摘される場合があります。このように、2番目の形式を使用すると、ある種のsjibolethになります。誰かがこれを書いたとき、彼/彼女はおそらく何が起こっているかを理解しています。

これにより、違いが実際よりも重要であると考えられるようになったと思います。

1
Kees Huizing

私はそれが悪いと言うでしょう。

while (!b) {
    // do something 
}

よりもずっと読みやすい

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