web-dev-qa-db-ja.com

if(!value)またはif(flag == value)のどちらがより明確な形式ですか?

これは主観的な質問であることを理解しているので、閉じる必要があることをお詫びしますが、あるフォームが他のフォームよりも一般的に優先されるかどうか疑問に思うほど頻繁に出てきます。

明らかに、最良の答えは「コードをリファクタリングして、偽りをテストする必要がないようにすること」ですが、そうするのが簡単な方法がない場合もあり、「else」ブランチは単に処理を続けることです。したがって、「偽でない場合」の構成が必要な場合、これは推奨される標準です。

Not演算子

if (!value)

または偽のテスト

if (value == false)
55
CodexArcanum

if (!value)の方が簡単/高速です。あなたが言ったように主観的。あなたが首尾一貫している限り、これが主なものです。

[〜#〜]編集[〜#〜]

追加するもう1つのポイント-true/falseキーワードを省略すると、(うまくいけば)コーダーがより適切な名前の変数を使用するようになります。 Bool変数は、常に次のような意味または状態の目的を示す必要があります。

if (MyWallet.IsEmpty)

上記の_== false_または_== true_は冗長であるため、使用する理由はありません。上記は人間がすぐに読めるものです。

解読するよりもはるかに良い:

if (MyWallet.EmptyStatus == true)またはこのようなばかげた何か。

70
KP.

私は個人的に好きです

if ((value == false) == true) ...

これは、ステートメント_value is false_が実際にブール値trueに評価されていることを確認しているためです...

そして、明らかに、両方の可能性をカバーすることで、さらに明確になります。

if ((value == false) == true && (value == false) != false)

_<grin/>_

明確にするために本当の大食いで、議論の余地のない読みやすさを要求するあなたのために、私はお勧めします

if (((value == false) == true && (value == false) != false) == true)

28
Charles Bretana
if (!value)

これは私の意見では常により明確です。

if (value == false)

ちょっと意地悪に聞こえるので、私はこれを言いたくないのですが、これは通常、コードを書いている人がブール値の使用を本当に理解していないことを示しています。 ifステートメント内のブール値を再検証する必要はありません。それは冗長です。

(個人的に、変数にvalueというより意味のある名前を付けるのではなく、名前を付けると、私もその人を困らせます。あなたが投稿したものは単なる疑似コードであると感じています。レビューで間違いなく言います。)

編集(以下のコメントに応じて):

それはささいなことのように見えるかもしれませんが、しばしばそれははるかに大きなもののしるしです。正直なところ、var == trueなどを使用するほとんどの人は理解していません。それは単なる事実です。私は彼らの愚かさを言っているのではなく、彼らがプログラマーであってはならないのは、彼らがおそらくレビューして学ぶ必要がある何かがあるということだけです。問題は、ロジックがはるかに複雑になると、このような概念を理解しないと、将来、はるかに大きな問題が発生する可能性があることです。 「それはスタイルだ」と言う人もいます。それはいいです。この場合の本当の質問は、「私がこのようにそれを行うことはどのように有益ですか?私または他の人々はそれから何を得るのですか?」です。その質問にしっかり答えられない場合は、「なぜこれが良いアイデアなのか」と自問する必要があります。

20
kemiller2002

私はneverif(value == true)を使用するので、一貫性を保つためにif(value != false)も使用しません。

13
Bill the Lizard

if(!value)は、特にブール変数に正しく名前を付けた場合に、より明確で「エレガント」になります

  • isWhatever
  • hasWhatever

何かのようなもの

if (Page.IsPostback == true)

私には冗長に見える

13
Claudio Redi

反対意見(種類)

コンパイルの観点からは、同じILを取得するので、読みやすさの観点からのみ重要です。

その観点から、if(value == false)はカジュアルな読者にとってより明白であり、!ブールの前に。

正直なところ、私は両方のアプローチを使用しており、ほとんどの場合、変数名に依存しています。 「bang」の代わりに「not」と言っても問題ない場合は、bang表記を使用する可能性があります

例えば.

if(!gotValue) {}
//if (I've) not gotValue

//but

if(checkValue == false){}
//If (I've) not checkValue doesn't quite work here grammatically.
11
Robaticus

私が使う Not value VBでコーディングしているが、value == false C#でコーディングする場合。感嘆符が変数の名前で失われることがあります(例:!legal)。多分それは私がええと、ベテランのベテランだからだ。

6
Rob Windsor

値がブール値であることが確実にわかっている場合は、(!value)も通常は優先します。しかし、多くの場合、文字列または数値になります。

数値zeroは、多くの言語の条件式ではfalseと評価されます(ただし、すべてではありません)。ただし、文字列「0」はtrueと評価されます。これは特にJavaScriptで問題になります。特にサーバーからJSON文字列を受信する場合、特にサーバーがPHPで記述されている場合)(ほとんどのPHP開発者がDBから値を取得してjson_encodeを呼び出すだけの不注意です。DBがstringsを生成することを知らず、ブールフィールドとして使用するすべてのゼロと1が次のようにエンコードされるという手掛かりがありません。反対側の文字列、つまり条件付きではすべてtrueとして扱われます)。

