Інструменти для рефакторингу коду PHP [закрито]


74

Чи існують інструменти, що підтримують рефакторинг PHP-коду (перейменування змінних, вилучення методів, пошук посилань на методи, ...)? Дякую.


3
Думаю, насправді важко мати надійний рефакторинг динамічною мовою ...
Андрій Рінея

2
Так, це так, але я підозрюю, що справжньою проблемою тут є відсутність використання хорошої інфраструктури (аналіз, статичний аналіз, перетворення), на якій можна побудувати інструмент. Поки фундаменти не стануть міцними, навряд чи є сенс будувати будинок.
Ira Baxter

Основи зміцнюються. Дивіться stackoverflow.com/a/21400723/120163
Ira Baxter

1
Наприкінці 2017 року я дивився на роботу над інструментом реконструкції AST Ректор: github.com/RectorPHP
Томаш Вотруба

Відповіді:


14

Scisr - це простий, самостійний інструмент рефакторингу для PHP.

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

Багато моїх цілей дизайну виникло через недостатність інших згаданих тут предметів - вони пов’язані з певними середовищами розробки, або намагаються диктувати ваші практики тестування, або вимагають цілу купу ручної праці. Я сподіваюся створити загальний кращий досвід роботи в Scisr. Це просто встановити та запустити. Він намагається бути розумним, але не надто розумним. Він виконує ті завдання, які, на мою думку, найкраще піддаються автоматизації. Насолоджуйтесь!


Я щойно прочитав домашню сторінку вашого проекту. Я повністю погоджуюсь із методом, що лежить в основі проекту, і сподіваюся, що він справляється добре. (Я розробляю на ПК, тому, на жаль, мені доведеться почекати, поки я перейду до Ubuntu, перш ніж я зможу його використовувати)
JW.

Радий, що тобі подобається! Якщо вам захочеться трохи зламати, запускати в середовищі Windows не повинно бути надто складно. Я припускаю, що шляхи до файлів були б єдиною справжньою проблемою, і багато з цим обробляється кодом, який я написав із CodeSniffer, який, на мою думку, підтримує Windows.
Ian Greenleaf Young

Посилання порушено - здається, це все: github.com/iangreenleaf/Scisr
Вальтер Мундт

@ Вальтер-Мундт - дякую. Я змінив своє ім'я користувача github деякий час назад і зламав його. Виправлено зараз.
Ian Greenleaf Young

12

rephactor - це інструмент автоматичного рефакторингу. Це ще трохи неповно, але воно має кілька основних рефакторингів.

В іншому випадку, хороший набір тестів - це дійсно найкращий інструмент для рефакторингу, який ви можете мати.


15
ЦЕ використовує регулярні вирази для пошуку коду. Це просто не безпечно.
Ira Baxter

5
Автоматичні рефакторинг ніколи не бувають. Вам слід пройти тести до і після, щоб перевірити операцію. Rephactor насправді інтегрує потік тестування до / після.
troelskn

7
@troelskn: Ніколи? Чому інструмент рефакторингу повинен бути реалізований таким чином, щоб завдати шкоди вашій програмі? Це просто означає, що у вас справді поганий інструмент рефакторингу. Це технічно просто зробити більшість реорганізацій правильно . Це багато інженерного поту, і більшість людей не хочуть за це платити, і це пояснює, чому речі, які там є, загалом досить погані. Але це не означає, що інструменти рефакторингу повинні бути зламані.
Ira Baxter

Будь-яка зміна бази коду має ризик помилок.
troelskn

6
@troelskn: Не загалом. Так, з динамічними мовами, оскільки прив'язка ім'я-реалізації здійснюється під час виконання. Статичні мови, такі як Haskell або C ++, де прив'язка імені-імплементації виконується під час компіляції, / до / запуску коду, можуть забезпечити рефакторинг, який гарантовано успішний. Ось чому динамічні мови, загалом, відстій.
Джессі

8

PHPStorm від Jetbrains підтримує рефакторинг, http://www.jetbrains.com/phpstorm/index.html

Рефакторинг "Перейменувати" працює для файлів, функцій, констант, класів, властивостей, методів, параметрів, а також локальних та глобальних змінних. Також доступні наступні рефакторинг:

  • Ввести змінну
  • Представляємо Константу
  • Введіть поле
  • Вбудована змінна

