Мы некоторое время искали инструменты проверки качества кода здесь, на SitePoint — совсем недавно в серии о Дженкинсе , но ни один из них не смог сделать то, о чем может рассказать проект, о котором я только недавно узнал.
PhpMetrics использует D3 и некоторые сложные алгоритмы анализа для сканирования кода вашего приложения и вывода сложных отчетов о нем.
Установка и использование 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:
и вот что мы получаем, анализируя Symfony:
Анализ
PhpMetrics предлагает множество метрик . Давайте демистифицируем эти круги и графики и узнаем, на что мы смотрим!
Цветовое кодирование
Что касается того, как читать руководство к отчету , мы можем сразу заметить, что Symfony немного тяжеловат на оранжево-красной стороне, а трава зеленее на стороне Laravel. Однако следует отметить одну важную вещь: сколько файлов Symfony содержит в отличие от Laravel — вы можете это ясно увидеть, сравнив плотность окружностей.
PhpMetrics был создан с учетом дальтоников, поэтому флажок «дальтоник» изменяет цвета в кругах с зеленого, желтого, оранжевого на полосы под разными углами:
Цветовое кодирование — это первый аспект, на который вы можете обратить внимание, и первое место, где можно найти подсказки о проблемах.
Цикломатический индекс сложности и ремонтопригодности
Круги, если их внимательно рассмотреть, представляют собой CC и MI, и, как говорится в документации, большие красные круги, вероятно, будет очень трудно поддерживать.
Оба легко доступны для Google, но позвольте мне избавить вас от просмотра вики и объяснить их с точки зрения непрофессионала.
Цикломатическая сложность, по сути, измеряет количество путей прохождения логики сценария. Чем больше путей можно выбрать, тем сложнее файл. Хороший способ избежать высокого уровня CC — убедиться, что ваш код является как можно более модульным и атомарным, что становится второй натурой, когда вы следуете принципам SOLID.
Как говорит Википедия, Индекс Обслуживаемости рассчитывается по определенным формулам из мер строки кода, мер Маккейба и показателей сложности Холстеда . Меры строк кода говорят сами за себя — буквально считая количество строк кода. Меры МакКейба, как бы это ни звучало как политическое обещание США, на самом деле являются еще одним названием Cyclomatic Complexity. Сложность Холстеда — это набор формул, которые пытаются посмотреть на синтаксис кода файла и определить такие атрибуты, как сложность, словарный запас кода, усилие и т. Д. Если вас интересуют конкретные формулы, ознакомьтесь со статьей в Википедии.
С учетом всего этого круги имеют размер и цветовую кодировку, что указывает на сумму всех стандартных метрик для сложности кода и удобства обслуживания.
таблицы
Если вы хотите увидеть все данные в более табличной форме, вы можете проверить вкладку «Исследовать» в файле отчета:
Эта таблица будет включать в себя все вышеперечисленное и многое другое — от строк кода до количества классов и многое другое — как для папки, так и для файла. Этот невероятно подробный отчет — это то, на что вам следует обращать внимание при поиске высокоточной информации о вашем коде в одном месте.
Пользовательская Диаграмма
Средняя область на обзорном экране отчета содержит пользовательскую диаграмму.
В приведенном выше примере мы сравниваем соотношение CC (упомянутое выше) и Lcom ( отсутствие сцепления в методах ) для каждого файла, но вы также легко переключаете значение оси X или Y для чего-то еще. Например, вот сравнение сложности на строки кода — вы можете заметить, что тенденция Laravel несколько пропорциональна — с большим количеством LoC предполагается большая сложность, в то время как Symfony имеет тенденцию быть повсюду с определенными файлами.
Например, файл Symfony BinaryNode.php
Response.php
Изучите файлы, которые дают любопытные результаты, и посмотрите, что вы можете узнать из этих идей.
Абстрактность / Нестабильность
Эта диаграмма очень хорошо объяснена здесь , но в двух словах, средняя диагональная линия называется линией баланса или Главной последовательностью . Цель состоит в том, чтобы ваши классы были как можно ближе к линии, потому что это означает, что они сбалансированы между тем, чтобы быть достаточно абстрактными и конкретными. Я призываю вас прочитать содержание по ссылке выше — это легко читается и должно прояснить ситуацию.
По какой-то причине я не смог заставить A / I правильно работать в моей локальной среде с Laravel и Symfony.
оценка
Оценка — это веб-диаграмма, которая берет среднее значение различных атрибутов всего вашего проекта, сравнивает эти числа со стандартами других проектов, которые инструмент изучил до сих пор, а затем накладывает ваши значения над ними. Это чисто косметическое и не имеет никакой реальной ценности, как говорится в заявлении об отказе от ответственности на странице оценки.
Несмотря на то, что инструмент считает, что обе платформы одинаково легко обслуживаемы, это не такой шокирующий вывод, что Laravel более дружественен к новым разработчикам и гораздо более упрощен в алгоритмах, не говоря уже о менее объемных.
Карта отношений
Карта отношений более полезна для небольших проектов — она позволяет видеть отношения между классами. Если класс расширяет или реализует другой, карта связей покажет его. Из-за большого количества классов в обоих этих проектах и их связях карта здесь менее чем полезна — на самом деле, она даже не загружается для Symfony для меня. Но если вы попробуете это на тестовом проекте с меньшим количеством классов, вы обязательно увидите преимущества.
перераспределение
Наконец, экран перераспределения суммирует все данные в формате, намного более простом, чем вкладка «Исследовать», перечисляя только некоторые итоги:
Symfony:
Laravel:
Результаты сравнения
Итак, что следует сделать из этих результатов? Не вдаваясь в подробности, мы можем легко сделать вывод, что:
- Laravel более дружественен к новым разработчикам, проще в алгоритмах и менее раздут по размеру файла.
- Laravel значительно более легкий. Symfony имеет по крайней мере в три раза больше, чем Laravel — методы, классы, файлы, строки кода … это в три раза больше.
- Symfony более сложный (средний столбец на экране Repartition)
- Laravel намного более стабилен по сложности для файлов — они имеют одинаковое соотношение сложности и строк кода, в то время как Symfony может сильно различаться.
- Symfony может использовать некоторую работу, чтобы сделать некоторые из более сложных файлов более атомарными — большие красные круги занимают круговую диаграмму.
Посмотрите, что еще вы можете узнать, поиграв с графиками и данными самостоятельно, а затем дайте нам знать!
Вывод
PhpMetrics — это еще одна длинная линейка анализаторов качества кода, но с изюминкой. Вместо того, чтобы смотреть на типичные проблемы стандартного кода, которые мы привыкли ожидать, он рассматривает целый набор новых атрибутов и объясняет ваш код в прекрасной математике, как только вы изучите его язык. Чтобы узнать, что означает каждый атрибут, обратитесь к таблице .
Будете ли вы использовать PhpMetrics для сканирования своих проектов? Вы бы установили его в свою IDE ? Это то, что вы могли бы видеть как постоянное дополнение к вашему процессу CI? Дайте нам знать ваши мысли в комментариях!