Пороговые значения по умолчанию¶
На этой странице перечислены пороговые значения по умолчанию для каждого правила Qualimetrix. Когда метрика превышает порог warning, выдается предупреждение. Когда превышает порог error -- ошибка.
Правила сложности (Complexity)¶
Правила, которые измеряют, насколько сложно понять и протестировать код.
| Правило | ID | Уровень | Warning | Error | Область |
|---|---|---|---|---|---|
| Cyclomatic Complexity | complexity.cyclomatic |
Метод | 10 | 20 | Метод |
| Cyclomatic Complexity | complexity.cyclomatic |
Класс (макс.) | 30 | 50 | Класс |
| Cognitive Complexity | complexity.cognitive |
Метод | 15 | 30 | Метод |
| Cognitive Complexity | complexity.cognitive |
Класс (макс.) | 30 | 50 | Класс |
| NPath Complexity | complexity.npath |
Метод | 200 | 1000 | Метод |
| NPath Complexity | complexity.npath |
Класс (макс.) | 200 | 1000 | Класс (отключено) |
| WMC | complexity.wmc |
- | 50 | 80 | Класс |
Cyclomatic Complexity подсчитывает количество независимых путей выполнения в методе. Метод с CCN равным 10 имеет 10 различных путей для тестирования.
Cognitive Complexity измеряет, насколько сложно читать код. В отличие от цикломатической сложности, вложенные конструкции штрафуются сильнее.
NPath Complexity подсчитывает количество возможных путей выполнения. Растет гораздо быстрее, чем цикломатическая сложность для кода с большим количеством условий.
WMC (Weighted Methods per Class) -- сумма цикломатических сложностей всех методов класса. Высокий WMC означает, что класс делает слишком много.
Правила размера (Size)¶
Правила, которые проверяют, не стали ли классы и пространства имен слишком большими.
| Правило | ID | Warning | Error | Область |
|---|---|---|---|---|
| Method Count | size.method-count |
20 | 30 | Класс |
| Class Count | size.class-count |
15 | 25 | Пространство имен |
| Property Count | size.property-count |
15 | 20 | Класс |
Правила проектирования (Design)¶
Правила, которые проверяют дизайн классов и структуру наследования.
| Правило | ID | Warning | Error | Область |
|---|---|---|---|---|
| LCOM | design.lcom |
3 | 5 | Класс |
| NOC | design.noc |
10 | 15 | Класс |
| DIT | design.inheritance |
4 | 6 | Класс |
| Type Coverage (param) | design.type-coverage |
80 (ниже) | 50 (ниже) | Класс |
| Type Coverage (return) | design.type-coverage |
80 (ниже) | 50 (ниже) | Класс |
| Type Coverage (property) | design.type-coverage |
80 (ниже) | 50 (ниже) | Класс |
LCOM (Lack of Cohesion of Methods) измеряет, насколько хорошо методы в классе связаны друг с другом. Высокий LCOM говорит о том, что класс стоит разделить.
NOC (Number of Children) подсчитывает прямых наследников. Слишком много наследников означает, что родительский класс может быть слишком общим.
DIT (Depth of Inheritance Tree) подсчитывает количество уровней наследования. Глубокие иерархии сложнее понимать и поддерживать.
Type Coverage измеряет процент типизированных объявлений. В отличие от большинства правил, нарушения фиксируются, когда значения падают ниже порога.
Правила связанности (Coupling)¶
Правила, которые проверяют, насколько тесно классы и пространства имен связаны друг с другом.
| Правило | ID | Warning | Error | Область |
|---|---|---|---|---|
| CBO | coupling.cbo |
14 | 20 | Класс |
| CBO | coupling.cbo |
14 | 20 | Пространство имен |
| Instability | coupling.instability |
0.8 | 0.95 | Класс |
| Instability | coupling.instability |
0.8 | 0.95 | Пространство имен |
| Distance | coupling.distance |
0.3 | 0.5 | Пространство имен |
| ClassRank | coupling.class-rank |
0.02 | 0.05 | Класс |
CBO (Coupling Between Objects) подсчитывает количество других классов, от которых зависит данный класс. Высокая связанность затрудняет внесение изменений.
Instability -- коэффициент от 0 (полностью стабильный) до 1 (полностью нестабильный). Класс, который зависит от многих других, но от которого никто не зависит -- нестабилен. По умолчанию min_afferent: 1 -- классы и пространства имён без зависимых (Ca=0) пропускаются, так как имеют I=1.0 по определению. Установите 2, чтобы также пропускать символы с единственным зависимым.
Distance from the Main Sequence измеряет, насколько хорошо пространство имен балансирует между абстрактностью и стабильностью. Значение, близкое к 0 -- идеально.
ClassRank использует алгоритм PageRank на графе зависимостей для определения наиболее "важных" классов. Высокий ClassRank означает, что класс является критическим узлом с широким влиянием на систему. Пороги автоматически адаптируются к размеру проекта через sqrt-масштабирование (калибровано для 100 классов).
Правила сопровождаемости (Maintainability)¶
Эти правила работают наоборот: нарушение фиксируется, когда метрика падает ниже порога, а не превышает его.
| Правило | ID | Warning (ниже) | Error (ниже) | Область |
|---|---|---|---|---|
| Maintainability Index | maintainability.index |
40 | 20 | Метод |
Maintainability Index объединяет сложность, количество строк кода и метрики Холстеда в единую оценку от 0 до 100. Чем выше -- тем лучше. Оценка ниже 20 означает, что код очень сложно поддерживать.
Правила запахов кода (Code Smell)¶
Эти правила обнаруживают конкретные паттерны, которые обычно являются плохой практикой. У большинства нет числовых порогов -- они либо находят паттерн, либо нет. Два правила (Long Parameter List и Unreachable Code) используют числовые пороги.
| Правило | ID | Warning | Error | Статус |
|---|---|---|---|---|
| Constructor Over-injection | code-smell.constructor-overinjection |
8 params | 12 params | включено |
| Data Class | design.data-class |
WOC ≥ 80%, WMC ≤ 10 | — | включено |
| God Class | design.god-class |
WMC ≥ 47, TCC < 0.33, LCOM ≥ 3, LOC ≥ 300 (3 of 4) | — | включено |
| Boolean Argument | code-smell.boolean-argument |
— | — | включено (allowed_prefixes: is, has, can, should, will, did, was) |
| count() in Loop | code-smell.count-in-loop |
— | — | включено |
| Debug Code | code-smell.debug-code |
— | всегда | включено |
| Empty Catch | code-smell.empty-catch |
— | всегда | включено |
| Error Suppression | code-smell.error-suppression |
всегда | — | включено (allowed_functions: []) |
| eval() | code-smell.eval |
— | всегда | включено |
| exit()/die() | code-smell.exit |
всегда | — | включено |
| goto | code-smell.goto |
— | всегда | включено |
| Superglobals | code-smell.superglobals |
всегда | — | включено |
| Long Parameter List | code-smell.long-parameter-list |
4 params (VO: 8) | 6 params (VO: 12) | включено |
| Unreachable Code | code-smell.unreachable-code |
1 | 2 | включено |
| Unused Private | code-smell.unused-private |
всегда | — | включено |
| Identical Sub-expression | code-smell.identical-subexpression |
всегда | — | включено |
Правила дупликации (Duplication)¶
Правила, которые обнаруживают дублированный код.
| Правило | ID | Warning | Error | Область |
|---|---|---|---|---|
| Code Duplication | duplication.code-duplication |
<50 строк | >=50 строк | Метод |
Code Duplication обнаруживает дублированные блоки кода. Настраивается через min_lines: 5 и min_tokens: 70 -- блоки, не достигающие этих порогов, игнорируются. Дубликаты менее 50 строк выдают предупреждение; 50 строк и более -- ошибку.
Правила безопасности (Security)¶
Правила, которые обнаруживают потенциальные уязвимости безопасности.
| Правило | ID | Серьезность | По умолчанию |
|---|---|---|---|
| Hardcoded Credentials | security.hardcoded-credentials |
Error | включено |
| SQL Injection | security.sql-injection |
Error | включено |
| XSS | security.xss |
Error | включено |
| Command Injection | security.command-injection |
Error | включено |
| Sensitive Parameter | security.sensitive-parameter |
Warning | включено |
Hardcoded Credentials обнаруживает пароли, API-ключи и токены, захардкоженные непосредственно в исходном коде.
SQL Injection обнаруживает использование суперглобальных переменных при построении SQL-запросов без параметризации.
XSS обнаруживает вывод суперглобальных переменных без экранирования (htmlspecialchars и т.д.).
Command Injection обнаруживает использование суперглобальных переменных в функциях выполнения команд без санитизации.
Sensitive Parameter обнаруживает параметры с чувствительными именами без атрибута #[\SensitiveParameter].
Как настроить пороговые значения¶
Сокращённая запись threshold¶
Если вам нужен единый порог без разделения на warning и error (все нарушения — ошибки), используйте threshold:
rules:
complexity.cyclomatic:
method:
threshold: 15 # warning=15 и error=15
size.method-count:
threshold: 25
Это полезно в CI, где нужен бинарный результат "прошёл/не прошёл". Нельзя смешивать threshold с явными ключами warning/error в одном правиле.
С помощью YAML-файла конфигурации¶
Создайте файл qmx.yaml в корне вашего проекта:
rules:
complexity.cyclomatic:
method:
warning: 15
error: 30
class:
max_warning: 40
max_error: 60
size.method-count:
warning: 25
error: 40
coupling.cbo:
warning: 18
error: 25
maintainability.index:
warning: 30
error: 15
Затем запустите анализ с указанием файла конфигурации:
Отключение правил¶
Чтобы полностью отключить правило, установите enabled: false:
Отключение группы правил¶
Вы можете отключить все правила в группе через CLI:
Это отключит все правила, ID которых начинается с code-smell..
Через командную строку¶
Переопределяйте настройки из командной строки:
Подавление отдельных нарушений¶
Добавьте @qmx-ignore в docblock, чтобы подавить конкретное нарушение:
Можно также подавить все правила в группе: