Перейти к содержанию

BSL019 — Цикломатическая сложность

Кратко

Цикломатическая сложность

Идентификаторы

Поле Значение
Код правила BSL019
Совместимый псевдоним CyclomaticComplexity
Серьёзность WARNING
Включено по умолчанию Да
Реализовано Да
Теги brain-overload, complexity

Поведение

  • Публичный идентификатор BSL019 и псевдоним CyclomaticComplexity стабильны.
  • Правило сообщает о случаях, описанных на этой странице.
  • Подавления и проектная конфигурация применяются до публикации результата.
  • Для выполнения правила не требуется внешний анализатор или сетевой доступ.

Настройка и подавление

Код BSL### — основной стабильный идентификатор. Совместимый псевдоним принимается в select, ignore и совместимых блоковых комментариях.

[tool.onec-hbk-bsl]
select = ["BSL019"]
ignore = ["CyclomaticComplexity"]

Все три семейства подавлений работают для текущей строки и диапазона. Если открывающий комментарий стоит после кода, он действует только на эту строку. Используйте любой один вариант:

  • noqa:
Значение = "пример";  // noqa: BSL019
  • bsl-disable (совместимый вариант):
Значение = "пример";  // bsl-disable: BSL019
  • совместимый BSLLS-вариант:
Значение = "пример";  // BSLLS:CyclomaticComplexity-off

Если тот же открывающий комментарий стоит на отдельной строке, он начинает диапазон. Закройте его парным маркером того же семейства:

// noqa: BSL019
// код без этой диагностики
// noqa-enable: BSL019

// bsl-disable: BSL019
// код без этой диагностики
// bsl-enable: BSL019

// BSLLS:CyclomaticComplexity-off
// код без этой диагностики
// BSLLS:CyclomaticComplexity-on

Чтобы отключить правило до конца файла, не добавляйте закрывающий noqa-enable, bsl-enable или BSLLS:…-on.

Открывающий и закрывающий маркеры должны принадлежать одному семейству.

Описание диагностики

Цикломатическая сложность программного кода является одной из наиболее старых метрик, впервые она была упомянута в 1976 году Томасом МакКэбом. Цикломатическая сложность показывает минимальное число необходимых тестов. Наиболее эффективным способом снижения цикломатической сложности является декомпозиция кода, дробление методов на более простые, а также оптимизация логических выражений.

Цикломатическая сложность увеличивается на 1 за каждую конструкцию

  • Для ... По .. Цикл
  • Для каждого ... Из ... Цикл
  • Если ... Тогда
  • ИначеЕсли ... Тогда
  • Иначе
  • Попытка ... Исключение ... КонецПопытки
  • Перейти ~Метка
  • Бинарные операции И ... ИЛИ
  • Тернарный оператор
  • Процедура
  • Функция

Примеры

Функция СерверныйМодульМенеджера(Имя)                                                   // 1
    ОбъектНайден = Ложь;                                                                // 0
                                                                                        // 0
    ЧастиИмени = СтрРазделить(Имя, ".");                                                // 0
    Если ЧастиИмени.Количество() = 2 Тогда                                              // 1
                                                                                        // 0
        ИмяВида = ВРег(ЧастиИмени[0]);                                                  // 0
        ИмяОбъекта = ЧастиИмени[1];                                                     // 0
                                                                                        // 0
        Если ИмяВида = ВРег("Константы") Тогда                                          // 1
            Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда           // 1
                ОбъектНайден = Истина;                                                  // 0
            КонецЕсли;                                                                  // 0
        ИначеЕсли ИмяВида = ВРег("РегистрыСведений") Тогда                              // 1
            Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда    // 1
                ОбъектНайден = Истина;                                                  // 0
            КонецЕсли;                                                                  // 0
        Иначе                                                                           // 1
            ОбъектНайден = Ложь;                                                        // 0
        КонецЕсли;                                                                      // 0
    КонецЕсли;                                                                          // 0
                                                                                        // 0
    Если Не ОбъектНайден Тогда                                                          // 1
        ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(      // 0
            НСтр("ru = 'Объект метаданных ""%1"" не найден,                             // 0
                       |либо для него не поддерживается получение модуля менеджера.'"), // 0
            Имя);                                                                       // 0
    КонецЕсли;                                                                          // 0
    УстановитьБезопасныйРежим(Истина);                                                  // 0
    Модуль = Вычислить(Имя);                                                            // 0
    F = ?(Условие, ИСТИНА, НЕОПРЕДЕЛЕНО);                                               // 1
    А = ?(Условие, ИСТИНА, ?(Условие2, ЛОЖЬ, НЕОПРЕДЕЛЕНО));                            // 2
    M = ИСТИНА ИЛИ 7;                                                                   // 1
    Возврат Модуль;                                                                     // 0
КонецФункции                                                                            // итог 12

Источники