如何简化大量重复代码:C#中GetInfo方法的重构优化问询
最优简化方案分析与实现
首先,你的代码核心重复点在于针对每个测试ID,重复执行三次几乎相同的查询逻辑,只是TestItemName参数不同。同时后续还有更多分支要处理,所以我们可以通过提取通用方法+简化分支逻辑来彻底解决重复问题,同时提升代码的可维护性。
步骤1:提取通用查询逻辑到辅助方法
把查询单个状态(Pass/Fail/N/A)并拼接字符串的逻辑抽成一个独立方法,这样可以避免重复写Where、Select、FirstOrDefault的代码,还能统一处理空值情况(避免原代码中FirstOrDefault返回null导致的空引用异常)。
// 提取的辅助方法,负责获取单个状态的拼接信息 private string GetChoiceInfo(TestNames testNames, int testNameId, string itemName) { var record = testNames.TestItems .FirstOrDefault(ex => ex.TestNamesId == testNameId && ex.TestItemName == itemName); // 处理record为null的情况,避免空引用 return record == null ? string.Empty : $"{record.TestItemId},{record.TestItemName},{record.TestItemDirectory}"; }
步骤2:简化GetInfo方法的分支逻辑
原来的switch中,大部分分支(比如case3)都是执行相同的三个查询操作,只有少数分支可能有特殊逻辑。我们可以把通用逻辑抽离出来,只在特殊分支中单独处理:
public Foo GetInfo(TestNames testNames) { int testNameId = testNames.TestId; Foo foo = new Foo(); // 先处理通用逻辑:大部分测试ID都需要获取这三个状态的信息 // 如果某个测试ID不需要,可以在switch中覆盖或者跳过 foo.PassChoiseInfo = GetChoiceInfo(testNames, testNameId, "Pass"); foo.FailChoiceInfo = GetChoiceInfo(testNames, testNameId, "Fail"); foo.NAChoiceInfo = GetChoiceInfo(testNames, testNameId, "N/A"); switch (testNameId) { case 4: // 这里写case4的特殊逻辑,比如覆盖某个属性,或者做额外处理 // 例:foo.PassChoiseInfo = "自定义内容"; break; case 5: // case5的特殊逻辑 break; case 7: // case7的特殊逻辑 break; // 其他有特殊需求的case写在这里 default: // 默认情况:使用通用逻辑的结果,不需要额外操作 break; } return foo; }
额外优化点:如果所有分支逻辑一致
如果后续新增的所有测试ID分支,都是和case3一样的逻辑(不需要特殊处理),那甚至可以完全去掉switch,直接调用三次辅助方法即可:
public Foo GetInfo(TestNames testNames) { int testNameId = testNames.TestId; return new Foo { PassChoiseInfo = GetChoiceInfo(testNames, testNameId, "Pass"), FailChoiceInfo = GetChoiceInfo(testNames, testNameId, "Fail"), NAChoiceInfo = GetChoiceInfo(testNames, testNameId, "N/A") }; }
为什么这是最优方案?
- 减少代码重复:把重复的查询逻辑集中到一个方法中,后续修改查询规则(比如新增字段、修改筛选条件)只需要改这一个地方。
- 提升可维护性:新增测试ID分支时,如果没有特殊逻辑,不需要做任何修改;有特殊逻辑时只需要在switch中添加对应的处理。
- 增强健壮性:统一处理了
FirstOrDefault返回null的情况,避免空引用异常。 - 代码更简洁:原来的case3的10+行代码,现在简化成3行调用,可读性大幅提升。
内容的提问来源于stack exchange,提问作者Izzy
相关产品推荐
相关产品推荐

