如何进一步降低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
相关产品推荐
相关产品推荐

