Рефакторинг существующего кода в PhpStorm

PHP рефакторинг — это круто! Но в процессе часто встречаются рутинные операции, монотонные действия с кодом, после которых, бывает, полно синтаксических ошибок. Это очень демотивирует. А вот это уже не круто. К счастью, современные IDE умеют брать часть обязанностей на себя и разработчик может сконцентрироваться над процессом рефакторинга и архитектурой в целом, а не над борьбой со скучным кодом.

phpstorm В свое время я даже променял бесплатный NetBeans на платный PhpStorm именно из-за лучшей реализации рефакторинга. И поверьте, оно того стоило!

Начну с небольшой ремарки. Чтобы выполнить в шторме любую команду, вызвать любую функцию, подсмотреть любой шорткат — достаточно помнить только один: Shift+Ctr/⌘+A (или Help → Find Action..., если даже этот забудется).

Например — список ToDo:

PhpStorm: Refactoring

Итак — начнем наш рефакторинг существующего кода. Всегда есть участки кода, где методы разрастаются до таких размеров, что без-100-грамм-и-не-осилишь. Вот они и попадают под раздачу первыми. Но как же тяжело вручную выделить в таком методе относительно целостную отдельную часть, оформить ее в отдельном методе, выписать все необходимые переменные и записать в аргументы, добавить возвращаемые значения в новоиспеченном методе. А багов то сколько в процессе появится? Не, ну его нафиг, этот рефакторинг кода. Работает — не трожь! А теперь — все то же, но используя IDE.

Extract Method/Function

Вот, например, замечательный кусок кода, который так и просится на декомпозицию.

php refactoring

Выделяем нашу простыню кода, и... начинаем вспоминать, где же этот Extract Method, и какие для него горячие клавиши :\
А пока использование не дошло до автоматизма — не забываем об универсальной команде Find Action, которая умеет прекрасно находить действия даже по части названий.

PhpStorm: Refactoring

Окей, запускаем наше действие — опа...

PhpStorm: Refactoring

Ха, я же случайно выделил break; в конце блока, IDE это просекла, и не дала совершить мне печальную ошибку. Такие автоматические проверки очень полезны, если рефакторится большой участок кода, например, в цикле:

PhpStorm: Refactoring

После того, как выделили безопасный участок кода и запустили Extract Method — увидим диалоговое окно.

В окне нужно как-то назвать наш метод, указать его видимость, отсортировать порядок аргументов при необходимости.

PhpStorm: Refactoring

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

Еще несколько примеров: ‘Extract Function/Method’ refactoring for PHP

Introduce Variable

В блоге IDE приведен такой пример, но я использую этот функционал немного по другому. Например, есть у нас участок кода:

PhpStorm: Refactoring

И смысл не сразу понятен, и форматировать такой код неудобно.
Выделяем первую логическую часть,

PhpStorm: Refactoring

и запускаем Introduce Variable (Refactor → Extract → Variable...), вводим название переменной в появившемся диалоге.

PhpStorm: Refactoring

Аналогично поступаем и с остальным кодом. В результате — код значительно нагляднее, понимать логику в условиях легче.

PhpStorm: Refactoring

Inline variable

А если лень вручную выделять участок кода для экспорта в переменную — шторм и это умеет. Ставим курсор где-то рядом, запускаем Refactor → Extract → Variable...), но теперь вместо диалогового окна появляется выпадающий список, из которого мы можем выбрать подходящий нам блок кода, который IDE любезно нам выделила.

PhpStorm: Refactoring

Introduce Field

Аналогично работает и эта функция, только добавляет не переменную, а свойство класса. Refactor → Extract → Field...

PhpStorm: Refactoring

Можно настроить видимость свойства, а также место, где его объявить (в текущем методе, описании класса или в конструкторе).

Introduce Constant

По такому же принципу можно выделять часто повторяющиеся строки в константы. Refactor → Extract → Constant...

PhpStorm: Refactoring

Название константы IDE предложила сама.Нам остается только нажать Enter — и любоваться результатом.

PhpStorm: Refactoring

Rename refactoring

Механизм переименования, куда же без него? Вполне наглядно описан в блоге IDE, поэтому не буду повторяться: New Rename refactoring features in PhpStorm 2.0

Getter/Setter

Наглядный пример, где автоматическая генерация аксессоров/мутаторов здорово помогает — сущности в Doctrine 2 (при использовании аннотаций для их обьявления). Достаточно просто описать свойства класса, потом вызываем Code → Generate → Getters and Setters, выбираем, для каких свойств нужно нагенерить методов.

PhpStorm: Refactoring

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

PhpStorm: Refactoring

Если формат не очень подходит, шаблоны генерации можно подкорректировать на свой лад.

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

Surround With

«Завертывание» кода в типичные if(expr){…} и while(expr){…}. Подробно описано в блоге IDE: New in 3.0: More ‘Surround With’ actions for PHP

Smart Duplicated Code Detector

Замечательнейшая вещь, которая помогает отыскать дубликаты прямо из IDE, а не запускать консольные утилиты с их «сухими» и малоинформативными отчетами.

Запускается отсюда: Code → Locate Duplicates...

extract method refactoring

Найденные дубликаты отсортированы по значимости (cost). Чем они выше — тем ситуация в коде печальнее. Удобно, что код в окошках предварительного просмотра можно масштабировать и редактировать, что упрощает рефакторинг кода.

PHP Code Sniffer

Так же не забываем настроить Code Sniffer, тем более, что его поддержка теперь интегрирована в IDE.

Использование: Checking your code with PHP Code Sniffer in PhpStorm 4.0
Продвинутая настройка: Advanced PHP Code Sniffer Options in PhpStorm 5.0

Mini tips

1. Закрыли файл/потеряли место, где в последний раз делали правки? Не беда! Navigate → Last Edit Location

2. Применяйте прямоугольное выделение (средняя кнопка мыши, или в контекстном меню включаем/выключаем Column Selection Mode)

PhpStorm: Refactoring

Если при выделенном таким образом блоке кода начать писать — то синхронно будут изменяться все строки.

PhpStorm: Refactoring

3. Используйте Live Templates

4. Эффективно управляйтесь с ToDo'шками

5. Локальная история рулит!

6. И никак не забываем об удобнейшей истории буфера обмена, который вызывается при стандартном хоткее вставки +Shift (или Edit → Paste from History...)

refactoring of code

И немного занимательной статистики

PhpStorm собирает статистику, с помощью которой определяет наиболее часто используемый функционал при работе, а также подсказывает, который следовало бы использовать почаще.

P.S. А, и обратите внимание на абзац текста сверху, ну разве PhpStorm не няша? ;)

code refactoring tool

Материалы для тех, кого интересует рефакторинг в php шторм

Эта статья — отправная точка серии заметок об PhpStorm. Следующая на очереди — по отладке кода с использованием этой чудесной IDE и xdebug. Заявки на остальные горячие темы принимаются в комментариях.