== trueを大事にしますか?


105

私の同僚が絶えず書いています:

if (someBool == true)

それは私を壁に押し上げます!私はそれを大事にするか、単に落とすべきですか?


12
私は明示的ですif (some_flag == true)が、暗黙的if (is_something)またはを好みif (has_something)ます。変数名に注意してください。
fredoverflow

69
の型someBool == trueもブール値であることを同僚に思い出させてくださいif ((someBool == true) == true)
マイクシーモア

2
@GSto:あなたはそれを知っていると思いますが、PHPではそれを行うことでboolに「キャスト」し、実際に役立つことができます。
zneak

2
@zneakまたは、より明確に使用できます$var = (bool) some_expression。また、ほとんどの場合、PHPが必要な変換を動的に行うため、それも問題になりません。
waiwai933

4
(true == someBool)の場合、誤って==の代わりに=と入力した場合に備えて、常に定数を最初にチェックしてください[はい、冗談です!]
スティーブンA.

回答:


126

それは冗長なコードであり、生死ではありません。しかしながら....

頻繁に発生する場合someBoolは、名前の付け方に問題がある可能性があります。良い名前は、==true

if(IsSomeCondition)

または

if(hasCondition)

または

if(somethingExists)

例えば。


これは私にとって最も真実です。明快さとネーミングの芸術に関するすべて、元の構文はそれほど悪くはありませんが、これはより良いコードへの正しい道です。
TJB

2
それに私を打つ!適切な命名がなければ、より簡潔な同値性はまったく意味をなしません。
トロイハント

4
someBool == trueわかりやすくするために、レガシーコードに数回使用する必要がありました。しかし、私は一から書く場合、私はそれに応じて変数に名前を付け、使用if (isSomething)
nimcap

名前がSomeBoolであると仮定すると、名前付けでこれを解決できますが、私は同意します、それは何かを意味し、任意のタイプである可能性があります(おそらく配列内のブール値の量に等しい整数?)ブール値には、ある種の実存動詞が必要です。そうでないと、常に単独で読むのが難しくなります。
モーガンハーロッカー

私は同意します、それはすべて読みやすさについてです。変数に適切な名前が付けられている場合は、必要ありません。式の方が読みやすい場合は、「== true」を選択します。(lyい)「if(!())」の代わりに「== false」を使用しても一貫性があります。
ロニーブレンデル

71

私が見るときsomeBool == true、私はプログラマが評価の概念を内部化していないように感じずにはいられません。これはかなり根本的な欠陥です。

しかし、大学で数回夏にプログラミングを教えるために夏を過ごしたため、私の意見は歪められています。彼らがコンセプトを模索すると、冗長性が明らかになりました。

それ以外の有能なプロのプログラマーにとっては、おそらくそうではありません。それはおそらくプログラミングの初期の頃に開発した悪い習慣であり、まったく揺れたことはありません。しかし、インタビューで誰かが最初に見たものだとしたら、それでも少し怖いでしょう。


これをすぐに習慣化することはしないでしょう。プロのプログラマーの口から、本当に驚くべきことを聞いたことがあります。通常、その後すぐに、「これはどのように機能しましか?」
ダッシュトムバング

12
評価について心から同意します。ときどき、「どこで止まるの?」と思いました。ように(!(((X ==真)==真)== TRUE)= false)の場合は//と...
yawmark

1
時々私は書きますif (c == true) return true; else return false;が、99%の時間(私はいくつかを見逃していないことを確信できないので1%があります)私はすぐに気づき、全体をに置き換えますreturn c。ほとんどの有能なプログラマーは、キャリアの早い段階で習慣を身に付けた場合、同様のことをするはずです。私が期待しないのは、wtf応答です。
ライライアン

1
ああ、思考の芸術。私は、文字通り先週私たちのコードベースでこれに出くわしました。if (!someCondition) { someCondition = false; }私たちのコードにはいくつかの(そして多くの)冗長性といくつかの不可能性がありますが、これはとても簡単でしたが、誰かが実際に書いたと考えると非常に悪化しました。何度も。
アンソニーペグラム

