Статьи

PhpStorm: когда IDE действительно имеет значение

О, я люблю быстрые и простые текстовые редакторы. Будучи пользователем Linux, я годами жил в компании Kate и KWrite. С некоторыми настройками и плагинами я мог бы сделать их действительно умными. Я написал целые проекты на Perl, Bash и даже немного PHP и Java в этих редакторах. Я могу оценить весь энтузиазм, связанный с Sublime Text или TextMate, но я не смог бы сегодня жить без полноценной IDE.

Я заметил, что есть два вида программистов. Первый тип имеет тенденцию использовать приложения, которые могут предложить все большую и большую производительность манипулирования кодом, но за счет резкой кривой обучения и сложности в использовании. Эти программисты предпочитают Vi (m) или Emacs.

Вторая категория программистов склонна переходить от простых редакторов к IDE. Это так же естественно для эволюции, как и первая категория. Однако это приводит к другому мышлению и другому взгляду на проект и код. Я программист из этой категории, поэтому в этой статье мы поговорим о IDE, которую я использую сейчас: PhpStorm .

Инструменты и пользовательские настройки приложений настолько изменчивы, что я редко пишу о конкретной среде или приложении. Однако, если вы используете приложение 10-14 часов каждый день, оно становится частью вас, частью того, как вы видите свой код, свои проекты. Это становится шоссе для вашего повседневного рабочего процесса. Так что это заслуживает упоминания и представления.


Я использовал быстрый текстовый редактор, когда мне нужно было написать только короткий скрипт или программу. Но я больше не Современные компьютеры и IDE настолько быстры, что нет никакой разницы между запуском PhpStorm и написанием кода или запуском KWrite и написанием кода. Само приложение почти так же быстро, как редактор, и создание проекта, даже для одного или двух реальных файлов, не медленнее, чем создание тех же файлов в вашем редакторе.

Хорошо, хорошо … Это все сходство. Но что это за штука IDE? IDE происходит из интегрированной среды разработки. Это выражение состоит из двух ключевых частей: интегрированная среда и среда разработки . Часть среды разработки может рассматриваться как редактор и специфические функции для манипулирования исходным кодом: функции написания кода, выделения, автозаполнения, сложные функции редактирования, такие как множественный выбор и мультиредактирование, инструменты рефакторинга и так далее. Интеграционную часть можно рассматривать как интеграцию между средой разработки, описанной выше, и различными внешними инструментами, средами тестирования, системой контроля версий документов, отладчиками и инструментами построителя пользовательского интерфейса.

Ключевой особенностью IDE является понимание написанного вами кода. В среде IDE есть не только список команд, которые вы можете использовать на своем любимом языке, например PHP. Он имеет сложные алгоритмы, чтобы понять ваш код. PhpStorm не будет предлагать вам команду или выражение, которое будет синтаксически неверным. Он знает, например, что вы не можете написать « print('Hello World'); » непосредственно внутри класса, не помещая его в функцию. Поэтому он не будет предлагать команду « print() », когда ее нельзя использовать. Но это только верхушка айсберга. Давайте посмотрим еще несколько конкретных примеров.


Да. Если вы читали первые две части серии Refactoring Legacy Code, «Золотой мастер» и « Магические строки и константы» , вы, возможно, заметили, что в учебном пособии есть скриншоты с IDE. Вот так выглядит мой PhpStorm. И вот как PhpStorm помогает мне при обучении программированию.

Это важно Большинство простых редакторов также могут выполнять подсветку основного кода, но IDE — это другая история. Здесь вы можете иметь различные настройки подсветки для разных языков, таких как PHP, HTML, CSS и так далее. У каждого свои правила. Например, мне нравится иметь строки зеленого цвета в CSS и оранжевого цвета в PHP и HTML.

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

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

Структура и макет очень важны, когда нам нужно понять исходный код, а правильная раскраска и выделение необходимы в этом вопросе.

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

Подсветка, отступы, управление проектами, шаблоны, макросы — все это есть в большинстве редакторов. Интеграция со средами тестирования и отладчиками по определению является частью любой IDE. Однако умные и сложные инструменты рефакторинга — это совсем другая история.

Как программисты, мы тратим половину нашего времени на чтение кода, около 40% — на изменение и рефакторинг существующего кода, и, если нам повезет, действительно повезет, на 10% написание совершенно нового кода. Таким образом, наличие хороших, быстрых и надежных функций рефакторинга поможет нам сконцентрировать наши усилия на том, что нужно провести рефакторинг, и меньше на том, как это сделать. Мы также сэкономим время, но я считаю, что выигрыш в меньших усилиях гораздо важнее. Когда вы можете отбросить мысль о процессе в вашу среду IDE и думать только о логике, алгоритме, зависимостях, принципах SOLID, необходимо учитывать повышение производительности.

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

