Skip to content

Когнитивная сложность

ID: cognitive_complexity | Степень критичности: Средняя (по умолчанию)

Этот детектор выявляет функции с высокой когнитивной сложностью. Когнитивная сложность измеряет, насколько трудно понять код, а не просто количество путей в нем.

Почему это «запах»

  • Высокая ментальная нагрузка: Глубокая вложенность и сложные логические выражения затрудняют понимание кода разработчиками.
  • Риски при обслуживании: Код, который трудно понять, более подвержен ошибкам при внесении изменений.
  • Скрытые баги: Логические ошибки часто прячутся в глубоко вложенных структурах.

Как она рассчитывается

Когнитивная сложность рассчитывается на основе:

  1. Структурные приращения: if, else, switch, for, while, do-while, catch, тернарные операторы и логические последовательности.
  2. Штраф за вложенность: Приращения для структур управления увеличиваются в зависимости от уровня их вложенности.
  3. Особые случаи: switch считается только один раз для всего блока, независимо от количества case.

Как исправить

  1. Упростите логику: Используйте guard clauses (ранние возвраты), чтобы уменьшить вложенность.
  2. Выделение метода: Перенесите вложенные блоки или сложные условия в небольшие, сфокусированные функции.
  3. Упростите выражения: Разбейте сложные логические условия на промежуточные переменные или функции.
  4. Замените вложенные If: Рассмотрите возможность использования таблицы поиска или паттерна «Стратегия».

Конфигурация

yaml
rules:
  cognitive_complexity:
    severity: medium
    max_complexity: 15

Правило ESLint

Этот детектор доступен, как правило, ESLint для получения обратной связи в реальном времени прямо в редакторе.

javascript
// eslint.config.js
export default [
  {
    rules: {
      '@archlinter/no-high-cognitive-complexity': 'warn',
    },
  },
];

Released under the MIT License.