14

私はいくつかのコードを維持していて、次のパターンをたくさん見つけました:

var isMale = (row["Gender"].ToString() == "M") ? true : false;

これの代わりに:

var isMale = (row["Gender"].ToString() == "M");

誰かがこれをする理由はありますか?前者の方が読みやすい、または明確だと思う人はいますか?これがホールドオーバーであるある種の古いC「落とし穴」はありますか?

4

9 に答える 9

19

正当な理由は?いいえ。

これは通常、条件自体が表現でもあることを実際には理解していない人々によって生成され、ブール結果を生成します。特に、BASICの多くの変種など、そうではない言語で学校に通う人々。

于 2010-07-01T20:18:38.920 に答える
16

有効なキャラクターから報酬をもらえると思います。それ以外は理由が思いつかない。

于 2010-07-01T19:59:57.950 に答える
10

信頼できない場合:(row["Gender"].ToString() == "M")真または偽を正しく生成するために、おそらく実際には信頼できないでしょう:(row["Gender"].ToString() == "M") ? true : false;どちらか。確かに、あなたは間違いなくそれを少なくともあと数回繰り返す必要があります:

(row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false;

==繰り返しになりますが、おそらく、それ?:自体の組み合わせも信頼できないかもしれません確かに、少なくとももう少し冗長性が必要になるでしょう。

if ((row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false == true)
    isMale = true == true;
else
    isMale = false != false;

うーん...多分私は昨夜遅くまで起きていた...:-)

于 2010-07-01T20:33:54.743 に答える
4

完全に冗長だと思います。

私の経験では、これは、条件ステートメントが時間の経過とともに進化し、サブステートメントではなく明示的なtrueまたはfalseで終わる場合によく発生します。

于 2010-07-01T20:00:59.113 に答える
4

trueそれ以外のものやfalseブール変数に割り当てることに抵抗がある人もいると思います。理由はわかりませんが、何度も観察しています。

したがって、その観点からは、次のようになります。

皮肉をオンに設定

bool isMale = (row["Gender"].ToString() == "M"); //BAAAAD

しかし

bool isMale = (row["Gender"].ToString() == "M") ? true : false; //BETTER

bool isMale;
if (row["Gender"].ToString() == "M") 
    isMale = true;
else 
    isMale = false;   // BEST!

皮肉をオフに設定します

幸いなことに、Resharperは、これらすべてのアンチパターンの短い作業を行います。

于 2010-07-01T20:03:13.357 に答える
3

The

if (somebool) return true;
else return false;

「パターン」は、私がこれまで働いたことのあるほとんどすべての場所で笑われます。私の意見ではそれをする理由はありません。

于 2010-07-01T20:40:39.300 に答える
2

三項演算子?:を適用すると、true / false(x==y)としか評価できない式は、まったく冗長です(まったく冗長です[冗長])。

上記の文章は、英語をあまりよく理解していない人にとっては読みやすいかもしれません。彼らは辞書で最初に何を調べるべきか、そして話されている場合は繰り返しのために何を調べるべきかを知っているからです。しかし、英語を母国語とする人にとって、その文は扱いにくく、まあ、冗長です。

あなたの例では、演算子が文書化の目的で使用されているか、不快感を与える意味がないので、演算子と式がどのように機能するかについての理解が不十分であると思われます。

理解不足であろうと、ドキュメントの奇妙な試みであろうと、次のような冗長な演算子なしでこれを行うことができます。

var isMale = (row["Gender"].ToString() == "M"); // bool

また...

var isMale = (row["Gender"].ToString() == "M"); // true/false

...またはさらに良いことに、暗黙の入力に依存するのではなく、「isMale」に適切なタイプを明示的に指定します。

bool isMale = (row["Gender"].ToString() == "M");

私はまた、人々がこのように(またはif / elseを使用して)コードを悲観化するのを見てきました:

bool something = some_int ? true: false;

これを行う必要はありません。コンパイラはこれを最適化できますが、次のような単純なものよりも分岐メカニズムに依存する方が本質的に効率が低くなります。

bool something = some_int != 0;

...これは同じ効果がありますが、条件分岐を使用するラウンドアバウトプロセスはありません。

この種のコードは恥ずかしいだけです。それは見るようなものです:

switch (x)
{
    case 1: 
        y = 1;
        break;
    case 2:
        y = 2;
        break;
    case 3:
        y = 3;
        break;
    // etc. for all possible values of x
}

上記は、ほとんどの場合、ほとんどの場合uber-n00bコードと見なされますが、論理的にはx == y ? true: falseまたはx ? true: false(とは対照的にx != 0)よりも冗長性が低くはありません。

于 2010-07-02T05:42:39.863 に答える
1

間違いなく冗長です。元の開発者が保持していた別のプログラミング言語/環境からの残りの練習である可能性があります。また、開発者が最初の行を読みやすくしているのを見ることができ、コードをざっと見たときにブール値が設定されていることがすぐにわかります。

于 2010-07-01T20:04:26.723 に答える
1

2番目の方法が最も理にかなっており、読みやすいと思います。

2番目の方法はもう少し賢いです。私が金曜日の午後にコードをかき回していて、私の脳が週末にすでになくなっていた場合、あなたが見つけているようなことをするのは私を過ぎてはいけません:-)

于 2010-07-01T20:06:09.980 に答える