Одним из самых простых рефакторингов, с которыми мы уже работали в Magic Strings & Constants, было введение локальной переменной, также известной как «Извлечь переменную». Вот напоминание с шагами, которые мы должны предпринять, чтобы использовать этот рефакторинг:

  • Добавьте переменную с желаемым значением.
  • Найти все использования значения.
  • Замените все использования переменной.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
class SomeClass {
 
    function printAPairOfPlayers() {
        echo «Players are:»;
 
        echo «Player name: » .
        echo «Player name: » .
    }
 
    function printOnePlayer() {
        echo «Player name: » .
    }
 
    function getRandomPlayerName() {
        // Some logic to find player names //
        return $playerName;
    }
 
}

В printAPairOfPlayers() мы можем наблюдать, что строка « Player name: » повторяется дважды. Если мы хотим извлечь эту строку в локальную переменную, переменную внутри функции, нам нужно заменить оба вхождения в printAPairOfPlayers() но не в printOnePlayer() . Если printOnePlayer() будет на 100 строк ниже, мы можем даже не осознавать, что есть другое дублирование строки в другом методе.

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

Разве не было бы полезно нажать один ярлык или выбрать опцию в контекстном меню и сделать все это в IDE? Это было бы замечательно, и PhpStorm вполне способен сделать это для вас.

В приведенном выше коде просто поместите курсор в строку « Имя игрока: » в любом месте и щелкните правой кнопкой мыши .

Выбрав « Извлечь переменную … », PhpStorm проанализирует ваш код и произведет поиск различных фрагментов кода, которые вы можете извлечь. Это предложит две возможности для нашего случая.

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

Теперь, когда фрагмент кода, который мы хотим извлечь, был идентифицирован, следующим шагом будет присвоить ему имя. » playerHeadersString » кажется разумным именем переменной. Вам не нужно ставить « $ » перед именем в поле ввода. PhpStorm автоматически добавит его в код. Другим важным аспектом является наличие флажка. PhpStorm нашел все вхождения для нашей переменной. Мы решили извлечь локальную переменную, поэтому PhpStorm знал, что искать нужно только в текущем методе, и он нашел только два вхождения. Та же строка в методе printOnePlayer(), не была подсчитана и не предложена, и она не будет заменена. Это может привести к неправильному коду, и PhpStorm достаточно умен, чтобы не писать для вас неверный код.

Еще одним преимуществом PhpStorm является то, что вам не нужно часто запускать тесты. Когда мы выполняли рефакторинг вручную, мы запускаем наши тесты после каждого шага. Если мы сделали опечатку или заменили что-то, что, по нашему мнению, было таким же, но на самом деле это не так, нам нужна была бы сеть безопасности, чтобы быстро сказать нам об этом. Однако PhpStorm не заменит то, что не является логически правильным в контексте. Вы можете быть удивлены тем, что часть кода, которую вы также ожидали извлечь, не будет, но по крайней мере вы можете быть уверены, что полученный код будет правильным. Плюс у нас меньше шагов. Вручную мы делаем только один шаг. После этого единственного шага нам нужно запустить наши тесты один раз.

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

Чтобы извлечь нашу строку в переменную класса — также известную как поле класса — мы можем использовать опцию рефакторинга « Извлечь поле » из того же меню, что и выше. Нас попросят идентифицировать фрагмент кода, который нам нужно извлечь, и нам будет представлена ​​немного другая форма.

Помимо его названия, у нас теперь есть три найденных случая. PhpStorm знал, что нам нужна переменная класса, и он мог идентифицировать ту же строку, где это необходимо. У нас также есть опции для инициализации переменной в разных местах и ​​установки ее видимости. При выборе параметров, как на изображении, полученный код будет таким, как показано ниже.

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

Когда вы извлекаете переменную, вы хотите инициализировать ее как можно ближе к ее первому использованию. В большинстве случаев это просто, особенно если переменная используется один раз. Но как насчет более сложных случаев? Давайте вернемся к одному из наших переменных извлечения из Magic Strings & Constants .

В методе roll() в строке 73 — выбранной — есть число « 11 ». Это магическое число, которое мы только что определили, и мы хотим извлечь его.

