Статьи

Попробуем PHP рефакторинг браузера

Помните времена, когда они пытались преобразовать вас из вашей PHP-установки на Unix в IDE, отбрасывая Vim и инструменты командной строки для Eclipse из PhpStorm?

Одним из спорных моментов, в которых IDE явно имела преимущество, была доступность автоматизированного рефакторинга: в динамическом языке, таком как PHP, не всегда просто и не безопасно выполнять автоматическое извлечение метода. Тем не менее, одним из преимуществ PhpStorm является то, что он способен извлекать код именно таким образом.

Религиозная война

Сторонники IDE, по сути, любят интегрированную среду разработки, которая предоставляет все функциональные возможности, необходимые для написания и редактирования кода; Последователи способа Unix обычно пишут код на Vim, дополняя его с помощью плагинов, где это возможно, и используя внешние инструменты, которые делают одно и делают это хорошо .

Например, это задачи, выполняемые средой IDE, которые в настоящее время легко выполняются из командной строки:

  • создание и тестирование проекта: Phing и PHPUnit, а также другие инструменты BDD, такие как Behat, могут быть запущены напрямую проще, чем путем визуализации их вывода в окне Eclipse.
  • Поиск запахов кода: PHP_CodeSniffer, PHP Copy & Paste Detector и PHP Mess Detector запускают статический анализ из командной строки. PHP CS Fixer может автоматически устранить некоторые из самых простых проблем.
  • Профилирование: XDebug и xhprof запускают код на реальном сервере, производя измерения производительности, которые можно организовать с помощью независимых от языка инструментов, таких как Kcachegrind.

Автоматизированный рефакторинг в PHP был вне лиги пользователей Vim и Unix; однако благодаря Qafoo новый инструмент с открытым исходным кодом может редактировать код с предопределенными рецептами рефакторинга: PHP Refactoring Browser.

Давайте оправдаем наши ожидания

Не думайте, что вы сразу же достигнете того же уровня производительности в рефакторингах, который вы можете сделать вручную с помощью Vim: Браузер рефакторинга PHP находится в альфа-версии и предоставляет только несколько базовых методов рефакторинга, ориентированных на один исходный файл:

  • Преобразовать локальную переменную в экземпляр
  • Метод извлечения
  • Переименовать локальную переменную

Во вступительном посте Бенджамина есть примеры использования этих команд, поэтому я не буду вдаваться в подробности. В любом случае мне нравится философия этого инструмента: использование API командной строки на основе Unix для применения автоматического рефакторинга к коду PHP.

В результате получается библиотека с поддержкой Composer, которую вы можете установить на любой машине, на которой работает интерпретатор PHP, и которая может быть вызвана выбранным вами редактором. Обратите внимание, что многие из функций IDE скрыты внутри них и должны быть заново изобретены другими редакторами или каждый раз, когда вы переходите на сервер, такой как среда CI (удачи, запустив Eclipse на компьютере без головы).

Хотя в прошлом существовали аналогичные ограниченные инструменты (например, я внес вклад в Scisr), PHP Refactoring Browser обладает архитектурой и надежностью для того, чтобы быть центром запросов извлечения, расширяя его функциональность.

Пробовать

Инструмент можно скачать как один Phar. Я установил PHP Refactoring Browser через Composer, чтобы упростить обновление, когда придет время; однако вы должны быть осторожны, следуя этому пути, поскольку существует зависимость от хранилища, которая не может быть объявлена ​​проектом. Вы должны использовать этот composer.json:

{
  ...,
  "minimum-stability": "dev",
  "repositories": [
  {
      "type": "vcs",
      "url": "https://github.com/QafooLabs/php-refactoring-browser"
  },
  {
      "type": "vcs",
      "url": "https://github.com/schmittjoh/PHP-Parser"
  }
  ],
  "require": {
      "qafoolabs/php-refactoring-browser": "dev-master"
  }
}

Обратите внимание на ограничение версии ‘dev-master’, которое также присутствует в зависимости PHP Refactoring Browser от библиотеки php-analyzer; просто сказать, что это не стабильный выпуск.

Я без проблем выполнил извлечение поля и метода самостоятельно, так как вывод команд рефакторинга — это унифицированный diff, который может быть передан непосредственно в патч . В истории комитетов этого Git-репозитория вы можете видеть, как пара команд завершила работу вместе с ручным шагом, состоящим из проверки видимости и методов перемещения.

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

Выводы

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