webdevqa.jp.net

条件の割り当てが悪いのはなぜですか?

PHP 6.5にNetBeansを使用しています。

私のコードでは、次のタイプのコマンドを頻繁に使用します。

if (($row = $db->get_row($sql))) {
        return $row->folder;
    } else {
        return FALSE;
    }

Netbeansは、IFステートメントで割り当てを使用すべきではないと言っています。

どうして ?

28

それらは悪くはありませんが、危険な間違いにつながる可能性があります。

割り当てが式であるcのような言語では、(たとえばa = b = c = 1;をサポートするために)一般的なエラーは次のとおりです。

if (a = 1) { .. }

しかし、あなたは持っていたかった

if (a == 1) { .. }

一部の開発者はタイプすることを学びました

if (1 == a) { .. }

'='を1つ忘れた場合にエラーを作成します。しかし、それは読みやすさを改善しないと思います。

ただし、最近のコンパイラでは、次のように記述した場合は警告が表示されます。

if (a = 1) { .. }

これがより良い解決策だと思います。その場合、あなたはそれがあなたが本当に意図したものであったかどうかをチェックすることを余儀なくされます。

51
Toon Krijthe

それは恐ろしいタイプミスを避けるのを助けようとしているのでしょう:

if(a = b)
   //logic error

私はそれについてあなたに警告するのに十分賢い環境を期待しますが、「ああ、その場合は心配しないでください」という条件を持っているのに十分賢い環境でもあります。

6
Tom Ritter

条件文には、多くの場合、短絡演算子が含まれます。したがって、この例を考えると:

_if ( a=func(x) && b=func(y) )
{
  // do this
}
_

すぐにはわからないかもしれませんが、2番目の割り当ては最初に返された_>0_の場合にのみ発生し、func(y)に予期した他の副作用がある場合は、それらも発生しません。

要するに、あなたが何をしているのかを知っていて、副作用を理解していれば、それは何も悪いことではありません。ただし、あなたがいなくなったときに他の誰かがあなたのコードを維持している可能性を考慮しなければならず、彼らはあなたほど経験がないかもしれません。

また、将来のメンテナは、あなたが次のことを意図していると思うかもしれません。

_if ( a==func(x) && b==func(y) ) ...
_

彼らがあなたのコードを「修正」した場合、彼らは実際にそれを壊します。

5
rev

常に割り当てに値を返す言語では、そうではありませんbad(関数型言語ではかなり一般的だと思います)が、(他の人がこれを入力している間にすでに言っているように)通常はあなたまたは他の誰かがそれを比較と間違えるかもしれません。コンパイラは通常それについて警告する必要がありますが、何をしているのか確信がある場合は無視できます...

2

ループ条件で$ row値を割り当てない場合、コードはどのように見えるでしょうか。これは私が思うにはるかに複雑になるでしょう...一部のメンテナにとっては読むのはそれほど良くありませんが、そうではありませんか?よくあなたはそれをすることができます

$next = mysql_fetch_assoc($result)
do{
...
...
...

$next = mysql_fetch_assoc($result) or break;
}while ($next)
1
tim