Если мы делаем наш метод извлечения вручную, нам нужно выполнить следующие шаги:

  • Определите переменную чуть выше этой строки со значением 11.
  • Запустите тесты.
  • Обменяйте значение с переменной.
  • Запустите тесты.
  • Ищите другое вхождение числа 11.
  • Определите это в строке 90.
  • Замените значение нашей переменной.
  • Провела тесты. Они потерпят неудачу .
  • Спросите себя, куда поместить инициализацию переменной, чтобы она работала и при этом была максимально приближена к ее использованию.
  • Переместите инициализацию переменной на один уровень вверх.
  • Запустите тесты. Они все еще терпят неудачу.
  • Переместите инициализацию переменной еще на один уровень выше всех операторов if.
  • Запустите тесты. Они наконец проходят.
  • Вы ищете другие случаи.
  • Не найти больше Вы сделали.

Это сложно для человека. И это подвержено ошибкам. Мы предположили, что у вас есть тесты, которые могут вам помочь, но что, если вы работаете над неясным непроверяемым кодом? PhpStorm поймет контекст вашего кода. Он правильно извлечет переменную для всех вхождений и поместит ее именно там, где и должна быть.

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

PhpStorm очень хорошо переименовывает переменные или методы даже в сотнях классов. Представьте, как трудно было бы изменить имя публичного метода, используемого в 100 различных классах в вашем проекте. PhpStorm может сделать это пятиминутной работой вместо двухчасовой работы. Он может найти и изменить имя всех методов, и вам нужно будет только проверить наличие совпадений, прежде чем вы скажете ему действовать.

Да, да … Вам нужно будет проверить некоторые найденные случаи, потому что PHP является динамически типизированным языком, а в некоторых случаях просто нет способа, которым PhpStorm, или любой другой алгоритм или программа IDE, могут узнать, какой тип Объект используется для этого конкретного вызова метода. Представьте, у вас есть два совершенно разных класса. На каждом из них у вас есть открытый метод с именем » findAll() «. Это очень распространено и правильно.

Теперь есть 50 классов, использующих ваш первый класс, и еще 50 классов, использующих второй. Если вы использовали надлежащие интерфейсы и подсказывали тип, где это возможно, PhpStorm предложит правильные классы для изменения. Но если вы не указали используемый вами тип или не использовали интерфейс, реализованный вашим классом с помощью метода findAll() , невозможно автоматически определить, какой из двух ваших классов имеет findAll() , будет использовано. В этом суть динамической типизации PHP. Но хотя в некоторых случаях это является преимуществом, недостатком является то, что нам нужно проводить рефакторинг, как это. Когда это происходит, единственное, что можно сделать, — это чтобы человек оценил необходимость изменений.

При этом, несмотря на то, что в PhpStorm присутствуют другие рефакторинги, это уже лучшая IDE только с рефакторингами. Переименование, извлечение и встраивание переменных, методы извлечения и встраивания — это наиболее часто используемые рефакторинги, которые мы проводим каждый день. Если они работают отлично, у нас есть победившая IDE.

Но PhpStorm не останавливается на достигнутом. В нем много других инструментов рефакторинга, которые помогут вам чувствовать себя хорошо в сложных ситуациях. Это действительно чувство » вишня на вершине «.


Вы делаете TDD, верно? Если вы этого не сделаете, вы должны. Тестирование так же важно для программирования, как и написание самого производственного кода. Я не мог представить свою жизнь без TDD. За последние несколько лет я так привык к этому, что даже думать о коде, не думая о тестах, кажется неестественным и трудным.

При тестировании ваш процесс и инструменты должны быть такими же хорошими, как и сам производственный код. PhpStorm имеет отличную интеграцию с PHPUnit. Это единственная PHP IDE, о которой я знаю, которая на самом деле связана непосредственно с платформой PHPUnit, расширяет ее и использует для сбора всей информации, которая должна быть представлена. Это дает ему гораздо более тесную связь с PHPUnit, лучший вывод для пользователя и намного более высокую скорость выполнения теста.

Другие IDE, как правило, просто используют исполняемый файл PHPUnit, записывают вывод в файл XML и интерпретируют результаты, чтобы показать его вам. Вот как работает NetBeans. Этот подход обеспечивает большую гибкость для вас, пользователя, если вы хотите взломать систему и убедить ее запустить ваши тесты необычными способами (например, через telnet или SSH). Но это также имеет огромный недостаток. Вещи становятся медленными. Прежде всего, процесс оболочки должен быть разветвленным. » exec() » всегда является важным потребителем времени. Затем результат должен быть записан в файл, возможно, на удаленной машине.

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

Хотя это супер настраиваемое и гибкое решение, оно просто требует времени. Слишком много времени, когда мы думаем о юнит-тестах и ​​миллисекундных тестах. И модульные тесты, для запуска которых требуется больше пяти миллисекунд, больше не являются модульными тестами.

