「if(0 == value)…」は、害よりも害をもたらすのではないでしょうか?[閉まっている]


49

これは、他の誰かのコードで見たときに最も嫌いなものの1つです。私はそれが何を意味するのか、なぜこのようにするのかを知っています(「誤って代わりに「=」を入れたらどうなりますか?」)。私にとっては、子供が階段を降りて階段を数えて声を出しているようなものです。

とにかく、これに対する私の議論は次のとおりです。

  • プログラムコードを読み取る自然な流れを混乱させます。私たち人間は、「値がゼロの場合」ではなく「値がゼロの場合」と言います。
  • 最新のコンパイラーは、条件に割り当てがある場合、または実際には条件がその割り当てだけで構成されている場合に警告を発します。
  • プログラマーである場合、値を比較するときは二重の「=」を忘れないでください。「!」の入力を忘れることもあります。不平等をテストするとき。

17
私もそれをあまり気にしませんが、それは私の個人的なペットの覗き見のリストのかなり下です。
アダムクロスランド

7
また、プログラマーは二重の「=」を見逃すことがあります。間違いを犯すのは簡単であり、見落としがちです。
10

8
これはどのように建設的でないのか、本当の質問ではないのですか?
TheLQ

7
これは閉じているので、ここに私の短い意見があります:人々は書くことを覚えているが、書くことを覚えて0 == valueいないことができるの==か?? あなたがそれについて考えているなら、私は気難しいことを意味します、最初からそれを正しく書きませんか。
ハンニバルレクター博士

3
@muntoo:コンパイラーによると、多くのことは「正しい」ものであり、非常に良いベンチマークだとは思いません。
ハンニバルレクター博士

回答:


59

ああ、はい、「ヨーダの条件」(「値がゼロの場合、このコードを実行する必要があります!」)。私は、lint(1)のようなツールで「より良い」と主張する人を常に指します。この特定の問題は、70年代後半から解決されました。ほとんどの現代言語はif(x = 10)、ブール値への代入の結果を強制することを拒否しているため、のような式さえコンパイルしません。

他の人が言ったように、それは確かに問題ではありませんが、それは少しの認知的不協和を引き起こします。


32
「Yoda条件」の+1。私は実際にそれで大爆笑だ。:)
ボビーテーブル

3
順序は問題ありませんが、単純なブールキャストの代わりにゼロと比較することに反対しますif(!value)
SF。

1
だから、条件内の割り当てをエラーと見なしますか?

4
「ほとんどの現代言語はこれをコンパイルすらしません」問題は、ブール値への代入の結果を静かに強制する言語を使用している場合に発生します。私が考えることができる最も人気のある言語はJavaScriptです。これが、Javaでもヨーダの条件を常に使用する理由です。そのため、javascriptを作成するときに忘れずに実行します。私はこの2つを頻繁に切り替えて、それが問題になる可能性がある(そして問題になっている)。
サムハスラー

3
誰もコンパイルしないコンパイラを知っていますif (0 == x)か?
クリストファーアイヴス

56

それは小さいが目立った精神税を課すので不快です。

ほぼすべてのプログラミング言語(およびほとんどの自然言語)で左から右に読みます。

を見る123 == xと、私が精神的に解析する方法は次のとおりです。

  • 123- だから何?不完全な情報。
  • == -まあ、123は123です、なぜそれをテストします...
  • x-OK、それが私たちが心配していることです。今だけコンテキストがあります。
  • もう一度考え直して123、なぜxと比較するのかを考え直してください。

x == 123メンタルパーシングを見ると:

  • x-コンテキストを提供し、条件が何であるかを知っています。残りを無視することもできます。前のフローに基づいて、私はなぜ、そして何が来るのかについて良いアイデアを持っています(そして、異なる場合は驚かれます)。
  • == - 私はそうだと思いました。
  • 123 - うん。

混乱はわずかですが(単純な例では)、私はいつもそれに気付きます。

たとえば、値に注意を引きたい場合は、値を最初に置くことをお勧めしますif (LAUNCH_NUKES == cmd)。通常、これは意図ではありません。


5
まさに。自然言語では、定数は常に同じ理由で最後に来ます。光が赤の場合
...-mojuba

2
@mojuba確かに、ほぼ普遍的です。奇妙なことに、オブジェクトが主題の前に来るいくつかの自然言語(OVS / OSV順序)がありますが、それらはすべてあいまいです。
dbkk

1
一方、変数の前にシンボルを読む傾向がある人もいます。彼らはより人目を引く。だから私は出て解析します===123x、とさえ私の頭の中で英語にコードを変換するために悩まないで終わります。
イズカタ

また、ほとんどのコンパイラーは、中括弧を使用しない限り、適切にプロンプ​​トが出されると警告を出すため、問題を解決しようとしません。
デュプリケータ

47

有害ですか?いいえ。どちらの方法でも機能します。

悪い練習?せいぜい議論の余地がある。単純な防御的なプログラミングです。

寝る価値がありますか?いや


8
そしてそれを読んだとき、私はコーディングスタイルを議論する最も重要な理由であるコードをすぐに理解します。私は完全に同意し、睡眠を失う価値はありません。
ジェフシヴァー

17

これは基本的にフレイムベイトです。

いいえ、それは良いことよりも害はありません。シンプル。

もっと言葉?

コンパイラー引数?えー、いや、多分-自分自身からあなたを救うためにコンパイラーに過度の信頼を置かないでください。

「あなたは忘れてはならない」 -まあ当たり前 -もちろん何をあなたはその間、私は疲れているべきではない、私は人間の私のメイクされ、時には、ちょうど時々 2つの異なる言語を使用していたとしたすべての日をコーディングしないてきました間違い。

