重构多重循环的一个实例
黄国强 2011-12-31
一位同事提供了以下这段C#示例代码。
List<MaterialInfo> returnValue = new List<MaterialInfo>();
for (int i = 0; i < totalPoints.Count - 1; i++)
{
CoordsDouble leftPoint = totalPoints[i];
CoordsDouble rightPoint = totalPoints[i + 1];
Boolean hasFound = false;
foreach (KeyValuePair<ModelInfo2D, IList<CoordsDouble>> kvp in modelPointDictionary)
{
for (int j = 0; j < kvp.Value.Count - 1; j += 2)
{
if (kvp.Value[j] == leftPoint && kvp.Value[j + 1] == rightPoint)
{
returnValue.Add(kvp.Key.Material);
hasFound = true;
break;
}
}
if (hasFound)
{
break;
}
}
if (!hasFound)
{
returnValue.Add(mGrating.IncidenceMaterial);
}
}
return returnValue;
以下是我重构后的代码示例,通过将原先循环内的代码移到新的函数中,提高了代码的可读性。
List<MaterialInfo> func1()
{
List<MaterialInfo> returnValue = new List<MaterialInfo>();
for (int i = 0; i < totalPoints.Count - 1; i++)
{
CoordsDouble leftPoint = totalPoints[i];
CoordsDouble rightPoint = totalPoints[i + 1];
func2(returnValue, leftPoint, rightPoint);
}
return returnValue;
}
void func2(returnValue, leftPoint, rightPoint))
{
foreach (KeyValuePair<ModelInfo2D, IList<CoordsDouble>> kvp in modelPointDictionary)
{
if(func3(kvp,leftPoint,rightPoint))
return ;
}
returnValue.Add(mGrating.IncidenceMaterial);
}
{
for (int j = 0; j < kvp.Value.Count - 1; j += 2)
{
if (kvp.Value[j] == leftPoint && kvp.Value[j + 1] == rightPoint)
{
returnValue.Add(kvp.Key.Material);
return true;
}
}
return false;
}
重构是门非常重要的技术,对于不会设计的初学者,重构是个不错的起点。