三項演算子は、割り当てステートメントの外で使用する必要がありますか?


9

編集これは、3項演算子が有害かどうかの問題ではありません。それは、割り当てステートメントの外で使用する必要があるかどうかについてコンセンサスがあるかどうかについてです。/編集

ブール値に基づいて、2つの異なる関数(戻り値なし)の1つを呼び出します。私はこのJavaScriptのビットを書きました:

(condition) ? doThis(arg) : doThat(arg)

if-elseステートメントを書くよりも見た目がきれいだと思います。

if(condition) {
    doThis(arg);
}
else {
    doThat(arg);
}

私の同僚は、三項ステートメントは割り当てステートメントでのみ使用するべきだと強く信じています。これについて説明しているスタイルガイドが見つかりません。おそらく、JavaやC#などの言語ではこれがまったく許可されていないためです(コンパイラは値を返すために3項演算子を必要とします)。これは三項ステートメントの悪用と見なされるべきですか?どうして?


Jason Voorheesが割り当てられている可能性があることに注意してください。
David Hammen、2015

2
@gnat-式での?:の一般的な使用に関する質問の複製ではありませんが、これは特に、計算される単一の値がない場合にif-elseの代わりとして使用することに関するものです。
ジュール

提案された複製の妥当性について私は2つの考えを持っていますが、この質問は依然として主に意見に基づいているため、再開する意味はありません。
Ixrec 2015

なぜこれがきれいに見えると思いますか?このような慣習を破ることは、クリーンの反対です。
JacquesB

回答:


10

一般的に言えば、条件演算子は、値持つ ifステートメントを作成することを目的としていますw = x ? y : z。したがって、それを副作用に使用している場合、直感に反します。有効ですが直感に反します。チームメイトが読むためのコードを書いていることを思い出してください。


これは正しいようです。Wikipedia含め、私が見つけたほぼすべての使用例では、演算子を使用して条件付き割り当てを実行しています。
BobbyA

3

割り当てではないいくつかのケースで、3項演算子が役立つと思います。

関数の引数で:私の意見では

f( e1, .. cond ? em : dm, .. en);

エラーが発生しにくい

if ( cond) f( e1, .. em, .. en); else f( e1, .. dm, .. en);

同じ引数を使用して関数を呼び出したい場合:もう一度見つけます

(cond ? f : g)( /* long and complex argument list */);

エラーが発生しにくい

if ( cond) f( /* long and complex argument list */);
else g( /* long and complex argument list */);

私が見ているように、それぞれのケースで重要なことは、フォームの繰り返しが少ない。繰り返しにより、1つのインスタンスを変更し、もう1つのインスタンスを変更し忘れる可能性が開かれます。


5
ただし、これらの場合でも、3項演算子を使用して値を返しているため、上記のsyrionの回答によると、これは予想される使用法です。
BobbyA

@BobbyA void関数についてはどうですか?
2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.