Code refactoring in PhpStorm

Рефакторинг PHP — це справжня знахідка! Але під час його виконання досить часто виникають рутинні операції та повторювані дії з кодом. І в кінцевому рахунку може залишитися багато синтаксичних помилок. Це часто вбиває будь-яку ініціативу. І це точно не круто. На щастя, сучасні IDE здатні взяти на себе частину завдань, поки розробник може зосередитися на процесі рефакторингу коду та архітектури в цілому, а не на боротьбі з нудним кодом.

phpstorm Деякий час тому я навіть замінив безкоштовний NetBeans на платний PhpStorm, який має кращу реалізацію рефакторингу. І повірте, це того варте!

Хочу почати з невеликої зауваги щодо рефакторингу коду. Щоб виконати будь-яку команду в PhpStorm, викликати будь-яку функцію та знайти будь-який ярлик — достатньо запам'ятати лише одну комбінацію клавіш: Shift+Ctr/⌘+A (або Допомога → Знайти дію..., навіть якщо це забули).

Наприклад, список ToDo:

PhpStorm: Refactoring

Отже, давайте розпочнемо наш рефакторинг. Ми завжди можемо натрапити на якісь частини коду, де методи настільки розростуться, що навіть випивка не допоможе. Тож спочатку «розігріємо» їх. Яка ж це важка робота — вручну виділити порівняно цілісну окрему частину, оформити її в окремий метод, розташувати всі необхідні змінні та записати їх у аргументи, додати повернені значення в новостворений метод. І скільки помилок з'явиться в процесі? Ні, геть цей проклятий рефакторинг. Працює — не чіпай! А тепер спробуємо це зробити, але за допомогою IDE.

Рефакторинг: виділити метод / функцію

Ось вам, наприклад, чудовий шматок коду, який просто просить про декомпозицію.

php refactoring

Виділімо наш код і… туманно почнемо згадувати... де може бути Виділити метод, і які в нього гарячі клавіші: \
І поки використання не стане автоматичним – давайте згадаємо про універсальний код Знайти дію, який ідеально підходить для пошуку дії навіть за частиною її назви.

PhpStorm: Refactoring

Гаразд, запускаємо нашу дію — опа...

PhpStorm: Refactoring

Ха, я випадково виділив break; в кінці блоку, IDE помітила це розумно і завадила мені зробити сумну помилку. Такі автоматичні перевірки дуже корисні під час рефакторингу будь-якої великої частини коду, наприклад, як у циклі:

PhpStorm: Refactoring

Після того, як ми визначили безпечний фрагмент коду та виконали Виділити метод, з'являється діалогове вікно.

У цьому вікні нам потрібно якось викликати наш метод, вказати його видимість та, за необхідності, впорядкувати аргументи.

PhpStorm: Refactoring

До речі, я особисто використовую це діалогове вікно для визначення залежності «зовнішніх» змінних для довільного фрагмента коду, що дуже корисно при складному рефакторингу.

Ще кілька прикладів: рефакторинг «Виділити функцію/метод» для PHP

Ввести змінну

Блог IDE наводить такий приклад, але я використовую цю функцію трохи інакше. Наприклад, у нас є такий фрагмент коду:

PhpStorm: Refactoring

Тут відразу не зрозуміло, і форматування цього коду є незручним процесом.
Виберіть першу логічну частину,

PhpStorm: Refactoring

і виконайте Ввести змінну (Рефакторинг → Виділити → Змінну...), введіть назву змінної у з'явленому діалоговому вікні.

PhpStorm: Refactoring

Ми діємо аналогічно з рештою коду. В результаті код стає значно зрозумілішим; і легше зрозуміти логіку в цих умовах.

PhpStorm: Refactoring

Вбудована змінна

А якщо вам ліньки вручну виділяти фрагмент коду для експорту в змінну — storm може зробити це за вас. Поставте курсор десь поруч, виконайте Рефакторинг → Виділити → Змінну...), але цього разу замість діалогового вікна з'являється випадаючий список, з якого ми можемо вибрати відповідний фрагмент коду. І IDE люб’язно виділила його для нас.

