【问题标题】:How to resolve CA1502: Avoid excessive complexity?如何解决 CA1502:避免过于复杂?
【发布时间】:2014-01-20 10:16:51
【问题描述】:

根据代码分析结果,以下是警告信息,

CA1502 避免过度复杂 'METHOD()' 的圈复杂度为 27。重写或重构方法以将复杂度降低到 25。
业务服务 ReportService.cs 310

什么是圈复杂度以及如何解决?

【问题讨论】:

标签: c# visual-studio-2012 code-analysis cyclomatic-complexity


【解决方案1】:

来自Wikipedia

一段源代码的圈复杂度是通过源代码的线性独立路径的数量。例如,如果源代码不包含诸如 IF 语句或 FOR 循环之类的决策点,则复杂度将为 1,因为通过代码只有一条路径。如果代码有一个包含单个条件的 IF 语句,则将有两条路径通过代码:一条 IF 语句被评估为 TRUE 的路径,另一条 IF 语句被评估为 FALSE 的路径。

解决此问题的最简单方法是将方法分解为两个或多个更小的方法。 Visual Studio 的内置重构工具(例如Refactor -> Extract Method)可用于将选定的代码部分提取到另一个方法中。

【讨论】:

    【解决方案2】:

    CA1502 是一个二进制分析器。在某些情况下,您的代码并不是那么复杂或无法分解。以下是导致 CA1502 警告的示例:

    public class Mapping : Profile
    {
        [SuppressMessage("Microsoft.Maintainability", "CA1502"]
        public Mapping()
        {
            CreateMap<ItemInstance, ManifestRecords>()
                .ForMember(dest => dest.SomeProperty1, opt => opt.MapFrom(src => src.SomeProperty1))
                .ForMember(dest => dest.SomeProperty2, opt => opt.MapFrom(src => src.SomeProperty2))
                .ForMember(dest => dest.SomeProperty3, opt => opt.MapFrom(src => src.SomeProperty3))
                .ForMember(dest => dest.SomeProperty4, opt => opt.MapFrom(src => src.SomeProperty4))
                .ForMember(dest => dest.SomeProperty5, opt => opt.MapFrom(src => src.SomeProperty5))
                .ForMember(dest => dest.SomeProperty6, opt => opt.MapFrom(src => src.SomeProperty6))
                .ForMember(dest => dest.SomeProperty7, opt => opt.MapFrom(src => src.SomeProperty7))
                .ForMember(dest => dest.SomeProperty8, opt => opt.MapFrom(src => src.SomeProperty8))
                .ForMember(dest => dest.SomeProperty9, opt => opt.MapFrom(src => src.SomeProperty9))
                .ForMember(dest => dest.SomeProperty10, opt => opt.MapFrom(src => src.SomeProperty10))
                .ForMember(dest => dest.SomeProperty11, opt => opt.MapFrom(src => src.SomeProperty11))
                .ForMember(dest => dest.SomeProperty12, opt => opt.MapFrom(src => src.SomeProperty12))
                .ForMember(dest => dest.SomeProperty13, opt => opt.MapFrom(src => src.SomeProperty13))
                .ForMember(dest => dest.SomeProperty14, opt => opt.MapFrom(src => src.SomeProperty14))
                .ForMember(dest => dest.SomeProperty15, opt => opt.MapFrom(src => src.SomeProperty15))
                .ForMember(dest => dest.SomeProperty16, opt => opt.MapFrom(src => src.SomeProperty16));
        }
    }
    

    您可以看到我正在使用 AutoMapper,并且源代码中实际上并没有任何圈复杂度,尽管编译后的二进制表示中可能存在。

    您可以使用属性抑制警告:

    [SuppressMessage("Microsoft.Maintainability", "CA1502"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多