1
ただ、私はいくつかのケース見ていることに注意してif(x) x=true;冗長化されなかったのではなく、同等のx=!!x;(0/1まで正規X)
jkerian

58

それも私を夢中にさせますが、彼らに建設的な方法で冗長性を言及し、同意しなくてもそれを落とすと言います。

あるいは、このアプローチを試すこともできます
あなた:ブール値を評価するために、次のコード規約を使用し始められますか?

if (someBool==true)&&(true==true) {}

Them:なぜそうするのですか?その文の後半は冗長であり、常に真と評価されます。

あなた:ジョージによって、あなたは正しいです。愚かな私。それでは、すべての冗長性のないバージョンを使用してみましょう。どう?

if (someBool) {}

6
ええ同意しました 馬鹿げていますが、あなたは戦いを選択する必要があり、このコードは実際にあなたの同僚のものがすることをしています。「あなたと一体何が間違っているのか?」以外で言及してください。方法の、それをドロップします。彼らは、または「(!真someBool ==)であれば」「(!someBool = true)の場合」または他のそのような畳み込み、それは....選ぶ価値がある戦いになるかもしれないのようながらくたを引っ張って起動した場合けれども
BlairHippo

3
(someBool == false)がif(someBool == true)より悪いのはどうですか?
FinnNk

5
true=trueコンパイルされません、あなたがすることはできません割り当てるtrue;-)
fredoverflow

1
if(somebool == false)または!=に慣れましたが、常にfalseに反してtrueではありません。私はそれが冗長であると思うが、コーディング標準if()が関数呼び出しのように見えると主張しているので、括弧の間の空白は私がそれを読むのを助ける。私自身、boolはboolですが、if (somePointer)飛ぶことはありません。if (somePointer != NULL)ポインタはブールではないので、私は好む。
ダッシュトムバン

5
読みやすさについてであり、非論理的または(マイクロ)冗長性ではありません
ロニーブレンデル

45

同僚にとって非常に些細なことがあなたの最大の問題であるなら、あなたは自分自身をかなり幸運だと考えるべきだと思います。


5
完璧に努力するのは良いことですが、揚げ物にはもっと大きな魚がいることは間違いありません
TJB

3
あなたは議論に値するすべての問題についてこれを言っていると思います。
デイブヴァンデンアインデ

2
それは潜在的にはるかに大きな問題を示しています。ガレージの天井にある小さな茶色の染みは大したことではないように思えるかもしれませんが、大きな水漏れがあることを意味する場合があります。
ジョシュ

42

あなたは間違いなくこの悪い習慣をやめるべきです。そっと...

二重等号を書くのを忘れがちで、コードは次のようになります。

if (someBool = true)

たとえば、C#では、これは警告ではなくエラーを生成します。したがって、警告をエラーとして処理しない限り、コードは実行され、変数をtrueに設定し、常に条件を入力します。


6
これは関連する議論ではありません。そのような言語で作業している場合は、反対側に真実を移すことができます。問題は、真実をまったく含めるかどうかです。
カム

8
@Cam:ポイントが欠けているのはあなたです。後方論理私は提案していません。
グッファ

15
@Cam-彼は、これが問題になる可能性のある実世界の例を提供しています。これは非常に重要だと思います。
ChaosPandion

1
@Guffa Camはとても正しい。これは、ifブロックで==(anyType)の使用を停止する理由ではありません。
ロニーブレンデル

2
@Ronny:いいえ、どのタイプでも発生することはありません(言語が実際に任意のタイプを条件として許可しない限り)。if (answer = 42) {}式はブールではないため、ステートメントは単純にコンパイルされません。
グッファ

21

私はあなたに同意しますが、ここで悪魔の擁護者を演じるつもりです。


言語と変数の名前に応じて、x == trueが適切です。

静的型付けと整数型の型強制を使用した言語では、次の状況を考慮してください。

