4つの式で三項演算子を使用する
-
06-07-2019 - |
質問
これは受け入れられるコーディング慣行ですか?
public class MessageFormat {
private static final Color DEFAULT_COLOR = Color.RED;
private Color messageColor = DEFAULT_COLOR;
public MessageFormat(Person person) {
Color color = person.getPreferredColor();
messageColor = (color != null) ? color : messageColor; // this line
}
}
またはクラシックを使用した方がいいですか...
if (color != null) {
messageColor = color;
}
解決
?:演算子の使用は、コードを読みやすくするために制限する必要があります。典型的な例:
a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );
この場合、コードを約5行に分割すると読みにくくなります。
通常、演算子全体を角括弧で囲みます。そのため、演算子を読み取るときに、単一の値として精神的に解析します。
messageColor = (color != null ? color : messageColor);
別のバリアントは
messageColor = color || messageColor;
色が" false"と評価されない限り、一部の言語では" colorと評価されます。その場合、messageColorの値です。私の意見では、これは人々を混乱させる可能性があるため、避けるべきです。
最も重要なことは、あなたのコードを読んでいる次の人(あなたであっても)が最小の認知オーバーヘッドを持つように一貫性を保つことです。
他のヒント
この場合、読みやすさ、理解の容易さなどは同じです(つまり、... )。最初の例での重複と明らかな自己割り当ては好きではありません。次のようなものに変換されます:
if (colour != null) {messageColour = colour;}
else {messageColour = messageColour;};
これは少しばかです。
私は通常、2番目の行を1行で記述しますが、それは個々の空想の問題です。コーディングスタイルのガイドライン:
if (colour != null) {messageColour = colour;};
編集(8年前よりも意見が増えました)
ベストプラクティスを探しているため:
// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
static final Color DEFAULT_COLOR = Color.RED;
// Strongly prefer final fields.
private final Color messageColor;
// Protect parameters and variables against abuse by other Java developers
MessageFormat (final Person person) {
// Use Optionals; null is a code smell
final Optional<Color> preferredColor = person.getPreferredColor();
// Bask in the clarity of the message
this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
}
}
他のコーディング標準とともに、三項演算子の使用はしばしば微妙な問題です。使用方法は、おそらくサイトのコーディング標準によって最適に決定されます。
ただし、この特定の状況では、2番目のオプションを必ずお勧めします。それはより明確であるだけでなく、三項演算子の使用はここではまったく不要です。 messageColorを自分自身に再割り当てする必要はないため、この特定の状況での三項演算子の唯一の機能はコードの難読化です。
三項演算子は、Cプログラマーの間でより一般的です。 Cでは、制御構造を避けると、分岐予測が間違っていないため、パイプライン処理を改善できます。 Javaでパフォーマンスの違いが見られることは疑わしく、if-null-then-assignパターンは3項よりもはるかに一般的です。ただし、既存のコードベースを維持している場合、通常は既存のコードとの一貫性を保つのが最善です。
これを頻繁に行うことに気付いたら、 defaultIfNull
、 firstNonNull
、または coalesce
関数を記述して、コードをさらに作成できます。簡潔。 Apache Commons Langには defaultIfNull
関数が含まれています。
一部の言語には || =
演算子が含まれています。これは、これらの言語のデフォルト値の通常のイディオムです。
2番目の方が好ましいのは、意味がより明確に表現されているためです。色がnullでない場合にのみ変更したい場合。最初の方法では、これがそれほど明確になりません。
あなたの場合、「クラシック」な実装を好むでしょう。なぜなら、私にとっては理解が早いので、その人が好みのものを持っている場合にのみ新しい色を使いたいからです。
NPEを回避したい場合、メソッド呼び出しで使用することがありますが、通常、次のリファクタリングの1つでこれらのいコードを削除します;)
三項演算子は、生成するコードが巧妙でコンパクトに見えるため、悪用されることがよくあります。
実際には、コードが読みにくくなり、エラーが発生しやすくなります。 可能な限り、より長いバージョンの
を使用することをお勧めします if ( <condition> ) {
<action> ;
}
三項構文の代わり。
私には申し分ないようですが(私はPythonの三項演算子をよく使います)、この種のスタイルの問題は通常非常に主観的です。プロジェクトにコーディングスタイルドキュメントがある場合は、それを確認することをお勧めします。