і вони також пропонують безкоштовну ліцензію на проект з відкритим кодом!


2
Насправді ця IDE підтримує рефакторинг. На жаль, у нього є деякі проблеми з юзабіліті. Я сподіваюся, що вони незабаром будуть виправлені. Наприклад, коли ви виконуєте пошук / заміну у виділенні, вікно редактора перескакує на "замінити все". Взагалі мені це подобається і я ним користуюся, хоча я б вибрав Aptana відразу, якби підтримував перейменування.
argyle

всередині це неймовірно, але юзабіліті справді відмовно порівняно з eclipse / netbeans. Наприклад ОСНОВНІ функції, такі як пошук / заміна та інструменти команди.
gaRex

6

IDE NetBeans має деякі можливості рефакторингу, але, здається, це не завжди працює. Однак я використовую 6.1 з раннім доступом до PHP. Я очікую, що 6.5 матиме кращі можливості рефакторингу за допомогою PHP.


Я використовую Netbeans 6.5, і ви можете робити такі речі, як методи перейменування, але це не фіксує посилання в інших файлах, навіть у файлах того самого проекту, що робить його в основному марним.
cletus

Я використовую Netbeans 6.7, це начебто працює ...
Рональд Конко

Я використовую 6.9.1, і я думаю, що можливості рефакторингу все ще обмежені пошуком / заміною рядків у випадку PHP. Для динамічної мови можливості рефакторингу завжди були б обмежені. Ви все ще не можете робити такі речі, як клацання правою кнопкою миші на назву класу та перейменовування його на щось інше у всіх контекстах.
rjha94,

Застосування Netbeans 7.2 (/ 3) рефакторингу працює частіше за все. Перейменування класів / методів / змінних у різних контекстах.
juwens

5

https://github.com/QafooLabs/php-refactoring-browser

PHP Refactoring Browser - це нещодавній підхід до браузера Refactoring, описаний у хорошій книзі . Він міг би скористатися деякою допомогою (будь ласка, внесіть), але він має підтримку для декількох загальних рефакторингів.

На момент написання браузер підтримує:

  • Метод витяжки
  • Перейменувати локальну змінну
  • Перетворити локальну змінну на екземпляр
  • Перейменуйте клас та простори імен
  • Заяви про оптимізацію використання (для PHP)

Існує плагін SublimeText, який насправді працює. Коли я розглядаю новий код, я застосую деякі з цих простих рефакторингів, щоб допомогти мені отримати дескриптор кодової бази.


3

Все-таки моїм улюбленим інструментом рефакторингу є хороший старий EditPlus у поєднанні з Total Commander супершвидким пошуком файлів . (Підказка: Alt + F7) Я повністю погоджуюсь з відповіддю Марка Біка про те, що ви хочете мати повний контроль над тим, що і коли замінюється.

Кожного разу, коли мені доводиться робити деякий рефакторинг, я створюю список у загальній команді файлів, які я хочу змінити, або шукаючи за допомогою вбудованої функції, або просто виділяючи їх, а потім перетягую їх усіх до EditPlus

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

Крім того, що корисно для рефакторингу коду, це макрореєстратор EditPlus (Ctrl + Q для початку запису макросу 1-9 та Alt + 1-9 для відтворення макросу).

Після того, як ви зрозумієте це, ви знаєте, що ви можете просто шукати змінну, ctrl + shift + (додому || кінець || клавіші зі стрілками) за допомогою коду, видаляти, копіювати / вставляти та використовувати всі ці майстри клавіатури, щоб сподобатися, наприклад, перетворити файл CSV у купу SQL-запитів протягом 30 секунд.


12
Це не рефакторинг. Це просто редагування.
Ira Baxter,

2
рефакторинг - це просто автоматичне редагування.
quodlibetor

7
@quotlibetor: Написання "П'ятої" Бетховена - це просто редагування за вашим визначенням. Різниця між рефакторінгом (переміщення чітко визначених фрагментів коду семантично законними способами) настільки якісно відрізняється від переміщення довільних фрагментів тексту з невідомим значенням, що різницю між цими двома термінами неможливо стерти.
Ira Baxter,

3

Я особисто віддаю перевагу PHPEclipse IDE як свій основний інструмент розробки. Але мені дуже не вистачає базового рефакторингу "замінити скрізь у проекті".

