2

foreach非常に長いループをリファクタリングしようとしていました。私はcontinueそれにあるいくつかの場所で立ち往生しました。これが私の元のコードを模倣するためのダミーコードです

IEnumerable<dynamic> allData = FetchAllData();
IEnumerable<dynamic> relativeData = FetchAllRelativData();

foreach (var rdata in relativeData)
{
    IEnumerable<dynamic> dataTobeProcessed = allData.Where(c => c.Name = rdata.Name);

    //Do something

    //if then Continue

    // do something

    //if then continue

    // do something

    // do something

    // add data to db
}

ここでは、関数を分離するために何かを行う部分をすべて削除しました。しかし、ここでもコード部分がほとんどありませんcontinue。つまり、ループを壊して次の要素に進んでいます。それで、その部分を分離することができませんでした。

繰り返しになりますが、ここでは、ステップが継続しているような制約があります。つまり、最初に発生し、次に2番目に発生し、次に3番目に発生します...したがって、現時点ではコードの位置を移動できません。そのため、私の関数は大きくなり、約300行になり、変更や保守が難しくなっています。

コーディング方法を変更して、削除continueまたは別の方法でメソッドを作成するための適切なソリューションを提供してください。break

その他の詳細が必要な場合はお知らせください。

4

3 に答える 3

2

ifブロックを適切な名前の個別の関数にリファクタリングするだけです。
次に、続行するのではなく、すべてのifを相互に配置します。

if (!something) 
{
  DoFirstThing();
  if (!otherthing)
  {
     DoSechondThing();
  }
} 
//continue implicitly happens here anyway.
于 2013-03-24T05:29:36.040 に答える
2

ループの開始時に、ブール値を設定します。これをfalseと呼びましょうescape。次に、既存のすべてをtruecontinueの割り当てに置き換えます。escapeこれ自体は、真のリファクタリングではなく、既存のコードの動作を変更しますが、まだ途中でしか完了していません。次に、ループの本体(現在はcontinuesなし)を選択し、メソッドとして抽出します。抽出されたメソッドで、の各割り当てをステートメントに置き換えescapeますreturn。変数の元の作成を削除するescapeと、コードはさらにリファクタリングしやすい状態になります。

于 2013-03-25T00:47:48.060 に答える
0

DoSomething()呼び出しのif実装が引数と戻り値を共有するかどうかについては言及しません。共有する場合、代替オプションは、DoSomething()ロジックを含むFuncsのコレクションを作成することであり、多くのifステートメントの代わりに戻り値が中断する必要があることを示すまで、Func実装をループするだけです。

var somethingFuncs = new List<Func<x, bool>> 
{
  DoSomething,
  DoSomethingB,
  Blah....
};

foreach(var something in somethingFuncs)
{
  var result = something(arg);

  if (result)
  {
    break;
  } 
}
于 2017-01-31T20:38:05.640 に答える