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

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

Тип Поддерживаются
языки
Важность Включена
по умолчанию
Время на
исправление (мин)
Теги
Дефект кода BSL
OS
Критичный Да 25 brainoverload

Параметры

Имя Тип Описание Значение
по умолчанию
complexityThreshold Целое Допустимая цикломатическая сложность метода 20
checkModuleBody Булево Проверять тело модуля true

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

Цикломатическая сложность программного кода является одной из наиболее старых метрик, впервые она была упомянута в 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

Источники

Сниппеты

Экранирование кода

// BSLLS:CyclomaticComplexity-off
// BSLLS:CyclomaticComplexity-on

Параметр конфигурационного файла

"CyclomaticComplexity": {
    "complexityThreshold": 20,
    "checkModuleBody": true
}