Perl コードとif
比較して最適に使用するためのガイドラインは何ですか? unless
状況によっては、どちらか一方を優先する強い理由はありますか?
9 に答える
Perl のベスト プラクティスでは、決して使用しないことをお勧めしますunless
。個人的には狂気だと思います。
unless
と書く単純な条件があるときはいつでも使用しif( ! ... )
ます。unless
特に後置として使用すると、バージョンがより読みやすくなります。
do_something() unless $should_not_do_that;
またはブロックunless
がある場合など、状況がより複雑になるときはいつでも避けることをお勧めします。(幸いなことに、またはおそらく残念なことに、見方によっては、ありません)elsif
else
elsunless
また、条件が他のブール値で構成される複雑な式である場合も同様です。例えば、
unless( $foo and !$bar )
かなり紛らわしく、同等のものよりも利点がありませんif
。
1 つの難解なケースを除けば、1 unless
は の単なる構文糖衣ですif !
。より明確で表現力豊かなコードを記述できるようにするために存在します。この目標を達成するときに使用し、それを損なうときに避けるべきです。
unless
ループ内のフロー制御に最も役立つことがわかりました。例えば
while (<$fh>) {
next unless /\S/;
# ...
}
単純な否定の場合、否定よりも明確だと思います。コードを読むときにif
、その先頭を見逃すのは簡単です。!
unless ($condition) {
do_something();
}
if (!$condition) {
do_something();
}
unless ... else
しかし、それは耳障りなので、書かないでください。
後置形式で、コードを介して予想されるパスが何であるかについてのヒントを提供します。
do_normal_thing() unless $some_unlikely_condition;
1) 評価された最後の式が異なり、明示的な
return
.
経験則として、'unless' はあまり使用しない方がよいでしょう。
これは、後置形式で特に役立ちます。たとえば、次のようになります。
delete_old_widgets() unless $old_widget_count == 0
次の場合を除き、絶対に使用しないでください。
- 複合条件付き (and、or、not)
- else 節で
この種の質問の動機は理解していますが、次のようなものの使用を煮詰めるのは本当に賢明だとは思いませんunless
具体的な経験則に。これは、Perl の多くの補助構文と同様に、プログラマーが自分の裁量でより明確に表現できるようにするためのささやかな利便性として提供されています。私は、「プログラミング Perl」を通じて、主任開発者が複数の方法で多くのことを述べているのを見てきました。より高い目的や合理化はありません。これが問題を巧みに処理していることは十分承知していますが、それを使用する際に私が課す唯一の制約は、コードをより明確にするという幅広い目的に役立つことを確認することです。もしそうなら、すべてが順調です。コードが理解できるかどうかを認識することは、それ自体が直感的であり、組み込みの修飾子/演算子/全体的な構文のあらゆるニュアンスに関する過度に一般化された使用条件のほんの一握りに還元することはできません。
私の意見は、そうでない限り決して使用しないことです。私の理由は次のとおりです。
- 構文がコードを読みにくくしていると思います。if を実行する単一のメソッドを持つことで、物事がよりシンプルになり、一貫性が高まります。
- 後でelseステートメントを追加する必要がある場合は、unlessをifに変更する必要があります。すでにifである場合は簡単です。
- ステートメント内のロジックがより複雑になると、"unless (x == 5 && y != 7)" のような奇妙なコードになる可能性があります。2 番目のチェックで二重否定があるため、これは奇妙です。
- x != 5 など、否定する方法は他にもあります。
- 他の言語とより一貫性があります。私は、ステートメント以外のステートメントを持っている他の言語を知りません。これには非常に正当な理由があると思います。
perl では、if ステートメントを書く方法が 4 つあります。私は、他の言語とも一貫性のある単一の一貫した方法を好みます。
0.02 ドルの価値があります。
個人的な意見かもしれませんが、if条件が!で始まる場合を除いて、私は使用するのが好きです。
構文 if(!$condition) は、unless($condition) と同等であり、条件の NOT を交換した場合も同様です。
個人的には、IF ステートメントのみを使用することを好みます。なんで?覚える量が少ないからです。100 行のコードがあり、半分が until() を使用し、残りの半分が if() を使用している場合、if() ステートメントだけの場合よりもデバッグに多くの時間を費やす必要があります。
ただし、unless と if のこつを「つかむ」ことができるので、2 つの間を移動するのにまったく時間がかかりません。しかし、それはif()とunless()の違いだけではありません。それを忘れないでください...
if($condition) {
#passed-condition code
} else {
#failed-condition code
}
...と同等です...
unless(!$condition) {
#passed-condition code
} else {
#failed-condition code
}
しかし、if(){...}elsif(){...} はどうでしょうか? それと同等のものを、unless(){...}elsunless(){...} にどのように作成しますか? ロジックが複雑になるほど、if() と until() の間を行き来するのが難しくなります。覚えておく必要が少なく、記憶のバランスをとる必要が少ないほど、独自のコードをすばやくデバッグできます。