三項演算子(条件?foo:bar)およびXOR(^)演算子


8

最近のコードレビューで、Javaでternary operator (condition ? foo : bar)との両方XOR operator ^が使用されることはほとんどないことを読みました。本当ですか?

はいの場合、読みにくいためでしょうか?またはその他の理由。


5
XOR演算子は、一般に高水準プログラミングではまれです。

両方で提供される機能は、IF-ELSEステートメントとして実装されることがよくあります。

回答:


8

三項演算子は、特に短いnullチェック/デフォルトに対してよく使用されます。

System.out.println("foo is "+(foo==null) ? "not set" : foo);

これをif / elseほど読みにくいと考える人もいますが、それは問題ではありませんでした。

XOR ビット演算子は、ビット処理でのみ使用されます。ビット単位のXORが必要な場合、それを回避する方法はありません。

XOR 論理演算子は確かに非常にまれなので、Java 過去10年間有効なケースでそれを見たことがありませんでした。これは、ブールXORが||またはのように「スケーリングしない」という事実にも起因し&&ます。私が意味したのは:

if( a && b && c && d ) ....   // it's clear what the intention is
if( a || b || c || d ) ....   // here also
if( a ^  b ^  c ^  d ) ....   // ???

私が推測する最後のケースでは、コーダーは「1つだけが真実であるべき」を意味しました。しかし、XORは獣です。コーダーは獣を手に入れましたが、彼が望んだものではありませんでした。

それは興味深いインタビューの質問になりifます。最後の結果は何ですか?


7
「!=」の方が読みやすいので、論理XORは表示されないと思います。
Nettogrof

1
それは素晴らしい雑学クイズですが、インタビューでは役に立たないでしょう。10年以内に誰も見たことがない、おそらく使用しないものを知っていても、優れた読みやすいコードを記述して製品をリリースできるかどうかはわかりません。:)
jmort253 2012年

1
@ jmort253:この種のコードを2回以上見た場合。しかし、いずれの場合も無効なコードでした。したがって、このようなインタビューの質問では、サプリカントが臭いコードを見つける方法を知っているかどうかがわかります。
AH

@AH-わかりました、それは理にかなっています。あなたは間違いなく不安定な論理を発見できる人を望んでいます。:)
jmort253 2012年

また、私は@Nettogrofに同意します- !=ブール値を数回使用したことがあり、論理XORは私の心を越えたことさえありません。
イズカタ

7

以前は解析が難しい三項演算子を見つけましたが、それが非常に役立つ場所がいくつかあることに気づきました。これらはアプリケーションロジックではなく、ロギングです。

例えば:

log.info( "Object foo is " + ( foo.isEnabled() ? "" : "not " ) + "enabled" );

私にとって、それはどちらよりもすっきりしている

if ( foo.isEnabled() ) 
    log.info( "Foo is enabled" );
else
    log.info( "Foo is not enabled" );

または

log.info( "Foo is enabled : " + foo.isEnabled() );

要約すると、それはそれがどこで使用されているかという問題です。

ビットに関しては、私はまだそれらに苦労していますが、それは、他のコメンターが示唆しているように、高度な抽象化で作業することに慣れているためです。コードのどこかでそれを使用して「効率的」にすることにした場合、私がそれを理解するのに費やされた時間は、メリットを打ち消します。


3
三項演算子をよく使用すると言いますが、かなり読みやすいと思います。それは、それを見ることに慣れ、あなたが言ったように、いつそれを使うべきかを知ることの問題です。IMHO、1行に収まらない場合は、if-elseを使用してください。
jmort253 2012年

その時期はとても重要だと思います。レビュー時に、私はのコードに沿ってコードをノックバックしましたfoo.setParam( bool ? ClassA.method() : ClassB.method )。動作しますが、IMOは少しにおいがします。
chooban

よくわかりません。もしあなたと私が一緒に仕事をしているなら、私はベストを尽くしていい演奏をし、それを私の使用に保守的にするつもりです。:)
jmort253

それはすべて状況次第です。私が考えていた例(もちろん、私は手書きで投稿する必要はありません)は、どこからデータを取得するかに関するビジネスロジックが不明瞭になっている場所でした。数行の追加コードとコメントがその地域の次の開発者を助けるどこかの例。を使用する読み取り不可能なperlコードから始めないでくださいunless ( !bool ) {。:)
chooban

3

これはより意見に基づく回答ですが、私の場合:

  1. 確かに、なんらかの理由で、3項演算子はif-else構文よりも読みにくいことに気づきました。

  2. XORに関しては、おそらくほとんどのJavaプログラムはそのような低レベルのビットごとの操作を使用しません。ほとんどの場合、これはCから継承された遺物にすぎないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.