Рефакторинг #6: Улучшение качества кода в Laravel с помощью Rector

Недавно я открыл для себя Rector и был совершенно потрясен его мощью и эффективностью. Обещания просты: вы устанавливаете и запускаете пакет, и получаете мгновенные автоматические обновления и рефакторинг.

Черт, это смело, подумал я, когда запускал его в одном из своих проектов. Еще читая инструкции на первой странице getrector.org, я решил погрузиться в проект и за ночь провести рефакторинг всего проекта, насколько это возможно.

Я запускаю проект Laravel 8 в среде PHP 7.4, и я начал с простой конфигурации, которая позволяет улучшить качество кода:

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->paths([
        __DIR__ . '/app'
    ]);

    $rectorConfig->importNames();

    $rectorConfig->sets([
        LevelSetList::UP_TO_PHP_74,
        SetList::CODE_QUALITY,
    ]);
};
Войти в полноэкранный режим Выход из полноэкранного режима

Не волнуйтесь, если вы не понимаете код выше, я тоже не понимал его полчаса назад 😂.

Запустив vendor/bin/rector --dry-run, я сразу увидел эти маленькие улучшения, которые я все равно никогда не собирался делать сам.

Автоматический импорт имен классов

     /**
-     *
-     * @return IlluminateBroadcastingChannel|array
-     */

+     *
+     * @return Channel|array
+     */
     public function broadcastOn()
Вход в полноэкранный режим Выход из полноэкранного режима

Это изменение происходит из конфигурации $rectorConfig->importNames();, и оно спасает жизнь. Большинство стандартов кодирования предпочитают короткие имена классов, поэтому автоматический импорт классов во всем проекте — это большая победа.

Замена строкового имени класса на константу класса

    public function user() {
-      return $this->belongsTo('AppUser');

+      return $this->belongsTo(User::class);
     }
Вход в полноэкранный режим Выйти из полноэкранного режима

Это фантастика для старых проектов Laravel, поскольку большинство из них до сих пор используют строковую версию. Это отличное обновление, поскольку IDE гораздо лучше поддерживают версию User::class.

Функции стрелок из PHP 7.4

       $schedule->command('dummy-command')
         ->daily()

-        ->when(function () {
-          return CarbonCarbon::now()->endOfWeek()->isToday();
-        });

+        ->when(fn() => Carbon::now()->endOfWeek()->isToday());
Вход в полноэкранный режим Выход из полноэкранного режима

Я даже не знал, что стрелочные функции появились в PHP 7.4, и я мог бы использовать их без обновления языка. Теперь я могу использовать их мощь с помощью одной команды rector.

Встраивание бесполезных переменных

-        $phone = str_replace(' ', '', $phone);
-        return $phone;

+        return str_replace(' ', '', $phone);
Вход в полноэкранный режим Выйти из полноэкранного режима

Это еще один низко висящий плод. Переменная $phone здесь ничего не добавляет к качеству кода, поэтому ее можно смело удалить.

Объедините оператор присваивания

-        $this->order_count = $this->order_count + 1;

+        $this->order_count += 1;
Вход в полноэкранный режим Выйти из полноэкранного режима

Это тоже очень просто. На мой взгляд, короткая версия всегда лучше.

Упростите операторы возврата if.

-        if ($user->company_id == $this->id) {
-            return true;
-        }
-
-        return false;


+        return $user->company_id == $this->id;
Вход в полноэкранный режим Выйти из полноэкранного режима

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

/** @noRector RectorCodeQualityRectorIf_SimplifyIfReturnBoolRector */.

Выброс ошибки при операциях с JSON

     public function setImageUrlsAttribute($value)
     {
-        $this->attributes['image_urls'] = json_encode($value);

+        $this->attributes['image_urls'] = json_encode($value, JSON_THROW_ON_ERROR);
     }
Вход в полноэкранный режим Выйти из полноэкранного режима

Этот дополнительный параметр позволяет сделать так, чтобы при неправильном кодировании или декодировании JSON не возвращался null, а выбрасывалось исключение. Мне нравится этот вариант, но я пока не совсем уверен, что готов к такой оптимизации в своем коде. Так как это приводит к исключению, я немного утомлен и сохраню это на потом.

Мы можем игнорировать некоторые правила, используя эту конфигурацию.

Преобразовывать компактные использования в массивы

         $user= auth()->user();
         $credits= $user->credits()->latest()->get();

-        return view('user.credits', compact('user', 'credits'));


+       return view('user.credits', ['user' => $user, 'credits' => $credits]);
Вход в полноэкранный режим Выйти из полноэкранного режима

Сегодня я узнал, что существует мнение об использовании функции compact(), которое гласит, что она не идеальна и, возможно, является антипаттерном. Не уверен, как я к этому отношусь, но я продолжаю этот рефакторинг и плыву по течению. Нет ничего плохого в старых добрых массивах, верно?

И много других мелких обновлений на самом деле. Не стоит забывать, что это происходит только из правил CODE_QUALITY, которые я импортировал одной строкой выше. Есть еще 30+ категорий, которые мне не терпится использовать и посмотреть, что они предлагают.

На данный момент я просто запускаю vendor/bin/rector, все тесты все еще проходят, коммит, push и развертывание. Теперь в продакшене все хорошо 😁.

Оцените статью
devanswers.ru
Добавить комментарий