PhpStorm: Refactoring

Ввести поле

Ця функція працює аналогічно, вона лише додає властивість класу замість змінної. Рефакторинг → Виділити → Поле...

PhpStorm: Refactoring

Ви можете встановити видимість властивостей, а також місце, де їх оголосити (в поточному методі, описі класу або в конструкторі).

Ввести константу

Той самий принцип можна використовувати для виділення часто повторюваних рядків у константи. Рефакторинг → Виділити → Константу...

PhpStorm: Refactoring

Ім'я константи було запропоновано самою IDE. Все, що нам потрібно, це натиснути Enter, щоб насолодитися результатом.

PhpStorm: Refactoring

Рефакторинг перейменування

Механізм перейменування, чи може хтось обійтися без нього? Він детально описаний у блозі IDE, тому я не буду повторюватися: Нові можливості рефакторингу перейменування в PhpStorm 2.0

Геттери/Сеттери

Сутності в Doctrine 2 (під час використання анотацій для їх оголошення) дають наочний приклад, де автоматичне генерування доступів/мутатора є дуже корисним. Просто опишіть властивості класу, потім викличте Code → Generate → Getters and Setters, і виберіть, для яких властивостей ми повинні згенерувати методи.

PhpStorm: Refactoring

А ось результат наших «швидких і легких» робіт.

PhpStorm: Refactoring

Якщо формат не зовсім підходить, шаблони генерації можна виправити на свій розсуд.

Редагування шаблонів методів генерації get * / set *.

Огорнути з

«Обгортання» коду в типових if(expr){…} та while(expr){…}. Це детально описано в блозі IDE: Новинки в 3.0: Більше дій «Огорнути з» для PHP

Розумний детектор дублікатів коду

Це чудова річ, яка допомагає знаходити дублікати безпосередньо з IDE, замість запуску консольних утиліт з їх «порожніми» та непоінформативними звітами.

Вона починається звідси: Code → Locate Duplicates...

extract method refactoring

Знайдені дублікати сортуються за релевантністю (вартістю). Чим вищі вони — тим сумніша ситуація в коді. Зручно, що код у вікні попереднього перегляду можна масштабувати та редагувати. Це спрощує процес рефакторингу.

PHP Code Sniffer

Просто не забувайте налаштовувати Code Sniffer, більше того, його підтримка тепер інтегрована в IDE.

Використовуючи: Перевірка вашого коду за допомогою PHP Code Sniffer в PhpStorm 4.0
Розширене налаштування: Розширені параметри PHP Code Sniffer в PhpStorm 5.0

Міні-поради

1. Закрили файл / втратили місце, де були зроблені останні зміни? Це не важливо! Navigate → Last Edit Location

2. Використовуйте інструмент рефакторингу для прямокутного виділення коду (середня кнопка миші або увімкніть/вимкніть Режим виділення стовпців у контекстному меню)

PhpStorm: Рефакторинг

Якщо ви почнете писати у так виділеному блоці коду — всі рядки зміняться одночасно.

PhpStorm: Рефакторинг

3. Використовуйте живі шаблони

4. Ефективно керуйте різними задачами

5. Локальна історія — це круто!

6. І не забувайте про найзручнішу історію буфера обміну, яка викликається стандартною комбінацією клавіш вставки +Shift (або Редагувати → Вставити з історії...)

рефакторинг коду

І деяка цікава статистика

PhpStorm збирає статистику, за якою визначає найчастіше використовувані функції у роботі та пропонує, що ще варто використовувати частіше.

P.S. О, і погляньте на абзац вгорі, хіба PhpStorm не дорогий? ;)

інструмент рефакторингу коду

Супутні матеріали

Ця стаття є лише стартовою точкою серії нотаток про PhpStorm. Наступна тема — як працювати з налагодженням коду за допомогою цього чудового IDE та xdebug. Заявки на інші гарячі теми приймаються в коментарях. А більше інформації про наш досвід та експертизу в Symfony ви можете знайти тут.