うそつき。私の提案:特に言語が「非常に動的」なタイプ(つまり、JavaScript、PHP、Perl)である場合は、明示的にしてください。

2
mishoo

それほど主観的だとは思わない。私はneverが長い形式で推奨されているのを見ました。実際、すべての本とコーディングガイド、および「優れたプログラマーになる方法」のハウツーは、私が読んだことを思いとどまらせます。

同じカテゴリに分類されます

if (value) {
  return true;
} else {
  return false;
}

OTOH、ここで与えられたすべての答えは、私の最初の声明をちょっと真実に等しくしません。

1
Luc

関係する変数の名前によっては、英語のセマンティクスに従って「真」のケースがより意味をなすため、if(!value)を使用することをお勧めします。

このMSDN記事 の例の1つを検討してください。

if(pane.IsChecked)

英語で「ペインがチェックされている場合」と読みます。

ただし、if(pane.IsChecked == true)は、「ペインがチェックされているかどうかがtrueの場合」と英語で読み取ります。英語の説明は、本来あるべきものよりもはるかに明確ではありません。

C#コードをバイナリで記述しない理由の1つは、人間が読みやすいことです。読んだときにうまく流れるコードとそうでないコードのどちらかを選択できる場合は、より読みやすいコードを選択してください。 「== true "はこの例をより読みやすくし、MSDNもそうは思わない。

確かに、これは少し気になる例です。しかし、他の回答のいくつかが示しているように、この考え方をより大規模なケースに適用しないと、読みやすさが損なわれる可能性があります。

1
David

少なくとも、変数や_Page.IsPostback_などの一般的なプロパティを評価する場合は、if (!value)スタイルを使用します。より複雑なものについては、次のように式を括弧で囲みます。

_if (!(SomeType.SomeProperty.CallingAMethod(input).GetSomething.BooleanProperty))
_

もう少し注意を引くために。

全体として、これはPerlスタイルのunlessおよびuntilキーワードの引数です。

1
Quick Joe Smith

あなたが好むものは何でも。 1つを選んで、それに固執してください。

0
IVlad

条件が単一の値のチェックだけの場合、!valueの方が高速です。

ただし、条件に複数の値チェックが含まれている場合は、value == falseを読む方がはるかに簡単です。どういうわけか、複数の値の否定よりも、等しいかどうかの複数のチェックを解析する方が簡単です。

0
Corin

私は実際に可能なフォームの多く。

これは実際には標準への記述方法ではありませんが、これは私がそれを見る方法です。

//if foo is(or exists)
if(foo)

//if foo is true
if(foo == true)

//if foo doesn’t exist
if(!foo)

if foo is false
if(foo == false)

したがって、== falseが冗長であることはわかりません。

0
Smar

申し訳ありませんが、2つ目は私には愚かに見えます。

誰かがそれを好めば、私はレベルを追加します:

if( (value==false) == true )

:)

0

私は2番目のオプションであるif (value == false)を好みます。私はそれをサポートする言語でif (~value)またはif (not value)を喜んで使用していますが、_!_は変数名または開き中括弧または|または||演算子...少なくとも私の意見では。

また、2つのこと:

  1. 私は決してif (value == true)をしていませんし、一貫性がないことに気付いています。そして、私の意見では一貫性が非常に重要ですが、その厄介な_!_は単にもっと悪いです。
  2. それは、ブレース・オン・ア・ニューラインのディベートと同じように、本当に個人的な好みの問題だと思います。私はそのような愚かな小さなことでチームメイトを批判することは決してありません、そして私はそうする人々を理解するのに苦労しています。
0
Oak

実行するためにifブロックが評価する必要がある条件は、trueに評価される必要があります。

したがって、valuefalseである場合、if (!value)ifブロックの実行を許可する理由は、_!_演算子が基本的にfalsevalueからtrueの値。これにより、括弧内の結果の条件がtrueブロックに必要なifに評価されます。実行するために。

if (value)if (!value)if (flag == value)if (value == true)if (value == false)は、何を達成するかに応じて、有効なコードです。例えば。 if (value == true)は構文エラーが発生し、if (value)は例外をスローするため、valueがnull可能なブールの場合、if (value.Value == true)は非常に役立ちますvalueブロックが実行される前に、ifがnullでないことを確認しないでください。

0
Olumide