Как разрешить CA1502: избежать чрезмерной сложности?

Согласно результатам анализа кода, следующее предупреждающее сообщение:

CA1502 Избегайте чрезмерной сложности 'METHOD()' имеет цикломатическую сложность 27. Перепишите или реорганизуйте метод, чтобы уменьшить сложность до 25.
BusinessServices ReportService.cs 310

Что такое цикломатическая сложность и как ее решить?


person Yajuvendra Vant    schedule 20.01.2014    source источник
comment
en.wikipedia.org/wiki/Cyclomatic_complexity   -  person ken2k    schedule 20.01.2014


Ответы (2)


Из Википедии:

Цикломатическая сложность раздела исходного кода — это количество линейно независимых путей прохождения исходного кода. Например, если исходный код не содержит точек принятия решений, таких как операторы IF или циклы FOR, сложность будет равна 1, поскольку в коде есть только один путь. Если бы в коде был один оператор IF, содержащий одно условие, в коде было бы два пути: один путь, где оператор IF оценивается как ИСТИНА, и один путь, где оператор IF оценивается как ЛОЖЬ.

Самый простой способ решить эту проблему — разбить метод на два или более меньших метода. Встроенные инструменты рефакторинга Visual Studio (такие как Refactor -> Extract Method) можно использовать для извлечения выбранной части кода в другой метод.

person BJ Myers    schedule 28.01.2014

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"]
person Ronnie Overby    schedule 21.08.2018