代码结构,一个方法应该只做一件事

时间:2011-02-14 23:07:23

标签: c# structure

我有点跟随“方法应该只做一件事”

我有一个汽车文本文件,如果它甚至包含一个宝马,我想将isValid设置为true,但是当我正在浏览文本文件时,我认为我还会填充两个列表高端型号(M3,M5)等)和较低的模型(335,X3等)。

我知道该方法应该只做一件事,但它也可以填充列表。这就是我所拥有的:

private bool hasBMWegments()
{
   foreach (ClassLib.CarSegment carElement in CarSegmentFactory.ContainsCar("BMW"))
   {
     isValid = true;
     if (carElement.Class.IndexOfAny(lowerModels) == 0)
     {
        lstOlderSegment.Add(carElement.ElementNumber);
     }
     if (carElementClass.IndexOfAny(upperModels) == 0)
     {
        lstNewerSegment.Add(carElement.ElementNumber);
     }
   }
   return isValid;
 }

我应该创建一个再次执行foreach检查的方法吗?或者我应该在该方法中创建另一个方法(我认为这将是混乱的,并且与方法名称无关)

编辑:抱歉使用框架2.0

2 个答案:

答案 0 :(得分:2)

与此相比,我发现代码变得一团糟:

private IEnumerable<ClassLib.CarSegment>
    GetModels(IEnumerable<ClassLib.CarSegment> segments, string modelID)
{
    return segments.Where(x => x.Class.IndexOfAny(modelID) == 0);
}

// ...

var bmwSegments = CarSegmentFactory.ContainsCar("BMW").ToArray();

bool isValid = bmwSegments.Any();
var olderModelSegments = GetModels(bmwSegments, lowerModels);
var newerModelSegments = GetModels(bmwSegments, upperModels);

这段代码显然是正确的。其他代码会让你在循环中看两次以找出正在发生的事情。

答案 1 :(得分:1)

看起来你正在做的就是在第一次通过isValid时将foreach设置为true。所以isValid真的意味着“至少有一个元素吗?”。

在这种情况下,您不需要迭代两次。您可以使用Any()进行有效检查:

bool IsValid(IEnumerable<CarSegment> elements)
{
    return elements.Any();
}

void PopulateSegments(IEnumerable<CarSegment> elements)
{
    foreach(var element in elements)
    {
        //add to lists
    }
}