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,即打破循环并前进到下一个元素。所以,我无法分离那部分。

同样,在这里我受到限制,例如步骤仍在继续。意味着第一件事发生,然后是第二件事,然后是第三件事,然后是下一个……所以,我现在无法移动代码的位置。正因为如此,我的函数变得很大,大约 300 行,现在变得难以更改或维护。

请提供一个好的解决方案,通过改变编码continue方式来删除或其他方法。break

如果需要任何其他详细信息,请告诉我。

4

3 回答 3

2

只需将 if 块重构为具有适当名称的单独函数即可。
然后将所有ifs放在彼此内部而不是继续。

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

在循环开始时,设置一个布尔值 - 让我们将其称为escapefalse。现在将所有现有continue的 s替换escape为 true。这本身并不是真正的重构——它改变了现有代码的行为——但我们只是完成了一部分。现在选择循环体(现在没有continues),并将其提取为方法。在提取的方法中,将每个赋值替换escapereturn语句。消除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 回答