if (actionsAllowed){
    //do actions, since they are allowed
    //...
}

コードのこのセクションを読んでいる人はすぐに、actionsAllowedがブール変数であることに気付かない場合があります。許可されたアクションの数を表す整数でもかまいません。したがって、== trueを追加すると、xがブール値であり、ブール値に強制される整数ではないことが明らかになります。

if (actionsAllowed == true){
    //do actions, since they are allowed
    //...
}

13
読みやすさ== GoodThing
Muad'Dib

5
((読みやす== GoodThing)== true)の場合は...
JoelFan

1
bool isGoodThing = readibility?true:(codingStandards?true:(internalizationOfConcept?true:false));
johnc

17
そのため、変数の名前を変更しますactionsAreAllowed
グレアムペロー

9
書くif (x) { ...ことによって、あなたはすでにそれxがブール値であるか、ブール値に変換可能であると断言しています。あなたがそれを呼ぶものは無関係です。
ダニエル・アーウィッカー

15

nullable boolsはどうですか?

bool? MyFlag = null;

if (MyFlag == true)
    ;  

if (MyFlag)  // error, doesn't compile!
    ; 

もし(MyFlag.Value)
JOHNC

1
すべての言語にNULL可能boolがあるわけではありません。boolを使用する言語の多くは、2番目の構造を受け入れます。
zneak

1
@johnc:「if(MyFlag.Value)」は、MyFlagがnull(MyFlag.HasValueをチェックすることでテストできる)の場合に例外をスローする可能性があるため、実際に望んでいることをしない場合があります。
ルドヴィックシャバン

4
これは、nullable boolsを使用した私のペットのピーブです:)
ジャロッドディクソン

3
ブール?isValid = null; if(isValid ?? false);
スコリマ

11

通常、コーディング規約が何らかの形でプロジェクトを著しく妨害しているのでない限り、コーディング規約から大したことはしたくないでしょう。私は多くの白熱した議論がコード領域や主要なアンダースコアのような小さなものにエスカレートするのを見ました。

そうは言っ== trueても、条件ステートメントに追加しても問題はありません。実際のところ、== false否定的な条件をテストする際には、感嘆符の先頭ではなく使用する習慣があります。もっと読みやすいと思います。

確立された慣習がある場合、変更する理由がない限り、それに従うと言います。ただし、大きな悪臭を放つ価値はありません。


1
言語によっては、trueと評価された場合でも、someValueは必ずしもtrueと同等ではない場合があります。たとえば(9 == True)、Pythonではfalse と評価されますが、C ++でも同様のことが想像できます。
ダッシュトムバン

コード領域と主要なアンダースコアにより、私は人々を顔でpunchりたくなります。
MGOwen

11

了解。私はその男です。恥、恥。それが私が学んだ方法であり、頭の中で「自動フォーマット」する方法です。Joelの好みの構文を使用するのは、bool変数に「is」のような動詞接頭辞がある場合だけです。「is」、「can」、「did」などの動詞が必要です。または、動詞「equals」を提供するために==が必要です。私はその習慣を決して破らないかもしれないので、路上で私に「こんにちは」と言わないなら理解します。


7
それは悪いことではありません。実際のテキストのように読み取るコードは、暗黙のfooよりもはるかに優れています。読みやすくするために、その習慣を守ってください。
ロニーブレンデル

11

「boolean madness code」を思い出させる

if(someBool == true)
   otherBool = false;
else
   otherBool = true

の代わりに:

 otherBool = !someBool

それは面白いです、私はそれらが散らばっているシステムを維持しなければなりませんでした。それは私を狂気に駆り立てました。
Tjaart

8

個人的に、私はCベースの言語で「しない」と言う方法を強く嫌います。その小さな感嘆符は見落としがちです。

したがって、私は完全にそれを書きます:

