0

この質問は、C# だけでなく、短絡 AND 演算子を持つすべてのプログラミング言語に当てはまります。

質問は簡単です - 短絡評価を使用して、範囲外のインデックス例外を回避しています。たとえば、次のようになります。

if ((x > 0) && (bar[x] == foo))

また

if (((x > 0) && (x < bar.Length)) && (bar[x] == foo))

コーディングスタイルが悪い?次のようにループをネストできることはわかっています。

if (x > 0)
{
    if (bar[x] == foo)
    {
    }
}

しかし、非常に読みにくいと思います。

4

4 に答える 4

6

私はそれを言うだろう

if ((x > 0) && (bar[x] == foo))

悪いコーディングスタイルではありません。それもおそらく良いです。あなたが説明するようなネストされたif構造よりも間違いなくそれを好むでしょう。

余談ですが、使用する括弧の数を減らします。少なくともC#および他のほとんどのC派生言語では、これらはどちらも同じように正しいです。

if (x > 0 && bar[x] == foo)
if (x > 0 && x < bar.Length && bar[x] == foo)

言語を知っている読者(ある程度これを想定する必要があります)は、上記の短絡式を簡単に理解できます。ifこれらの読者は、正しい動作を得るのに必要なスペースよりもはるかに多くのスペースを必要とするため、ネストされたスタイルにおそらく反対するでしょう。

于 2012-07-18T01:21:05.337 に答える
1

私はそれをそれ自身の方法に移すことによってそれをもっときれいにすることができると主張するでしょう:

bool IsXBarValid(int x, Bar bar)
{
    return (x > 0) && (bar[x] == foo);
}

// .. then ..
if (IsXBarValid(x, bar))
{
    // etc..
}

明らかに、どのように実装しているかわからないので、メソッド名は少しわかりにくいですが、一般的に、これはこの種のコードをクリーンアップするための優れた方法です。

于 2012-07-18T01:22:32.887 に答える
1

「悪いコーディングスタイル」(この場合は少なくとも)は、それを定義するものです。どちらも完全に有効であり、それは好みの問題です。また、実際のif()ステートメントで実行する操作の数によっても異なります。のような比較がたくさんある場合

if ((foo == bar) && (foobar == something) && ((a==b) || (c==d)))

次のような方法でラップすると便利な場合があります。

if (AllMyConditionsAreMet(OnSomeObject))

何が起こっているのかをより簡単に読んだり理解したりするために。

于 2012-07-18T01:19:51.567 に答える
0

これまでのところ、simon-whitehead の回答が一番気に入っています。

別の方法が必要ない場合は、次のようにします。

  bool foobar = (x > 0) && (bar[x] == foo);
  if (foobar)
     // etc...

これらのスタイルは、元の投稿のどちらの提案よりもはるかに読みやすいと思います.

コードを読んでいる他の人 (移植者であろうとなかろうと) を助けます。

彼らは foobar を読み、これが詳細に調べる必要があるコードの一部なのか、それともスキミングできるのかを即座に判断できます。

一方、複雑な if ステートメントが表示され、内部に言語のトリッキーさが含まれている可能性がある場合:-)、速度が低下します。

于 2012-07-18T01:42:57.470 に答える