-2

すべて -- 古いコードのリファクタリングを行っており、GoTo ステートメントの使用を減らす (または完全に排除しない) 方法を検討しています。次のようなコードのセクションがあります。

public void GetData()
{
  TryAgain:
      Foo foo = bar.GetData();

      if(foo == null)
      {
          bar.addItem("Test");
          goto TryAgain;
      }

      //Use the bar object
}

それを次のように置き換えます。

public void GetData()
{
      Foo foo = bar.GetData();

      if(foo == null)
      {
          bar.addItem("Test");
          GetData();
          return;
      }

      //Use the bar object

}

これを処理するための考えやより良い方法はありますか?

アップデート

まず第一に、これは私の実際のコードではありません。簡潔にするためにこのスニペットを作成しました。次に、値が bar に追加されると、IF ステートメントがバイパスされ、コード セクションが続行され、bar オブジェクトが使用されると仮定してください。最初にバー オブジェクトが null でないことを確認し、そうでない場合はメソッド内の残りのコードを実行するメソッドを 1 つだけ作成したいと考えています。混乱させて申し訳ありません。

4

6 に答える 6

9

whileループを使用

public void GetData()
{
    Foo foo = bar.GetData();

    while (foo == null)
    {
        bar.addItem("Test");
        foo = bar.GetData();
    }
}

更新します。私があなたの本当の目的を正しく理解していれば:

public void GetData()
{
    Foo foo = bar.GetData();    
    if (foo == null)
    {
        bar.addItem("Test");
        // following the assumption
        // "once a value has been added to bar then the IF statement will be bypassed"
        // there is no need for another GetData call - bar object is in valid state now
    }

    //Use the bar object
}
于 2013-06-03T17:16:46.160 に答える
1
public void GetData()
{
  while(true)
 {
      Foo foo = bar.GetData();

      if(foo == null)
      {
          bar.addItem("Test");
      }
      else break;
 }
}
于 2013-06-03T17:17:24.633 に答える
1

foo オブジェクトを使用していないため、削除できます。

public void GetData()
{
    while (bar.GetData() == null)
        bar.addItem("Test");

    //Use the bar object
}
于 2013-06-03T19:24:41.040 に答える