if (someCondition == false) {

しばらくそれを読んだ後、私も対称性が欲しい

if (someCondition == true) {

したがって、の!代わりに使用するCのアーティファクトと考えてくださいnot


3
C ++は、実際に持っているnot事業者を、そして(あなたが標準ヘッダーを含めるいったんのでCはありません<iso646.h>)。このヘッダーを使用したくない(または使用できない)場合(またはJavaまたはC#で動けない場合)、感嘆符の後にスペースを入れることをお勧めしますif (! condition)。これにより、多少目立ちます。
コンラッドルドルフ

1
私はJavaをします。 notオプションではありません。

6

言語に依存しますが、通常は悪い考えです...

Cでは、これを実行しないでください。テストする値がfalse(ゼロ以外)ではなく、「true」として定義された単一の値と等しくない状況を見つけるのは簡単すぎます。

Rubyでこれを行うのは、ブール値true以外のすべてで失敗することを絶対に確信している場合のみです。

C ++およびbool型のその他の静的言語では、冗長であり、の=代わりにタイプミスをするとプログラミングエラーが発生し==たり、コメントに記載されているプロモーションエラーが発生したりする可能性があります。


実際、代入演算子が値を返す言語では、C ++のように... if (b == true) {は単なる冗長ではありません。また、誤ってに割り当てtrueられる可能性があるため、少し危険ですb
スティーブンC

4
C ++では冗長なだけでなく、危険です。を記述しif (b == true)bboolではない場合、型変換は間違った方向に進みます。Aは、boolあなたが書いた場合、通常は値1を適切な整数型に昇格される整数型である、と言う、int b(2); if (b == true)その後trueとなりint、比較の目的のために値1を持つ、というよりは、bタイプに強制されているbool右の結果を与えることになります。
デビッドソーンリー

@DavidThornley、コンパイラで警告をオンにします。警告をエラーとして扱うのは、回避するよりも防御的なプログラミング手法の方が良い==です。
アビックス


4

私は好む

if (bVal)

または

if (!bVal)

でも、それを持ち出すと人々を怒らせるのではないかと心配しているので、私のアドバイスはそれを忘れることです。ごめんなさい!


4
聖なるものでない 限り、if (!bNotVal)あるいはif (bNotVal)そもそも聖なるものすべての愛のために。名前に否定的なものがあると、すべてが読みにくくなります。
ダッシュトムバン

2
私はisNotConnectedをだます開発者を知っていました。if(isNotConnected == true)... yuck
johnc

4

あなたは彼がそれを間違っていると彼に告げるべきです。

その

if(true == someBool){

}

もし彼が1つを忘れたら=彼は彼の執筆スタイルに大きな問題を抱えています。


3

どう?

if (x == "true")

なぜそれは文字列ですか?!


私はいくつかのレガシーPHPコードに取り組んでいますが、時々次のようなものを見つけますif(preg_match('/title/', implode($_POST))){。PHPは、もっといい仕事を見つける必要があると言いました。
Keyo

4
ええ、私は(x == "1")かどうかも確認しますが、それは通常、不十分なdb設計に対して行われます。
atfergs

xユーザー入力(たとえば、構成ファイルまたはWebサービス)から来たときに、同様の構成体を使用しました。それはより多くのように終わるので、しかし、私は通常、他truish値を許可if x.lower().strip() in ["true", "yes", "on", "1"]
eswald


3

私はそのようなコードを書きます!

その理由は次のとおりです。

「if bla == true」は文のように読みますが、「if bla」は多くの場合そうではありません。実際のコードを読むとき、それはただ間違っているように聞こえます。

また、コンパイラーはifブロックでの割り当てについて警告するため、== trueを使用しても実際には危険はありません。(=と混同する)

また、「== true」と書かない人は、「== false」に「!()」を使用しますか?本当にいです。また、「== false」を使用する場合、「== true」を使用することは非常に一貫性があり、真理を検証する2つの異なる方法があります。


3
「if bla」は文のように読まないと言います...それはあなたの変数が適切に命名されていないことを意味します...これの何が悪いのか:if(userHasRights)doSomething()
JoelFan

"多くの場合"。はい、あなたは正しいです。名前の変更も問題ありません。「if(QWidget :: acceptDrops()== true)」を使用すると、名前を変更することはできません。おそらくそれをdoesAcceptDrops()と命名するのが良いでしょう...それは手間がかかりすぎる(そして、どのAPIでもその省略ルールを使用して一貫性を保つことは不可能です)ので、他の「==何でも」-if省略しないことを強くお勧めします。したがって、「見た目」が変わらず、一貫性があります。
ロニーブレンデル

3

チームの一員として働いていることを忘れないでください。そのため、これらを一緒に解決する必要があります。「他の人とうまくやる」は、小学校を卒業した後でも重要な性格特性です。


2

通常、「== true」は省略されますが、チームのコーディング標準に含まれていない限り、1分も議論する価値はありません。


3
また、チームのコーディング標準に含まれている場合は、このような雑学を取り除くために標準を再評価する必要があります。
JohnFx

同意した!ただ、しかし...場合
FinnNk

2

私は主にC#開発者として同意していますが、これが常に当てはまるとは言えません。たとえば、Javascriptでは、===はタイプ合体を実行します。したがって、var x = 3の場合:

if(x) --> true

ながら

if (x === true) --> false

私はJSでもif(x == true)を使用せず、単に何かを考えるため、==とは異なると思います。

私のオフィスで出てきた別のポイントにこの種のタッチ:

bool b = false;

C#では、bool b; は十分であり、bfalseに初期化します。ただし、上記の行を記述する方がより明示的であり、とにかく最適化中にコンパイラーによって取り外される必要があります。

だから、私のポイントは、何が良いプラクティスであり、そうでないかが常にそれほど明白ではないということだと思います。


bool b;bフィールドである場合のみfalseに初期化されます。ローカル変数を明示的に初期化する必要があります。
マシューフラシェン

+1が同意しました。他の(スクリプト)言語でも同じ問題が発生します。ブール値trueまたは単に「true」をテストする場合は、明示的でなければなりません。たとえば、空でない文字列は考慮されます== true=== true、一部の言語では考慮されません。
マーティンウィックマン

2

ああはい、しかし変数がnull可能だとしたらどうでしょう?(ブール?)

一部の言語(C#)では、 'true'との比較とキャストまたは比較が必要になります。

bool? isAccepted = true;

if((bool)isAccepted)
{...}

if(isAccepted == true)
{...}

2

若者はルールを知っていますが、老人は例外を知っています;)

最新C#では、を扱っているnull-able bool場合、次のことを行う必要があります。

bool? x = null;
bool? y = true;
bool? z = false;
if (x == true || y == true || z == true) {
    // That was the only way that is reasonably readable that I know of
    // to accomplish this expression.
}

トライステートが問題でない場合、通常、何かをtrue/ と比較する理由はないはずTrueです。ただし、Python他のいくつかの言語では、非ブール式でC/C++実行できますif。これらの言語には、整数、ポインター、リストなどを真または偽として解釈するための独自のルールがあります。いつかあなたはそれを望まないでしょう。たとえば、次のPythonスニペットでは:

x = True
y = 'abcdef'
z1 = x and y
z2 = (x == True) and (y == True)

ここにあるz必要がありますがTrue、するz2必要がありますFalse。さて、Clojure言語はさらに別の方法でこれにアプローチします- and関数は必ずしもa boolに評価されるわけではありませんが、それifを処理できます。

言語に関係なく、何かをTrueまたFalseはと比較していることに気づいたときは、おそらくコメントする価値があります。


最初の問題は、ひどい変数名を使用することによる誤った前提IMOに起因します。x、y、zの名前が、、、notExceptButHasXであるexceptNotButIsntYとしdoNotUnlessIsExceptZますか?それはあなたの問題を読みやすくするためにどのように役立ちますか?X、Y、Zが「ISENABLED」、「isEffective」、「hasProperty」のようなものを命名した場合は、あなたの文はなりisEnabled || isEffective || hasPropertyはるかに読みやすいとの比較よりですtruefalse
トーマス

1

そのようなコーディングは、以前にも間違った方法で私をこすったでしょう。サンプル識別子の名前は「someBool」ですが、ブール型であることが保証されていない変数にそのコーディングスタイルを誤って使用すると、意図しない動作が発生する可能性があります。「someBool」の値が正確に「true」または「false」でない場合、結果はfalseになります。

昨年、このようなコーディングスタイルが原因で非常に微妙なバグに遭遇しました。これは、そのような構成体に目が光るので識別が困難でした。「どうしてそれが間違っているのだろう」と思うでしょう。「(var)」や「(!var)」などのよく知られた式についても同じことが当てはまり、動作を確認せずにそれらを読んだりコーディングしたりします。

そのため、コードベース内のこのようなバグの存在を減らし、そのような微妙なバグが将来いつか偶然に忍び寄る可能性を減らすために、いくつかのコーディング標準を導入しました。

  1. すべての式は、意図ごとに括弧で囲む必要があります。
  2. すべてのブールテストは、「suchBool!= false」のように負で表現する必要があります。

新しいスタイルに適合しないコードをクリーンアップすることで、このような微妙なバグのいくつかのインスタンスを特定して修正しました。


1
いくつかのsomeBoolをTRUE / FALSE以外のものにすることは、コーディングの習慣としては不適切です。
AttackingHobo

@AttackingHobo、これは言語にブール型を持たない、またはクラスを使用して正確な動作を提供しないという落とし穴の1つです。
Huperniketes

1

次の理由により、ActionScript 2で常にこれを使用する必要がありました(確かに今では死んだ言語です)。

var something:Boolean = org.black.box.unknown.ThisMightNotExistYet();

// this is slightly ambiguous
if(something)
{
}

// because if you allow undefined you might actually mean
if(false != something)
{
}

// which can mean something different than
if(true == something)
{
}

// and comparing against what you actually MEAN is less script than
if(undefined != value && value)
{
}

だから、ほとんどの場合、具体的であることが最善でした。


1

同意する。特に強力な型付き言語では、冗長な構造です。

ブール値の別の誤用を追加するために、私はJavascriptでこの種の構築を何度も見つけました(特に100以上の行のようないくつかのスパゲッティのようなモンスター機能で):

//create the variable, not initializing it
var flag;
//...
//assing a value to the var, by the example 
flag=$("mycheckbox").selected;
//...

//and at the moment of use it:
if(flag!=true) {
   //code to execute when the checkbox is unchecked
}

この言語には厳密な型定義がないため、一部のプログラマーはfalse|undefined値をいじる必要がないことを好むようです。


1

このようなコードを持っている同僚がいます。

if(something == true)

そして、ある種のテスト/デバッグのために、このブロックを呼び出さないようにしたいので、次のように変更します。

if(something == true && false)

そして、時々彼はそれを次のように変更します:

if(false)

最悪の事態は、この種のデバッグがときどきすり減ってしまい、他の開発者が読むのが本当に悪いことです!


0

コードベースでは一貫性が重要だと思います。そのため、ほとんどの組織で使用されているスタイルを使用する必要があります。好みのスタイルを会社の公式コーディングガイドラインの一部にしてください。既にガイドラインに含まれている場合は、それに従ってください。

(言われていると、それは本当に私を困らせるでしょう-しかし、それから大したことをするのにおそらく十分ではありません)。


0

余分な== trueを配置しない方がいいのですが、時々誤って含めて気付かないことがあります。その人は気付かないで、誤ってそれらを置いたかもしれません。コードを読み直して、余分な== trueを追加したことに気づいたので、== trueを削除しました。気付かないこともありますが、冗長に配置したと言ってくれる人を喜んで歓迎します。


0

どうですか:

int j = 1;
for (int i=1; i>=j; i++) ...

はい、見ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.