Статьи

Визуализируйте качество вашего кода с PhpMetrics

Мы некоторое время искали инструменты проверки качества кода здесь, на SitePoint — совсем недавно в серии о Дженкинсе , но ни один из них не смог сделать то, о чем может рассказать проект, о котором я только недавно узнал.

PhpMetrics использует D3 и некоторые сложные алгоритмы анализа для сканирования кода вашего приложения и вывода сложных отчетов о нем.

phpmetrics-maintenability

Установка и использование PhpMetrics

Немного сложно об этом говорить, не видя надлежащего примера, поэтому давайте установим и запустим его, а затем объясним каждую часть.

Окружающая обстановка

Чтобы проверить это, нам понадобится изолированная среда. Как обычно, мы будем использовать нашу надежную коробку Homestead Improved Vagrant, чтобы у всех читателей была одинаковая среда для тестирования.

Установка PhpMetrics

Как и в любом современном PHP-проекте, установка очень проста. Мы установим его глобально, сделав его доступным для всех проектов на компьютере.

sudo composer global require 'halleck45/phpmetrics'

Получение кода

Мы протестируем PhpMetrics на двух проектах с большим количеством кода: Laravel и Symfony, в рамках, а не в форме проекта. Это означает, что мы будем использовать не команду create-project от Composer, а чистый источник каждой среды.

 git clone https://github.com/symfony/symfony symframe
git clone https://github.com/laravel/framework lframe

Мы делаем это, чтобы избежать всякого тестирования зависимостей и держаться подальше от кода, не относящегося к фреймворку.

Использование PhpMetrics в проекте с интенсивным использованием кода

Теперь, когда у нас есть загруженные проекты, давайте запустим на них PhpMetrics.

 mkdir Laravel
mkdir Laravel/public
phpmetrics --report-html=/Laravel/public/report_symfony.html symframe
phpmetrics --report-html=/Laravel/public/report_laravel.html lframe

Не берите в голову тот факт, что мы используем папки «Laravel» здесь для отчетов, это просто значения по умолчанию Homestead, и мы можем просто повторно использовать их для нашего небольшого примера, чтобы сократить этапы настройки. Это позволяет нам легко получать доступ к отчетам по следующим URL-адресам:

 homestead.app:8000/report_symfony.html
homestead.app:8000/report_laravel.html

Вот что нам сообщает отчет Laravel:

01

и вот что мы получаем, анализируя Symfony:

02

Анализ

PhpMetrics предлагает множество метрик . Давайте демистифицируем эти круги и графики и узнаем, на что мы смотрим!

Цветовое кодирование

Что касается того, как читать руководство к отчету , мы можем сразу заметить, что Symfony немного тяжеловат на оранжево-красной стороне, а трава зеленее на стороне Laravel. Однако следует отметить одну важную вещь: сколько файлов Symfony содержит в отличие от Laravel — вы можете это ясно увидеть, сравнив плотность окружностей.

PhpMetrics был создан с учетом дальтоников, поэтому флажок «дальтоник» изменяет цвета в кругах с зеленого, желтого, оранжевого на полосы под разными углами:

03

Цветовое кодирование — это первый аспект, на который вы можете обратить внимание, и первое место, где можно найти подсказки о проблемах.

Цикломатический индекс сложности и ремонтопригодности

Круги, если их внимательно рассмотреть, представляют собой CC и MI, и, как говорится в документации, большие красные круги, вероятно, будет очень трудно поддерживать.

Оба легко доступны для Google, но позвольте мне избавить вас от просмотра вики и объяснить их с точки зрения непрофессионала.

Цикломатическая сложность, по сути, измеряет количество путей прохождения логики сценария. Чем больше путей можно выбрать, тем сложнее файл. Хороший способ избежать высокого уровня CC — убедиться, что ваш код является как можно более модульным и атомарным, что становится второй натурой, когда вы следуете принципам SOLID.

Как говорит Википедия, Индекс Обслуживаемости рассчитывается по определенным формулам из мер строки кода, мер Маккейба и показателей сложности Холстеда . Меры строк кода говорят сами за себя — буквально считая количество строк кода. Меры МакКейба, как бы это ни звучало как политическое обещание США, на самом деле являются еще одним названием Cyclomatic Complexity. Сложность Холстеда — это набор формул, которые пытаются посмотреть на синтаксис кода файла и определить такие атрибуты, как сложность, словарный запас кода, усилие и т. Д. Если вас интересуют конкретные формулы, ознакомьтесь со статьей в Википедии.

С учетом всего этого круги имеют размер и цветовую кодировку, что указывает на сумму всех стандартных метрик для сложности кода и удобства обслуживания.

