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

Обзор правил

Qualimetrix содержит набор встроенных правил для проверки качества PHP-кода. Каждое правило анализирует определённый аспект кода -- сложность, размер, связанность, проектирование, поддерживаемость или распространённые плохие практики -- и сообщает о нарушениях при превышении пороговых значений.

Уровни серьёзности

Каждое нарушение имеет один из двух уровней серьёзности:

  • Warning (предупреждение) -- код становится сложнее в поддержке. Стоит задуматься о рефакторинге, но ситуация пока не критична.
  • Error (ошибка) -- код перешёл порог, за которым вероятны реальные проблемы: баги, трудности с тестированием или сопротивление изменениям. Требуется внимание.

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

Сводная таблица правил

Правила сложности

Эти правила измеряют, насколько запутан и ветвист ваш код. Сложный код труднее понять, протестировать и безопасно изменить.

Правило ID Что проверяет Warning Error
Цикломатическая сложность complexity.cyclomatic Количество путей принятия решений в методе 10 (метод) 20 (метод)
Когнитивная сложность complexity.cognitive Насколько трудно понять код 15 (метод) 30 (метод)
NPath-сложность complexity.npath Общее количество возможных путей выполнения 200 (метод) 1000 (метод)
WMC complexity.wmc Суммарная сложность всех методов класса 50 80

Подробнее о правилах сложности -->

Правила размера

Эти правила проверяют, не разрослись ли ваши классы и пространства имён. Большие классы, как правило, делают слишком много всего сразу.

Правило ID Что проверяет Warning Error
Количество методов size.method-count Число методов в классе 20 30
Количество классов size.class-count Число классов в пространстве имён 15 25
Количество свойств size.property-count Число свойств в классе 15 20

Подробнее о правилах размера -->

Правила проектирования

Эти правила проверяют связность класса, глубину наследования и структурные проблемы.

Правило ID Что проверяет Warning Error
LCOM design.lcom Занимается ли класс слишком многими несвязанными вещами 3 5
Глубина наследования design.inheritance Глубина цепочки наследования 4 6
NOC design.noc Количество классов, наследующих от данного 10 15
Покрытие типами design.type-coverage Процент типизированных параметров, возвратов, свойств 80% (ниже) 50% (ниже)
Data-класс design.data-class Высокая публичная поверхность при низкой сложности Warning --
God-класс design.god-class Чрезмерно сложные, большие классы с низкой связностью 3+ критерия все критерии

Подробнее о правилах проектирования -->

Правила связности (Cohesion)

Эти правила измеряют, насколько хорошо методы внутри класса работают вместе. Низкая связность указывает на то, что класс занимается слишком многими несвязанными вещами.

Метрика ID Что проверяет Рекомендация
TCC tcc Доля пар публичных методов, разделяющих свойства >= 0.5
LCC lcc Доля с учётом транзитивных связей >= 0.5

Note

TCC и LCC — это метрики, а не правила. Их нельзя включить или отключить через --disable-rule / --only-rule, и они не генерируют нарушений. В отчётах они отображаются как информационные значения и используются правилом God Class в качестве входных данных.

Подробнее о правилах связности -->

Правила связанности

Эти правила измеряют, насколько тесно ваши классы зависят друг от друга. Тесно связанный код хрупок -- изменение в одном месте может сломать многое в других.

Правило ID Что проверяет Warning Error
CBO coupling.cbo Общее количество зависимостей 14 20
Нестабильность coupling.instability Насколько класс зависит от других по сравнению с тем, сколько зависят от него 0.8 0.95
Расстояние coupling.distance Баланс между абстрактностью и стабильностью 0.3 0.5
ClassRank coupling.class-rank Критичные узловые классы через алгоритм PageRank 0.02 0.05

Подробнее о правилах связанности -->

Правила поддерживаемости

Правило ID Что проверяет Warning Error
Индекс поддерживаемости maintainability.index Общая оценка поддерживаемости кода <40 <20

