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

如何进一步降低C#代码的认知复杂度?已用switch从24降至16

C#代码认知复杂度优化技巧(从16降至更低)

你的核心问题是代码中存在大量重复分支逻辑,导致认知复杂度居高不下。以下是具体优化方案和技巧:

优化后代码示例(字典策略模式)

protected override bool Compare(object valueToValidate, object valueToCompare)
{
    if (RaUtils.IsBlankValue(valueToValidate) || RaUtils.IsBlankValue(valueToCompare))
    {
        return true;
    }

    var typeCode = Type.GetTypeCode(valueToCompare.GetType());
    return _comparisonStrategies.TryGetValue(typeCode, out var compareFunc)
        ? compareFunc(valueToValidate.ToString(), valueToCompare.ToString())
        : throw new NotImplementedException();
}

// 静态初始化类型比较策略,与核心逻辑分离
private static readonly Dictionary<TypeCode, Func<string, string, bool>> _comparisonStrategies = new()
{
    { TypeCode.DateTime, (val1, val2) => 
        DateTime.TryParse(val1, out var dt1) && DateTime.TryParse(val2, out var dt2) && dt1 >= dt2 },
    { TypeCode.Double, (val1, val2) => 
        double.TryParse(val1, out var d1) && double.TryParse(val2, out var d2) && d1 >= d2 },
    { TypeCode.Decimal, (val1, val2) => 
        decimal.TryParse(val1, out var dec1) && decimal.TryParse(val2, out var dec2) && dec1 >= dec2 },
    { TypeCode.Int32, (val1, val2) => 
        int.TryParse(val1, out var i1) && int.TryParse(val2, out var i2) && i1 >= i2 },
    { TypeCode.Int64, (val1, val2) => 
        long.TryParse(val1, out var l1) && long.TryParse(val2, out var l2) && l1 >= l2 }
};

关键优化技巧

  • 消除重复分支:将每个类型对应的解析、比较逻辑封装为lambda表达式,存入字典。用字典查找替代switch分支,彻底消除重复的if嵌套和break语句,认知复杂度可直接降至5以内。
  • 扁平化逻辑结构:用三元运算符替代原有的分支嵌套,将"查找策略-执行策略"的逻辑合并为一行判断,减少代码层级。
  • 遵循开闭原则:后续新增类型时,只需在字典中添加新的条目,无需修改核心的Compare方法,降低维护成本。
  • 可选:直接类型转换优化:如果valueToValidate实际是对应值类型而非字符串,可跳过ToString解析步骤,直接通过类型判断转换,进一步提升性能并简化逻辑:
    private static readonly Dictionary<TypeCode, Func<object, object, bool>> _directComparisonStrategies = new()
    {
        { TypeCode.DateTime, (val1, val2) => val1 is DateTime dt1 && val2 is DateTime dt2 && dt1 >= dt2 },
        { TypeCode.Double, (val1, val2) => val1 is double d1 && val2 is double d2 && d1 >= d2 },
        { TypeCode.Decimal, (val1, val2) => val1 is decimal dec1 && val2 is decimal dec2 && dec1 >= dec2 },
        { TypeCode.Int32, (val1, val2) => val1 is int i1 && val2 is int i2 && i1 >= i2 },
        { TypeCode.Int64, (val1, val2) => val1 is long l1 && val2 is long l2 && l1 >= l2 }
    };
    

内容的提问来源于stack exchange,提问作者GGotchaA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:56:45