Анализ сложности PHP проекта
Начал я писать статью про то как мы распиливаем монолит. И возник вопрос, а как же показать читателям всю сложность и весь объем с которым мы столкнулись. Из книжки «Чистая архитектура» я знал что есть метрика оценивающая сложность поддержки кода.
И подумал что наверняка есть какие нибудь инструменты которые помогают проанализировать эту сложность. Порыскав в интернете, найдя и попробовав несколько инструментов, я получил то что мне нужно. Делюсь с вами моими находками
Каждый из этих инструментов показывает важную информацию. Но делают это по разному.
- Comment lines of code — Показывает как много комментариев у вас используется. Я считаю что комментарии, при условии что они правильно написаны и актуальны, это отличная штука.
- Average Class length — Средняя длинна класса. Нужно стремиться делать классы лаконичными и не большими, и не допускать разрастания методов внутри класса
- Average Method Length — Аналогично предыдущему пункту. Методы должны быть небольшими и лаконичными
- Cyclomatic Complexity — Это показатель того, на сколько ваш код связан, и на сколько сложно его будет поддерживать и изменять. Об этом очень хорошо написано в книге Чистая архитектура
- Dependencies — На сколько зависимы ваши классы друг от друга
PHP Insight
PHP Insight — хороший статический анализатор, который даст вам множество советов по улучшению качества вашего кода.
phpinsights analyse ./src
PhpMetrics
PhpMetrics — отличный инструмент для анализа сложности проекта.
phpmetrics --exclude=tests --composer=false --report-html=../reports ./src
Phploc
PhpLoc — очень хороший инструмент, позволяющий получить представление о размере проекта.
phploc src
Заключение
Для своей задачи я выбрал PhpMetrics. Только этот инструмент рисовал нужный мне график. Я написал скрипт который пробежался по истории репозитория и построил график для разных исторических моментов(После публикации статьи на хабре с данных графиком, выложу его сюда) Получилось очень наглядно показать как развивался и усложнялся проект.
Но другие два инструмента тоже отличные, и я продолжу ими пользоваться. Возможно даже интегрирую в CI/CD что бы не давать больше усложнять проект 🙂
А какими инструментами пользуетесь вы?