Подробнее о правилах поддерживаемости -->

Правила архитектуры

Правило ID Что проверяет Warning Error
Циклические зависимости architecture.circular-dependency Классы, которые зависят друг от друга по кругу -- Error

Подробнее о правилах архитектуры -->

Правила дублирования

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

Правило ID Что обнаруживает Warning Error
Дублирование кода duplication.code-duplication Структурно идентичные блоки кода между файлами < 50 строк >= 50 строк

Подробнее о правилах дублирования -->

Правила запахов кода

Эти правила обнаруживают распространённые плохие практики, которые почти всегда нежелательны вне зависимости от контекста. Большинство по умолчанию выдают уровень Error.

Правило ID Что обнаруживает
Булевый аргумент code-smell.boolean-argument Параметры типа bool в сигнатурах методов
Count в цикле code-smell.count-in-loop Вызов count() в условии цикла
Отладочный код code-smell.debug-code var_dump, print_r, debug_backtrace и т.д.
Пустой catch code-smell.empty-catch Блоки catch без тела
Подавление ошибок code-smell.error-suppression Оператор подавления ошибок @
Eval code-smell.eval Использование eval()
Exit code-smell.exit Использование exit() или die()
Goto code-smell.goto Использование goto
Суперглобальные переменные code-smell.superglobals Прямой доступ к $_GET, $_POST и т.д.
Длинный список параметров code-smell.long-parameter-list Методы с чрезмерным количеством параметров
Недостижимый код code-smell.unreachable-code Код после return/throw/exit
Идентичные подвыражения code-smell.identical-subexpression Одинаковые операнды, дублирующиеся условия, идентичные ветки тернарного оператора
Избыточная инъекция в конструктор code-smell.constructor-overinjection Слишком много зависимостей в конструкторе
Неиспользуемый private code-smell.unused-private Неиспользуемые приватные методы, свойства, константы

Подробнее о правилах запахов кода -->

Правила безопасности

Эти правила обнаруживают паттерны, которые могут привести к уязвимостям безопасности.

Правило ID Что обнаруживает
Захардкоженные учётные данные security.hardcoded-credentials Пароли, API-ключи, токены в коде
SQL-инъекция security.sql-injection Суперглобальные переменные в SQL-запросах
XSS security.xss Несанитизированные суперглобальные в echo/print
Внедрение команд security.command-injection Суперглобальные переменные в shell-функциях
Чувствительные параметры security.sensitive-parameter Отсутствующий атрибут #[\SensitiveParameter]

Подробнее о правилах безопасности -->

Отключение правил

Можно отключить отдельные правила или целые группы:

# Отключить одно правило
bin/qmx check src/ --disable-rule=complexity.npath

# Отключить целую группу (сопоставление по префиксу)
bin/qmx check src/ --disable-rule=code-smell

Исключение неймспейсов

Любое правило поддерживает exclude_namespaces для подавления нарушений из конкретных пространств имён (сопоставление по префиксу). Файлы по-прежнему анализируются и метрики собираются, но нарушения не выводятся:

rules:
  complexity.cyclomatic:
    exclude_namespaces:
      - App\Tests
      - App\Legacy
bin/qmx check src/ --rule-opt="complexity.cyclomatic:exclude_namespaces=App\Tests"

Это полезно для тестового кода, сгенерированного кода или legacy-модулей, которые вы хотите сохранить в метриках, но исключить из отчёта о нарушениях для конкретного правила.

Настройка пороговых значений

Переопределение любого порога через командную строку:

bin/qmx check src/ --rule-opt="complexity.cyclomatic:method.warning=15"
bin/qmx check src/ --rule-opt="size.method-count:warning=25"

Или в конфигурационном файле qmx.yaml:

rules:
  complexity.cyclomatic:
    method:
      warning: 15
      error: 25
  size.method-count:
    warning: 25
    error: 40