web-dev-qa-db-ja.com

条件付きの場合、set.add()のブール値を返しますか?

セットクラスの追加演算子は、要素(追加する要素)がまだそこにない場合はtrue、それ以外の場合はfalseのブール値を返します。書いています

if (set.add(entry)) {
    //do some more stuff
}

きれいなコードを書くという点で良いスタイルだと思いますか?あなたが一度に二つのことをするので私は不思議に思っています。 1)要素を追加し、2)要素が存在するかどうかを確認します。

15
Andreas Braun

はい、そうです。

ブール値を返す操作の通常のポイントは、それを使用して、つまりif構成内で決定を行うことができるということです。この可能性を実現できる他の唯一の方法は、戻り値を変数に格納してすぐにifで再利用することです。これはばかげており、確かにif(operation()) { ... }。だから、先に進んでそれを行うだけで、私たちはあなたを判断しません(そのため)。

19
Kilian Foth

戻り値が何を意味するのかをメンテナがすでに知っているか調べる必要があるため、これは可能な限りクリーンではないと思います。それは、値がすでに存在していたか、まだ存在していないか、正常に挿入されたことを意味しますか?あまり使わないと分からないし、使っても精神的な負担が大きい。

私は次のようにします:

boolean added = set.add(entry);

if (added) {
    //do some more stuff
}

はい、少し冗長ですが、コンパイラはまったく同じバイトコードを生成するはずです。また、Javaセットを何年も使用していない人でも、何も調べなくてもロジックを追跡できます。

12
Karl Bielefeldt

trueが成功を意味する場合、それは良い明確なコードです

関数またはメソッドが成功するとtrue(またはtrueと評価されるもの)を返すという一般的な規則があります。あなたのコードがそれに従う限り、私はメソッドを条件付きに置くことは問題ないと思います。

このようなコードは、私の見解では不必要に乱雑になっています。

boolean frobulate_succeeded = thing.frobulate();

if (frobulate_succeeded) {
    ...
}

あなたは自分を繰り返しているように感じます。

ただし、戻り値の意味についての質問はあいまいです。 「追加された要素がすでに存在していたかどうかを示すブール値」と言います。これは、trueが要素が存在した(および追加されなかった)ことを意味することを意味します。その場合は、メソッドの戻り動作をより一般的なものに変更するのが理想的です。それが不可能な場合は、(他の人が提案したように)コード内の戻り結果を明確にラベル付けできるようにする追加の中間変数を追加します。

8
user82096

とてもCっぽいですね。ほとんどの場合、突然変異の結果にはわかりやすい名前の変数を使用し、if条件では突然変異は発生しません。

コンパイラーは、この変数がすぐに再利用される場合、この変数を削除します。人間はソースを読むのが簡単になります。私にとって、それはより重要です。

誰かがand/or句をif条件に追加して条件を拡張する必要がある場合、短絡が原因で特定の場合に.add()を呼び出さなくなる可能性があります評価。短絡が特に予想されない限り、これはバグとなる可能性があります。

2
9000

コードが壊れているようです コマンドクエリの分離 。これについては、 クリーンコードブック および 関数構造 ビデオで説明しています。したがって、クリーンコードの観点からは、これは良いスタイルとは見なされません。

「クリーンなコードはシンプルで直接的です。きれいなコードはよく書かれた散文のように読みます。クリーンなコードは、設計者の意図を曖昧にすることはありませんが、鮮明な抽象化と単純な制御ラインでいっぱいです。

-オブジェクト指向の分析と設計とアプリケーションのGrady Booch作者」

私にとって、あなたのコードの意図ははっきりしていません。エントリが正常に追加されたときに、またはすでに存在しているときに、両方が実行されますか? add()は何を返しますか?アイテム?エラーコード?