web-dev-qa-db-ja.com

関数の戻り値をif条件として使用するのは良い習慣ですか?

関数の戻り値をあたかも条件のように使用することは良い習慣だと思いますか?私はPHP atmでコーディングしていますが、それは他の多くの言語にも当てはまります。

if(isTheConditionMet($maybeSomeParams))
{
}

または

$res = isTheConditionMet($maybeSomeParams);
if($res)
{
}

最初の問題が問題になるような状況は考えられませんか?

編集:条件が評価された後、戻り値は使用されないと仮定します。

5
guenis

投稿したコードでは、関数の結果を使用する前に変数に格納する必要はありません。 (変数のnameが十分に意味がある場合を除き、コードが読みやすくなります。)

一方、値を複数回参照する必要がある場合は、関数を複数回呼び出すのではなく、変数に値を格納する必要があります。これは、非効率的または間違った可能性があります。

$res = isTheConditionMet($maybeSomeParams);
if ($res)
{
    echo "res = $res\n";
    // do stuff
}
18
Keith Thompson

前者が問題を引き起こす、または煩わしい唯一のケースは、デバッグ中に関数を評価しない、または評価できないデバッガを使用する場合です。最近まで、これは.NET関数/ビジュアルスタジオの場合でした。

確かなことは言えませんが、適切なオプティマイザがメモリを節約するために変数を最適化するのではないかと思います。

8
Steven Evers

翌日にそれを見ることができ、それが明白で読みやすい場合は、課題は必要ありません。しかし、それは大量の引数を持っているか、または演算子の束とともに括弧の場合に他の多くの関数呼び出しを伴っていました、私はあなたが実際に切り替えようとしているがらくたが何であるかを説明するために、名前の付いた変数にそれをドロップしますオン。

1
Erik Reppen

コードが正常に機能していて、デバッグする必要がないと仮定します。

変数$ resは使用しないので、そこにも配置しないでください。コードブロック1には、isTheConditionMetの戻り値に対する比較演算が1つあります。

コードブロック2では、戻り値はassignedから$ resになり、ifで比較されます。なぜ追加の割り当て操作があるのですか?.

0
Ozair Kafray

あなたが本当に考える必要があるもう一つの状況はここにあります:

if(isTheFirstConditionMet($maybeSomeParams) and isTheSecondConditionMet($maybeSomeParams))
{
}

または

$res = isTheFirstConditionMet($maybeSomeParams);
$res2 = isTheSecondConditionMet($maybeSomeParams);
if($res and $res2)
{
}

突然、コードは同じように動作しなくなりました。最初のケースでは、2番目の条件は、最初の条件がtrueの場合にのみ評価されるためです。ただし、2番目のケースで一時変数に割り当てると、両方の関数が常に評価されます。複数の条件を使用している場合は、必要な動作について本当に考える必要があります。

PHPと私が知っている他のほとんどの言語は短絡評価を使用しています。つまり、結果を得るために最小限の評価を実行します。

0
Pieter B