PHP рефакторинг — это круто! Но в процессе часто встречаются рутинные операции, монотонные действия с кодом, после которых, бывает, полно синтаксических ошибок. Это очень демотивирует. А вот это уже не круто. К счастью, современные IDE умеют брать часть обязанностей на себя и разработчик может сконцентрироваться над процессом рефакторинга и архитектурой в целом, а не над борьбой со скучным кодом.
В свое время я даже променял бесплатный NetBeans на платный PhpStorm именно из-за лучшей реализации рефакторинга. И поверьте, оно того стоило!
Начну с небольшой ремарки. Чтобы выполнить в шторме любую команду, вызвать любую функцию, подсмотреть любой шорткат — достаточно помнить только один: Shift+Ctr/⌘+A (или , если даже этот забудется).
Например — список ToDo:
Итак — начнем наш рефакторинг существующего кода. Всегда есть участки кода, где методы разрастаются до таких размеров, что без-100-грамм-и-не-осилишь. Вот они и попадают под раздачу первыми. Но как же тяжело вручную выделить в таком методе относительно целостную отдельную часть, оформить ее в отдельном методе, выписать все необходимые переменные и записать в аргументы, добавить возвращаемые значения в новоиспеченном методе. А багов то сколько в процессе появится? Не, ну его нафиг, этот рефакторинг кода. Работает — не трожь! А теперь — все то же, но используя IDE.
Extract Method/Function
Вот, например, замечательный кусок кода, который так и просится на декомпозицию.
Выделяем нашу простыню кода, и... начинаем вспоминать, где же этот
А пока использование не дошло до автоматизма — не забываем об универсальной команде ,
которая умеет прекрасно находить действия даже по части названий.
Окей, запускаем наше действие — опа...
Ха, я же случайно выделил break;
в конце блока, IDE это просекла, и не дала совершить мне печальную ошибку.
Такие автоматические проверки очень полезны, если рефакторится большой участок кода, например, в цикле:
После того, как выделили безопасный участок кода и запустили
— увидим диалоговое окно.В окне нужно как-то назвать наш метод, указать его видимость, отсортировать порядок аргументов при необходимости.
Кстати, лично для себя я использую этот диалог для определения зависимостей от «внешних» переменных для произвольного участка кода, что очень помогает при сложном рефакторинге.
Еще несколько примеров: ‘Extract Function/Method’ refactoring for PHP
Introduce Variable
В блоге IDE приведен такой пример, но я использую этот функционал немного по другому. Например, есть у нас участок кода:
И смысл не сразу понятен, и форматировать такой код неудобно.
Выделяем первую логическую часть,
и запускаем Introduce Variable (
), вводим название переменной в появившемся диалоге.Аналогично поступаем и с остальным кодом. В результате — код значительно нагляднее, понимать логику в условиях легче.
Inline variable
А если лень вручную выделять участок кода для экспорта в переменную — шторм и это умеет. Ставим курсор где-то рядом, запускаем
), но теперь вместо диалогового окна появляется выпадающий список, из которого мы можем выбрать подходящий нам блок кода, который IDE любезно нам выделила.Introduce Field
Аналогично работает и эта функция, только добавляет не переменную, а свойство класса.
Можно настроить видимость свойства, а также место, где его объявить (в текущем методе, описании класса или в конструкторе).
Introduce Constant
По такому же принципу можно выделять часто повторяющиеся строки в константы.
Название константы IDE предложила сама.Нам остается только нажать Enter — и любоваться результатом.
Rename refactoring
Механизм переименования, куда же без него? Вполне наглядно описан в блоге IDE, поэтому не буду повторяться: New Rename refactoring features in PhpStorm 2.0
Getter/Setter
Наглядный пример, где автоматическая генерация аксессоров/мутаторов здорово помогает — сущности в Doctrine 2 (при использовании аннотаций для их обьявления). Достаточно просто описать свойства класса, потом вызываем
, выбираем, для каких свойств нужно нагенерить методов.А вот и результат наших «секундных» трудов.
Если формат не очень подходит, шаблоны генерации можно подкорректировать на свой лад.
Редактирования шаблонов генерации методов get*/set*.
Surround With
«Завертывание» кода в типичные if(expr){…}
и while(expr){…}
. Подробно описано в блоге IDE:
New in 3.0: More ‘Surround With’ actions for PHP
Smart Duplicated Code Detector
Замечательнейшая вещь, которая помогает отыскать дубликаты прямо из IDE, а не запускать консольные утилиты с их «сухими» и малоинформативными отчетами.
Запускается отсюда:
Найденные дубликаты отсортированы по значимости (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. Закрыли файл/потеряли место, где в последний раз делали правки? Не беда!
2. Применяйте прямоугольное выделение (средняя кнопка мыши, или в контекстном меню включаем/выключаем
)Если при выделенном таким образом блоке кода начать писать — то синхронно будут изменяться все строки.
4. Эффективно управляйтесь с ToDo'шками
5. Локальная история рулит!
6. И никак не забываем об удобнейшей истории буфера обмена, который вызывается при стандартном хоткее вставки +Shift (или )
И немного занимательной статистики
PhpStorm собирает статистику, с помощью которой определяет наиболее часто используемый функционал при работе, а также подсказывает, который следовало бы использовать почаще.
P.S. А, и обратите внимание на абзац текста сверху, ну разве PhpStorm не няша? ;)
Материалы для тех, кого интересует рефакторинг в php шторм
- Официальный блог об WebStorm/PhpStorm
- Официальные скринкасты от JetBrains
- Презентация Productivity and Refactoring in Eclipse and IntelliJ Idea
Эта статья — отправная точка серии заметок об PhpStorm. Следующая на очереди — по отладке кода с использованием этой чудесной IDE и xdebug. Заявки на остальные горячие темы принимаются в комментариях.