You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化大量重复代码: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:23:42