таблицы

Если вы хотите увидеть все данные в более табличной форме, вы можете проверить вкладку «Исследовать» в файле отчета:

05

Эта таблица будет включать в себя все вышеперечисленное и многое другое — от строк кода до количества классов и многое другое — как для папки, так и для файла. Этот невероятно подробный отчет — это то, на что вам следует обращать внимание при поиске высокоточной информации о вашем коде в одном месте.

Пользовательская Диаграмма

Средняя область на обзорном экране отчета содержит пользовательскую диаграмму.

06

В приведенном выше примере мы сравниваем соотношение CC (упомянутое выше) и Lcom ( отсутствие сцепления в методах ) для каждого файла, но вы также легко переключаете значение оси X или Y для чего-то еще. Например, вот сравнение сложности на строки кода — вы можете заметить, что тенденция Laravel несколько пропорциональна — с большим количеством LoC предполагается большая сложность, в то время как Symfony имеет тенденцию быть повсюду с определенными файлами.

07

Например, файл Symfony BinaryNode.phpResponse.php Изучите файлы, которые дают любопытные результаты, и посмотрите, что вы можете узнать из этих идей.

Абстрактность / Нестабильность

Эта диаграмма очень хорошо объяснена здесь , но в двух словах, средняя диагональная линия называется линией баланса или Главной последовательностью . Цель состоит в том, чтобы ваши классы были как можно ближе к линии, потому что это означает, что они сбалансированы между тем, чтобы быть достаточно абстрактными и конкретными. Я призываю вас прочитать содержание по ссылке выше — это легко читается и должно прояснить ситуацию.

По какой-то причине я не смог заставить A / I правильно работать в моей локальной среде с Laravel и Symfony.

оценка

Оценка — это веб-диаграмма, которая берет среднее значение различных атрибутов всего вашего проекта, сравнивает эти числа со стандартами других проектов, которые инструмент изучил до сих пор, а затем накладывает ваши значения над ними. Это чисто косметическое и не имеет никакой реальной ценности, как говорится в заявлении об отказе от ответственности на странице оценки.

08

09

Несмотря на то, что инструмент считает, что обе платформы одинаково легко обслуживаемы, это не такой шокирующий вывод, что Laravel более дружественен к новым разработчикам и гораздо более упрощен в алгоритмах, не говоря уже о менее объемных.

Карта отношений

Карта отношений более полезна для небольших проектов — она ​​позволяет видеть отношения между классами. Если класс расширяет или реализует другой, карта связей покажет его. Из-за большого количества классов в обоих этих проектах и ​​их связях карта здесь менее чем полезна — на самом деле, она даже не загружается для Symfony для меня. Но если вы попробуете это на тестовом проекте с меньшим количеством классов, вы обязательно увидите преимущества.

перераспределение

Наконец, экран перераспределения суммирует все данные в формате, намного более простом, чем вкладка «Исследовать», перечисляя только некоторые итоги:

Symfony:

10

Laravel:

11

Результаты сравнения

Итак, что следует сделать из этих результатов? Не вдаваясь в подробности, мы можем легко сделать вывод, что:

  1. Laravel более дружественен к новым разработчикам, проще в алгоритмах и менее раздут по размеру файла.
  2. Laravel значительно более легкий. Symfony имеет по крайней мере в три раза больше, чем Laravel — методы, классы, файлы, строки кода … это в три раза больше.
  3. Symfony более сложный (средний столбец на экране Repartition)
  4. Laravel намного более стабилен по сложности для файлов — они имеют одинаковое соотношение сложности и строк кода, в то время как Symfony может сильно различаться.
  5. Symfony может использовать некоторую работу, чтобы сделать некоторые из более сложных файлов более атомарными — большие красные круги занимают круговую диаграмму.

Посмотрите, что еще вы можете узнать, поиграв с графиками и данными самостоятельно, а затем дайте нам знать!

Вывод

PhpMetrics — это еще одна длинная линейка анализаторов качества кода, но с изюминкой. Вместо того, чтобы смотреть на типичные проблемы стандартного кода, которые мы привыкли ожидать, он рассматривает целый набор новых атрибутов и объясняет ваш код в прекрасной математике, как только вы изучите его язык. Чтобы узнать, что означает каждый атрибут, обратитесь к таблице .

Будете ли вы использовать PhpMetrics для сканирования своих проектов? Вы бы установили его в свою IDE ? Это то, что вы могли бы видеть как постоянное дополнение к вашему процессу CI? Дайте нам знать ваши мысли в комментариях!