この種の動作のポイントは、あなたがクラッシュすることを期待しているために保険を持っているよりも間違いを犯すことを期待しているため、防御的であり、そこにないということです...

読みにくい?あなたは、まともなプログラマーが==ハードワイヤード(すべての種類の悪い仮定をする)を持つべきであるが、同じまともなプログラマーは0 == valueを読むことができないと文句を言っていますか?

害はなく、潜在的な利点があり、ばかげた質問があり、他の人が望むなら先に進んでください。


6
プログラミングを勉強する前に代数を勉強した人にとっては、0 ==値は不自然だと思います。
mojuba

4
それは一種のポイントではありません-はい、そうです、それは正しく読みませんが、プログラマーとして私たちが書くものの大部分は自然言語として正確に積み重なるわけではなく、あなたが何を解釈するかという問題ですあなたが見る
マーフ

4
Bravo .. 不自然に読むので、あなたはそれにもっと注意を払う傾向があるという事実は言うまでもなく、それゆえ潜在的な間違いを見つけます。
mocj

7
@mocj-したがって、コードを読んでいる人が実際にコードを読む必要があることを保証するために、すべてのコードをできるだけ鈍感にする必要がありますか?
カズドラゴン

6
@mocj-それはありがたいことですが、あなたの主張は、ヨーダの条件を読んでいるときの「ブレインスタッター」は良いことだということでした。私は、もしそうなら、「頭脳st音」を引き起こすようにすべてのコードを書くことを目指すべきかという質問をしています。本物の質問。
カズドラゴン

11

私はそれを害とは言いませんが、それは不快です。だから私はそれがそうだとは言いません。


10

「=を忘れたらどうなる?」これまで本当に多くの重量を保持していました。はい、あなたはタイプミスをするかもしれませんが、私たちはすべてタイプミスをします。間違いを犯すことを恐れているので、コーディングスタイル全体を変えるのはばかげているようです。いつか何かを大文字にしたり、アンダースコアを忘れたりするかもしれないので、すべての変数と関数を句読点なしですべて小文字にしてみませんか?


5
それは問題のポイントではありません。ポイントは「それは有害ですか?」であり、そうではありません。最悪の場合でも非常に軽度の刺激ですが、有害ではありません。
マーフ

1
動的言語では-絶対に、シンボルの
入力を間違え、後で

3
あらゆる点で、夜遅く(または2回)過ごして(C ++コードで)ソースが==の代わりに=であることがわかった場合、ある程度の重みがあります。
-DevSolo

2
@DevSolo:私はそれはあなたのキャリアの中で実際に一度か二度起こるべきだと思うが、それ以上ではない
-mojuba

9

一部の人々は、条件文が何をしているのかを明確にするためにそれを使用しています。例えば:

方法1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

方法2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

一部の人々は、2番目の例がより簡潔であると感じている、または逆の議論がテスト自体の前のテスト(条件付き)のポイントを示しています。

実際のところ、私はどちらの方法でも構わない。私はスタイルについてのペットのぞき見を持っていますが、最大のものは矛盾です。だから、同じように、一貫して、あなたのコードを読むことを気にしません。

独自のスタイルを持つ6人の異なる人々が一度に取り組んでいるように見えるまで、それを混ぜて、私は少しイライラします。


4
2番目の例では、「ハァッ?」最初の方がはるかに読みやすいです。素晴らしい例です。:)
Mateen Ulhaq

6

私にとって、それは単純な調整です。(90年代に)CとC ++を学んだ人として、私はそれに慣れて、今でもそれを使っています。理由は教訓になっています。

「定数」の左側を見るために「条件付けられ」たら、それは第二の性質になります。

また、これは等価(または等価の否定)にのみ使用し、より大きい/より小さいには使用しません。

@Wonkoの答えに完全に同意します。


5

私が役立つと思うのは、ifの変数部分が非常に長く、値を見るとコードが読みやすくなる場合です。点線の名前空間言語には、この最高の例があります。

たとえば、ある種のエラーが発生し、特定の方法で回復された場合、2つの同時セッションが発生する可能性がありました。このようなもの:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

確かにこの例にはこれを行う他の方法がありますが、これはナンバーファーストバージョンが潜在的に読みやすい場合です。


2
ここのキーワードは「これを行う他の方法」だと思う;)
mojuba

この場合はそうですが、場合によってはこれが最も読みやすい結果です。私の唯一のポイントは、戦闘言語やIDEの行動とタイプ-Oよりも、この他を行うためのいくつかの正当な理由があるある
ビル・

正直なところ、<=および> =のヨーダ条件には問題があります。==記号は別の問題です。頭の中ではシンボルを切り替えることができるだけですが、あなたの場合はcount()が2以上である必要があることを覚えておく必要があります。より小さいか等しい記号。
アレックス

3

それでも、エラーが発生します。また、ループ演算子で割り当てが必要な場合があります。そうでない場合は、等価性をチェックするか、少なくともそれを使用する標準的な方法です。

(おそらくCode Completeから)従ったアドバイスは、比較で左側の低い値を維持することです。私は以前同僚とこれについて話し合っていましたが、彼はそれがちょっとおかしいと思っていましたが、私はそれに非常に慣れました。

だから私は言うだろう:

if ( 0 <= value )

しかし、私も言うでしょう:

if ( value <= 100 )

平等私は左の変数でチェックする傾向がありますが、それはより読みやすいです。


1
私はいつも使い慣れif(y > x)ています。y定数でない限り。
Mateen Ulhaq

以前はそのようにしていましたが、左側の値が最も低いという考えが得られると、コードが一目ではるかに読みやすくなることがわかりました。
グレナトロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.