Код читають набагато частіше, ніж пишуть. Перейменування - найдешевший рефакторинг з найбільшим ефектом на читабельність: назва, що точно описує сутність, позбавляє потреби читати реалізацію.
Ознаки поганих назв:
$data = $this->get($id); // які дані? що «отримати»?
$flag = true; // який прапорець?
$tmp, $res, $arr, $obj; // назви за типом, а не за змістом
function process($x) {} // «обробити» - що саме?
$d = 30; // 30 чого? днів? хвилин?
Як краще:
$invoice = $this->findInvoice($invoiceId);
$isRegisteredForDiscounts = true;
function sendOverdueReminders(Collection $invoices): void {}
$gracePeriodInDays = 30;
Правила, що допомагають:
- за наміром, а не за реалізацією:
activeSubscribers(), а неgetUsersWhereStatusIsOneAndPaidIsTrue(); - булеві значення - питанням:
isPaid,hasAccess,canPublish,shouldRetry; - методи - дієсловом:
calculateTotal(),sendInvoice(); класи й змінні - іменником; - одиниці виміру в назві, якщо тип їх не передає:
timeoutSeconds,priceCents,sizeInBytes; - мова предметної області: якщо бізнес каже «замовлення», «відвантаження», «повернення» - у коді
Order,Shipment,Refund, а неItem,Process,Operation; - послідовність: не
fetch/get/retrieve/loadдля того самого типу дії в різних місцях; - довжина пропорційна області видимості:
$iу короткому циклі - нормально; змінна, що живе в усьому класі, - описова назва.
Перейменування безпечне з інструментами: IDE (Rename у PhpStorm) змінює всі використання, включно з рядковими посиланнями й документацією; статичний аналіз (PHPStan) і тести ловлять пропущене.
Пастки:
- публічні API (маршрути, поля JSON, назви колонок, події) - перейменування ламає клієнтів і потребує міграції чи періоду сумісності;
- рядкові посилання (
config('services.old_name'), назви в Blade,$model->getAttribute('field')) IDE може не знайти; - магічні методи й динамічні виклики - перевіряти тестами.
Корисне правило: якщо назву важко придумати, часто проблема не в назві, а в коді - метод чи клас робить забагато різного.
Докладніше в документації: Каталог рефакторингів: Rename Variable