Новый инструмент против «мусорного» кода
Роберт Мартин, известный как Uncle Bob, опубликовал на GitHub проект crap4java. Это независимый инструмент для анализа Java-проектов, основанный на метрике CRAP (Code Radically Anticipating Problems). Инициатива напрямую связана с его недавним заявлением о том, что он отказывается читать код, написанный ИИ-агентами, из-за его низкой читаемости и надежности.
Инструмент работает как самостоятельное приложение (standalone), не требуя сложной интеграции в CI/CD, хотя и использует данные JaCoCo. Его главная цель — автоматизировать поиск методов с высоким риском поддержки и багов, которые часто появляются при автоматической генерации кода.
Как работает формула CRAP
В основе утилиты лежит математическая модель, которая комбинирует цикломатическую сложность (CC) и покрытие кода тестами. Метрика рассчитывается по следующей формуле:
CRAP = CC^2 * (1 - coverage)^3 + CC
Где:
- CC — цикломатическая сложность метода.
- coverage — доля покрытия метода тестами (от 0 до 1), получаемая из отчетов JaCoCo.
Чем выше значение CRAP, тем «опаснее» метод. Значение выше 8.0 считается порогом, превышение которого приводит к коду ошибки 2, сигнализируя о необходимости рефакторинга.
Технические детали и интеграция
Утилита использует плагин JaCoCo версии 0.8.12 для сбора метрик. Процесс анализа включает несколько шагов:
- Удаление старых артефактов покрытия (файлы в
target/site/jacoco/иtarget/jacoco.exec). - Запуск тестов и генерации отчета через Maven.
- Парсинг файла
target/site/jacoco/jacoco.xml. - Анализ выбранных Java-файлов и вывод рейтинга.
Результаты сортируются по убыванию CRAP-оценки. Методы с отсутствующим покрытием (N/A) выводятся в конце списка.
Ключевые метрики и интерфейс
Инструмент предоставляет гибкий CLI для анализа всего проекта или только измененных файлов. Ниже приведена структура вывода и ключевые параметры:
| Параметр / Команда | Описание и поведение |
|---|---|
--help |
Вывод справки по использованию утилиты. |
| Без аргументов | Анализ всех Java-файлов в директории src/. |
--changed |
Анализ только тех файлов, которые были изменены (diff). |
<file ...> |
Анализ конкретных указанных файлов. |
| Порог ошибки | Код выхода 2, если CRAP > 8.0. Код 0 — успех. |
| Отсутствие покрытия | В отчете отображается как N/A и ставится в конец списка. |
Почему это важно для Java-разработчиков
С ростом использования AI-ассистентов (Copilot, Cursor и др.) в кодовую базу проникает код, который может быть синтаксически верным, но структурно сложным для поддержки. Метрика CRAP, предложенная еще самим Uncle Bob, позволяет количественно оценить этот риск.
Использование crap4java позволяет командам:
- Автоматически выявлять «горячие точки» кода, требующие рефакторинга.
- Контролировать качество кода, сгенерированного ИИ, до его попадания в основную ветку.
- Интегрировать проверку в процесс сборки (mvn test / package) без остановки разработки.
Проект доступен для сборки через mvn -DskipTests package и запуска через java -jar target/crap4java-0.1.0-SNAPSHOT.jar.
Источник: Github ↗