Але дуже проста команда find / sed може це легко вирішити:

find . -type f -name "*Controller.php" -print0 \
         | xargs -0 sed -i 's/string1/string2/g'

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

До речі: ви навіть не можете запам'ятати всі ці параметри та атрибути - просто введіть один раз, а потім зателефонуйте за допомогою зворотного i-пошуку .

Сподіваюся, це допомагає.


2
Зверніть увагу на команду sed: коли ви переробляєте ім'я змінної, ви часто хочете обмежити рефататор на певному змаганні , як, наприклад, певна функція. Ви можете мати змінну $ data багато часу в класі, але, можливо, ви захочете змінити її назву лише у функції _dataRead (). Можливість зробити це встановлює різницю між простою командою sed та плагіном IDE.
Emilio AL


2

Можливо, це просто тому, що я все ще знайомлюся з концепціями рефакторингу, але мені не подобається, коли інструмент робить це за мене.

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


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

Я згоден з Марком. крім того - я не розумію основної точки продажу рефакторингу: "Це приводить код до формату, прийнятного та зрозумілого будь-якому програмісту з будь-якої частини земної кулі". Але ми всі різні. Те, що мені легко, може бути важким для когось іншого, і якщо ви переробляєте мій код для когось іншого, мені може бути нелегко слідувати. То який сенс?
Stann

Я не згоден з тим, що рефакторинг має на меті "привести код у формат, прийнятний і зрозумілий будь-якому програмісту". Найпростіший приклад - перейменування методу, якщо ім'я методу погане, ви можете легко вдосконалити його, впевнені, що ваші зміни не торкнуться нікого іншого. Очевидно, що якщо ви доставляєте банку для використання іншими, ви не перейменовуватимете загальнодоступні методи, ви створили б новий і застаріли старий. Але в такому випадку ви все одно можете рефакторувати так, щоб ваш внутрішній код викликав краще названу функцію.
Хуан Мендес,

Хоча це правда, що рефакторинг повинен бути впевненим у собі, оскільки ви змінюєте структуру, а не функціональність, ручний рефакторинг, безумовно, уповільнює вас, оскільки ви хочете переконатися, що не пропустили жодного біта. Так само, якби ви перекладали есе з Чикаго в оксфордський стиль (завжди гарна ідея). Ви не змінюєте семантику тексту, але змінюєте синтаксис, і в процесі розчісування ви можете виявити (а), що рефактор був непотрібним, або (б) інші речі, які вам потрібно очистити. Я вважаю, що це хороша вправа.
Paul d'Aoust


2

Спробуйте Web IDE від IntelliJ. Зараз він знаходиться на стадії EAP (альфа / бета), але я використовую його як єдину IDE протягом декількох місяців, тому він стабільний і дуже хороший.


Я також використовую PHPStorm, він має дуже базову підтримку рефакторингу: перейменувати / перемістити, ввести змінну, ввести константу, ввести константу, вбудоване, безпечне видалення.
Хуан Мендес,


1

Підтримка рефакторингу для PHP у Netbeans 6.5 відсутня, однак вона надійде в наступній версії.

Плагін PDT eclipse також не підтримує рефакторинг.

Aptana також не підтримує рефакторинг. Я також не міг отримати визначення goto для роботи.

Я в кінцевому підсумку використовую пошук і заміну в даний час. Я теж хотів би принаймні перейменувати підтримку функції.


1

Наскільки мені відомо, єдиними середовищами розробки, які мають будь-яку значну підтримку рефакторингу для PHP, є Zend Studio від виробників PHP та плагін Eclipse PHP. Хоча особливості дуже основні. Ніщо, про що я знаю, не має особливостей таких продуктів, як Resharper для C # тощо.


0

PDT для Eclipse підтримує деякі основні функції рефакторингу (про які я знаю). Ви можете перейменовувати класи і автоматично перейменовувати їх, коли на них посилаються, і я думаю, ви навіть можете переміщати файли та змінювати їх включення / вимагати посилань.


На той час, коли я писав це, я вважаю, що це було правдою щодо ФДТ.
Брайан Варшо,

Ні, наразі немає. Це головна слабкість PDT :( Але в деяких наступних випусках це буде.
gaRex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.