PhpStorm решает или, по крайней мере, уменьшает накладные расходы, используя PHPUnit для внутреннего использования и приказывая выводить результат способом, предпочтительным для PhpStorm. Это снижает гибкость. Вы не можете взломать его, чтобы проверить за его пределами. Но это сильно увеличивает скорость. Больше нет exec , больше нет файлов, записанных в медленные файловые системы. Удаленное выполнение может добавить стоимость сетевого взаимодействия, но мы все равно не можем устранить это. Еще одним приятным преимуществом является то, что непосредственное использование PHPUnit позволяет более детально представить более подробную информацию о неудачных тестах. Таким образом, мы выигрываем в скорости, деталях и четкости за счет гибкости.

Привыкнув к NetBeans, поначалу мне было трудно принять эту негибкость, но в конце концов, даже если иногда мне приходится запускать внешний сценарий для проверки кода на удаленных компьютерах, выигрывают от лучшей интеграции PHPUnit. преобладают.


Как и большинство IDE, Phpstorm также ориентирован на проекты. Обычно в проекте вы можете иметь исходные файлы и тесты. Поскольку PhpStorm работает, требуется указать одну папку в качестве папки для тестов. Я считаю весьма полезным иметь одинаковую структуру каталогов между исходным кодом и тестовым кодом. Это также помогает PhpStorm легче находить ваши тесты и позволяет переключаться между рабочим кодом и тестами с помощью одного ярлыка.

Но это еще не все. Когда дело доходит до поиска и открытия файлов, в PhpStorm есть уникальная функция: «Перейти ко всему (или искать все )» — мне это очень нравится. Во-первых, использование по умолчанию сочетания клавиш Shift + Shift (двойное смещение) является настолько естественным в использовании, во-вторых, это наиболее полезная функция навигации. Это было только недавно введено, и перед этим у нас были отдельные навигационные блоки и ярлыки для открытого файла по имени , открытого файла по имени класса , открытого файла, содержащего символ (имя переменной или метода) и так далее. Теперь я могу просто сдвинуть смещение и начать печатать. Это удивительно и быстро.


В сегодняшних средах разработки есть так много интересных функций, что мы могли бы продолжить эту историю еще в трех уроках и все же не рассказать обо всем этом. Но мы должны остановиться в какой-то момент. Так что, как отличный финишер для нашего мини-марафона функций PHPUnit в PhpStorm, вот несколько последних, которые ценят мои коллеги и я в Syneto:

  • Живые шаблоны — они отлично подходят для написания шаблонов для вас. Например, когда я пишу эти учебники в HTML, мне нужно соблюдать определенный набор тегов и форматирования. У меня есть хорошие маленькие шаблоны, которые могут написать это для меня, поэтому время, потраченное на добавление изображения в учебное пособие, например, сокращается примерно до времени, которое требуется для нажатия клавиш, вместо написания всего синтаксиса и стиля изображения.
  • Управление проектами — это довольно часто встречается в IDE. Все ваши файлы организованы в проекты. Но программисты в JetBrains сделали что-то очень удивительное. Их движок индексации быстрый, как ад. Никакая другая IDE не смогла бы загрузить наш огромный проект в Syneto так быстро, а потом искать в нем так быстро. Фактически, IDE, такие как NetBeans или Eclipse и их производные, в основном не смогли проиндексировать весь проект. Это сделало поиск очень медленным. PhpStorm делает это правильно, и все быстро по сравнению с любой другой IDE.
  • Интеграция версий документов — это еще одна жемчужина в сумке. Mercurial, Git, CVS, Subversion, вы называете это. PhpStorm чувствует себя как дома со всеми ними. От выборочной фиксации и проталкивания до расширенного слияния, с отличным инструментом сравнения и слияния, до графического ветвления — у вас есть все, что вам нужно. Поскольку я использую PhpStorm, я использовал CLI для выдачи команды « hg », вероятно, дважды или около того. Это просто работает.
  • Макросы — полезны для тех крошечных раздражающих повторяющихся задач, которые вам приходится делать. В PHP каждая строка должна заканчиваться точкой с запятой. Как часто ваш курсор находится в конце строки, когда вы заканчиваете писать весь код в нем? Очень редко. В большинстве случаев вы находитесь в скобках, заполняющих параметры или аналогичные. Вы должны пойти до конца строки и нажать « ; ». Ну, это легко автоматизируется с помощью макросов.

ОК, хватит разговоров. Теперь я позволю вам пойти, скачать и попробовать PhpStorm самостоятельно. Веселиться.