16

重複の可能性:
メソッドの最後に戻るのが良い方法であるのはなぜですか

メソッドでいくつかのRETURNステートメントを使用することをお勧めできるかどうか、およびその理由を知りたいと思います。そうでない場合は、別の方法でコードを書き直す方法を知りたいと思います。

public string GetNominativeById(int? candidateId)
        {
            if (candidateId.HasValue)
                return repepositoryCandidate.GetById(candidateId.Value).Nominative;
             else
                return string.Empty;
            }
        }

1回の返品で

 public string GetNominativeById(int? candidateId)
    {
        string result;
        if (candidateId.HasValue)
            result =  repepositoryCandidate.GetById(candidateId.Value).Nominative;
         else
            result =  string.Empty;

        return result;
        }
    }
4

11 に答える 11

28

あなたは実際には必要ありませんelse

string GetNominativeById(int? candidateId)
{
    if (!candidateId.HasValue)  
        return string.Empty;

    return repepositoryCandidate.GetById(candidateId.Value).Nominative;
}

このアンチアローパターンを考えてみましょう:

if (condition1)
{
    if (condition2)
    {
        if (condition3)
        {
            // code lines
        }
    }
}

すぐに戻る方法により、コードが読みやすくなります。

if (!condition1) return;
if (!condition2) return;
if (!condition3) return;

// code lines
于 2012-10-02T06:52:24.257 に答える
14

いいえ、メソッドに複数の出口点を含めることは、悪い習慣ではなく、良い習慣ではないと見なされます。出口が1つしかない場合は、コードに従う方が簡単です。

ただし、メソッドが例のように小さい場合は、とにかくコードに従うのは難しくないため、複数の出口点があることは実際には問題ではありません。コードが単純になる場合は、複数のreturnステートメントを非常にうまく使用できます。

于 2012-10-02T06:53:59.083 に答える
10

読みやすくするためにreturnステートメントを1つだけにするように努める必要がありますが、複数のreturnステートメントを含むいくつかのパターンがあります。一例はガード条項です。

ガード句の例:

  public Foo merge (Foo a, Foo b) {
    if (a == null) return b;
    if (b == null) return a;
    // complicated merge code goes here.
  }

一部のスタイルガイドでは、次のように1回のリターンでこれを記述します。

  public Foo merge (Foo a, Foo b) {
    Foo result;
    if (a != null) {
      if (b != null) {
        // complicated merge code goes here.
      } else {
        result = a;
      }
    } else {
      result = b;
    }
    return result;
  }

もう1つのケースは、それぞれのケースから戻りたい場合のswitchステートメントです。

switch(foo)
{
   case "A":
     return "Foo";
   case "B":
     return "Bar";
   default:
     throw new NotSupportedException();
}

私はあなたのコードを次のように書き直します:

        public string GetNominativeById(int? candidateId)
        {
            return candidateId.HasValue 
                ? repepositoryCandidate.GetById(candidateId.Value).Nominative;
                : string.Empty;
        }

一日の終わりに、あなた(および他の開発者)があなたのコードを何度も読んでいることを忘れないでください、それでそれが読みやすくて明白であることを確認してください。

于 2012-10-02T06:52:14.053 に答える
6

ウィキペディアの次の記事を見てください。あなたが求めているのは、構造化プログラミングのSESE(シングルエントリー、シングルエグジット)の原則に従うべきかどうかです。

于 2012-10-02T06:53:16.933 に答える
3

構造化プログラミングのルールの1つは、各メソッドに単一の入口と出口が必要であると述べています。単一の出口点(returnこの場合はステートメント)があるということは、CloseやDisposeの呼び出しなど、クリーンアップを1回だけ実行する必要があることを意味します。複数の出口点を持つことの影響は、小さなメソッドでは軽微ですが、メソッドの複雑さが増すにつれて、ケースを見逃しやすい場合や、リファクタリングまたは変更されたコードとして増加します。

于 2012-10-02T06:53:19.637 に答える
3

returnステートメントを増やすことには何の問題もありません。実際にコードを縮小し、Cuong Leが指摘したように、不要な変数の割り当てを保存するのに役立つ場合があります。:D

于 2012-10-02T07:00:53.480 に答える
2

メソッドの最後に追加することを習慣にするreturnので、アクティブなオブジェクトをすべて閉じる必要があります(ある場合

public string GetNominativeById(int? candidateId)
{
    string _returnValue = string.Empty;
    if (candidateId.HasValue)
        _returnValue repepositoryCandidate.GetById(candidateId.Value).Nominative;
     else
        _returnValue =  string.Empty;

    return _returnValue;
}

補足:ステートメントに複数のコードブロックがある場合があるため、三項演算子は実際にはこれに対する答えではありません(私は思います)。IF

于 2012-10-02T06:51:35.413 に答える
2

これはすべてに依存します

  • 他の開発者と一緒に使用するコーディング標準
  • および実際のコードの可読性(コードの個人的な認識)

一般的に、if/else多すぎる場合はreturn代わりに使用します。

したがって、使用する代わりに:

if(...)
{
    if(...)
    {
        if(...)
        {
        }
    }
    else if(...)
    {
    }
     ..
    else
    {
    }
}

を使用しますreturn

if(!...)
   return;

if(!...)
   return;
于 2012-10-02T06:53:18.657 に答える
1

実際には、1つのメソッドで複数のreturnステートメントを使用することはできません。コードで行ったこと、if elseステートメントを使用したため、とにかく1つだけが実行されます。あなたのコードは私には良さそうです。

于 2012-10-02T06:53:36.503 に答える
1

はい、必要な場合は、いくつかのreturnステートメントを使用してみませんか。性能に問題はありません。

このコードを書き直すには:

public string GetNominativeById(int? candidateId)
{
    if (candidateId.HasValue)
          return repepositoryCandidate.GetById(candidateId.Value).Nominative;

    return string.empty;
}

または「三項演算子」を使用します。

public string GetNominativeById(int? candidateId)
{
     return candidateId.HasValue ? repepositoryCandidate.GetById(candidateId.Value).Nominative : string.Empty;  
}
于 2012-10-02T06:54:50.567 に答える
0

なぜだめですか?しかし、他に必要はありません。

public string GetNominativeById(int? candidateId)
        {
            if (candidateId.HasValue)
                return repepositoryCandidate.GetById(candidateId.Value).Nominative;
            return string.Empty;
        }
于 2012-10-02T06:51:36.877 に答える