本文共 1491 字,大约阅读时间需要 4 分钟。
重构多重循环的一个实例
黄国强 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); } bool func3(returnValue.Add,kvp, leftPoint, rightPoint) { 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; } 重构是门非常重要的技术,对于不会设计的初学者,重构是个不错的起点。转载地址:http://imefb.baihongyu.com/