Анализ сложности PHP проекта

Начал я писать статью про то как мы распиливаем монолит. И возник вопрос, а как же показать читателям всю сложность и весь объем с которым мы столкнулись. Из книжки «Чистая архитектура» я знал что есть метрика оценивающая сложность поддержки кода.

И подумал что наверняка есть какие нибудь инструменты которые помогают проанализировать эту сложность. Порыскав в интернете, найдя и попробовав несколько инструментов, я получил то что мне нужно. Делюсь с вами моими находками

Каждый из этих инструментов показывает важную информацию. Но делают это по разному.

  • Comment lines of code — Показывает как много комментариев у вас используется. Я считаю что комментарии, при условии что они правильно написаны и актуальны, это отличная штука.
  • Average Class length — Средняя длинна класса. Нужно стремиться делать классы лаконичными и не большими, и не допускать разрастания методов внутри класса
  • Average Method Length — Аналогично предыдущему пункту. Методы должны быть небольшими и лаконичными
  • Cyclomatic Complexity — Это показатель того, на сколько ваш код связан, и на сколько сложно его будет поддерживать и изменять. Об этом очень хорошо написано в книге Чистая архитектура
  • Dependencies —  На сколько зависимы ваши классы друг от друга

PHP Insight

Github

PHP Insight — хороший статический анализатор, который даст вам множество советов по улучшению качества вашего кода.

phpinsights analyse ./src

PhpMetrics

Github

PhpMetrics — отличный инструмент для анализа сложности проекта.

phpmetrics --exclude=tests --composer=false  --report-html=../reports ./src

Phploc

Github

PhpLoc — очень хороший инструмент, позволяющий получить представление о размере проекта.

phploc src

Заключение

Для своей задачи я выбрал PhpMetrics. Только этот инструмент рисовал нужный мне график. Я написал скрипт который пробежался по истории репозитория и построил график для разных исторических моментов(После публикации статьи на хабре с данных графиком, выложу его сюда) Получилось очень наглядно показать как развивался и усложнялся проект.

Но другие два инструмента тоже отличные,  и я продолжу ими пользоваться. Возможно даже интегрирую в CI/CD что бы не давать больше усложнять проект 🙂

А какими инструментами пользуетесь вы?