1

ほとんど独学のプログラマーとして、私は特定のものが使用されるべきか、使用されるべきでない理由を実際に誰かに説明させたことがありません。1つの例(私が数年前に取り上げて頻繁に使用したもの)は、代替の制御構造構文です。

x = (y == true) ? "foo" : "bar";

個人的には、この構文は、特に短く簡潔なコードの場合は簡単に理解できますが、「実際に」使用されることはあまりないので、これをもっと使用するのが悪い習慣かどうかを知りたいと思います。伝統的なif...else構造?

前もって感謝します。

4

8 に答える 8

13

ほとんどが独学のプログラマーの仲間として、私はあなたに私の意見を述べるだけであり、その背後に特別な権限はありません.

三項条件演算子 (?:) は、副作用のない式に使用する場合は完全に受け入れられることがわかりました。何かをするか他のことをするかの決定を表すためにそれを使い始めるとすぐに、(私の意見では) それを悪用しています。

つまり、制御構造はコードの流れを構造化するためのものであり、演算子は式のためのものです。物事をそのように保つ限り、コードは読みやすいままです。

于 2009-01-23T13:24:02.613 に答える
2

条件演算子 (三項演算子と呼ばれることもありますが、技術的には正しくありません。Marc のコメントを参照してください) は、実際には「代替制御構造」ではなく、いくつかの重要な違いがあります。

  • 条件演算子は演算子であり、式で使用される値を提供します。
  • /else が制御構造である場合、(もちろん) 単独では値を返しません。
  • 条件演算子の選択肢も式でなければなりません。
  • if-else 構造の選択肢は、任意の数のステートメントにすることができます。

もちろん、類似点もあります。

  • それぞれが条件式を評価します。
  • 条件のブール値に基づいて、適切な選択肢 (式またはブロック) のみが評価されます。
  • 両方を同種の他のものと一緒に連鎖させて、より長い「スイッチのような」ステートメントを形成することができます。

一般に、副作用 (つまり、値を返す代わりに作業を行う) の代替式を評価している場合、条件演算子を使用すると、if-else 構造を使用するよりも保守担当者が混乱する可能性があります。

次のすべてに該当する場合は、条件を使用します。

  • 条件文と代替文は理解しやすいものです。
  • どの式にも副作用はありません。
  • 将来、選択肢に追加の動作 (つまり、副作用や追加のステートメント) が必要になることはありません。

与えられた例は、三項条件の適切な使用です。

疑わしい場合は、if-else を使用してください。条件を別の種類の if-else と考えて、それに属さないものを詰め込もうとすることに注意してください。これは、(特にレガシー コードで見つかった場合) 条件演算子を完全に無視するようなものです。

于 2009-01-23T13:42:44.073 に答える
1

あなたが参照している構文は、三項条件演算子と呼ばれることが多く、意味的には if/else 句と同等であり、まったく同じように実行されます。

これらの構文を使いすぎることに対する主な反論は、if/else の方法を使用する場合ほど読みにくい、多少乱雑なソース コードが作成される可能性があることです。これは、その特定の構文について知らない人に特に当てはまります。人々が if/else を理解していると仮定することは、100% 安全である可能性がはるかに高いです。

于 2009-01-23T13:21:26.567 に答える
1

これは、三項式として知られています。三項演算子で意図を明確かつ簡潔に表現できる場合は、そうします。私は通常、線を引き、複合式 (&& または || で結合された 1 つ以上) を持ちます。

良い:

var x = (someVar > 42 ) ? ThisFunction() : ThisOtherFunction();

悪い:

var x = (someVar > 42 && anotherVariable.IsSafeForConsumption() && IsNotProcessing ) ? ThisFunction() : ThisOTherFunction();
于 2009-01-23T13:23:10.900 に答える
0

最も基本的なシナリオで使用される場合を除いて、私はそれを避けると言います。2つのコンストラクトが同じ正確なMSILにコンパイルされている場合、理解しにくいものを使用するのはなぜですか?

于 2009-01-23T14:32:40.540 に答える
0

条件演算子は、ほとんどの開発者にとってなじみ深いはずです。実際には、私は簡単に使用します:

x = y ? "foo" : "bar";

従うのはかなり簡単だと思います。==true/は、ブール値の==false(IMO)やり過ぎのようです。より一般的な「古い世界」の使用法は次のとおりです。

if(12345 == someVar) {...} // etc

この「const == 変数」は「=」対「==」の問題を回避するためのものですが、C# は数値をブール値として扱わないため、これが問題になることは非常にまれであり、より一般的です ( C#) をより明確に表示するには:

if(someVar == 12345) {...} // etc

余分な = を見逃すと、通常はコンパイルされません。

于 2009-01-23T13:23:05.220 に答える
0

私にとって、この問題はマルチプログラマー環境での可読性と保守性の 1 つです。

他の誰かがコードを読む必要がある場合、または後でコードに戻る場合は、コードを読みやすくする必要があります。

ケースを単純にしない限り、三項演算子を使用するコードは簡単に難読化されて判読できなくなります。

  • 複雑にしないでおく
  • 少しでも読みづらくなったら if { } else { } にリファクタリング
于 2009-01-23T14:13:00.283 に答える
0

さらに、三次演算子は本質的に式を装ったステートメントであるため、次のようにすることができます。

x = (y == true) ? "foo" : "bar";
string instructions = "Please can somebody go and get me a " + x;

これを次のように変換します。

string instructions = "Please can somebody go and get me a " + 
                      ((y == true) ? "foo" : "bar");

追加の括弧が必要であることに注意してください。理由がわからない場合は、自分でコンパイルしてみてください。

これは非常に便利な機能で、私は常に使用しています。副作用のある式や、可読性を低下させる過度に複雑な式を記述しないように他の人が言及しているように、注意してください。

少し関係のないメモですが、念のため、このようなコードを書かないでください (私は何度も見てきました):

if (y == true) {
   weWantAFoo = true;
}
else {
   weWantAFoo = false;
}

代わりにこれを行う必要があります:

bool weWantAFoo = (y==true);

これは、ステートメント以外の場所で条件ステートメントを使用するもう 1 つの例ですif

于 2009-01-28T12:27:30.283 に答える