PHP: PHP metrics. Инструмент оценки сложности и maintainability кода. Часть 1 | Глазами фрилансера - HD

PHP: PHP metrics. Инструмент оценки сложности и maintainability кода. Часть 1 | Глазами фрилансера -
00:49:32
Обнаружено блокирование рекламы на сайте

Для существования нашего сайта необходим показ рекламы. Просим отнестись с пониманием и добавить сайт в список исключений вашей программы для блокировки рекламы (AdBlock и другие).

12n.ru 18463 ролика

PHP metrics. Инструмент оценки сложности и maintainability кода. Часть 1 | Глазами фрилансера -.

Есть ли объективный способ оценить чистоту кода, его сложность и способность к развитию (maintainability)? Есть. Его предоставляет нам, в частности, пакет PHP metrics, использующий набор математически и статистически обоснованных методов такой оценки.
Давайте посмотрим, как такой анализ выглядит и как читать отчёты PHP metrics.

Содержание ролика «Анализируй это! PHP metrics. Часть 1»:
00:00 Наихудший и наилучший методы анализа кода. Статические анализаторы.
05:40 Возможен ли анализ сложности и способности к развитию кода. Открываем отчёт PhpMetrics о плохом коде.
08:15 Читаем диаграмму Maintainability/Complexity.
11:35 Другие элементы главной страницы отчёта.
16:10 Раздел Violations (нарушения) отчёта PhpMetrics.
20:15 Раздел Size & Volume (размер и объём). Словарный запас кода.
29:00 Что такое объём метода и класса? Каким он должен быть?
34:40 Логические строки кода, вес комментариев и другие метрики оценки размера и объёма кода.
39:15 Раздел Complexity & Defects (сложность и дефекты). Цикломатическая сложность. Дефекты Кена.
44:15 Раздел Object oriented metrics (объектно ориентированные метрики).
45:45 Раздел Object relations (отношения между объектами) отчёта PhpMetrics.
46:15 Начинаем разговор о Coupling.
47:40 И тут же заканчиваем. Просьба о помощи в подготовке второй части разговора о PhpMetrics.

Полезные ссылки:
phpmetrics.github.io/website/ — сайт библиотеки PhpMetrics
phpmetrics.github.io/website/metrics/ — описание метрик

Получать анонсы новых видео можно на нашем телеграм-канале «Глазами фрилансера»: t.me/freelancer_eyes

#ГлазамиФрилансера
RSS
Ihor Rud
16:12
+1
Как всегда топ.Интересный инструмент.Спасибо Саш, такого контента на ютубе не встречал.
Dmitry Alinsky
17:47
— Советую на главной странице блок с Maintability/complexity проверять без комментариев, так как аннотации и комментарий к каждому методу, по моему мнению, сильно завышают показатель индекса поддерживаемости. К примеру, если добавить комментарий к каждому методу, свойству и условному оператору, то у вас этот «улей» будет практически весь зелёный. Но, как сами понимаете, это лишь иллюзия :)
— Volume до 8000 на класс — наверно, это много, даже как для критического показателя. И не обращаем внимание на цвет. Даже при хороших показателях, они будут иметь синий фон. Смотрим только на число.
— Самым полезным для меня оказалась цикломатическая сложность классов и методов. Сразу было видно, с чего начать рефакторинг, ну или, как минимум, на что обратить внимание. И помним, главное — не фанатеть :)

— А вот пример «плохо поддерживаемого класса». Я догадываюсь, почему так выходит. Слишком много публичных методов. Но выносить relations в какой-нибудь trait у меня рука не поднялась. Меня, кстати, удивило то, что scopes в Laravel прописываются в Model, а не в ModelQuery. В Yii2 это показалось более логичным, так как это автоматически разгружало модель. Хотя только что посмотрел и в Laravel это делается также простым переопределением query() с возвратом Query builder для определённой модели. Только вот примеров таких я ещё не встречал, по этому и подумал, что так просто не принято.
Но суть не в этом, а том, что класс плохо поддерживаемый :)

class Box extends Model
{
use SoftDeletes;
use SeoMetaModelTrait;

protected $table = 'box';

protected $casts = [
'name' => 'array',
'description' => 'array',
'date' => AsDate::class,
'datetime' => AsDatetime::class,
'image' => AsImage::class. ':widen_100|widen_500',
'images_list' => AsImages::class. ':widen_100|widen_500',
];

public function brand(): BelongsTo
{
return $this->belongsTo(Brand::class, 'brand_id')->withTrashed();
}

public function variations(): HasMany
{
return $this->hasMany(Variation::class, 'box_id')->orderBy('sort_index');
}

public function categories(): BelongsToMany
{
return $this->belongsToMany(Category::class, 'box_category_ref', 'box_id', 'category_id')->withTrashed();
}

public function tags(): BelongsToMany
{
return $this->belongsToMany(Tag::class, 'box_tag_ref', 'box_id', 'tag_id')->withTrashed();
}

public function scopePublished(Builder $query): void
{
$query->where('datetime', '<=', date('Y-m-d'));
}
}
Dmitry Alinsky
18:10
+1
Всех с новым годом!
slash
12:05
А как вставлен ниже php дока смайлик с подписью yakut?
slash
12:18
+1
Класс!!! Очень интересно!!! Надо попробовать. И очень интересно продолжение.
Roman Chubich
13:11
Спасибо за урок! Какая досада, я полагал, что мой слог выразителен и лаконичен.:)
Как я понял, более всего phpmetrics невзлюбил классы, чьи методы используют переменные, находящиеся в глобальной видимости.
Я много раз читал, о том что это плохо. Но всё равно пользуюсь, ибо на практике c ними легче, если их немного.
Например, $env, $user. Это вроде как «Будешь так делать, прыщи вырастут. А от Денди кинескоп сядет».:)
Но есть вещи, которые меня заставили пересмотреть свои взгляды. Например, классы раздутые обилием методов.
Это произошло в силу того, что не очень хорошо получилось освоить ООП. Вместо наследования я избыточно использую композицию.
В php вообще сложно осваивать ООП. Вникнуть в эту парадигму помог опыт написания кода на C# в Unity.
1,345,741 views
16:10
Интересно было бы узнать всякие частности: 1) как вы развертываете приложение, в случаях, когда это зависит от вас (laradock? собственная сборка докера? laravel sail?), 2) что с дебагом (что-то стандартное или специальное) 3) если микросервисы, то как вписываете туда ларавель (lumen или как-то по-другому) 4) интересны также внешние сервисы, которые используете (postman, diagram.net и т. п.)