PhpStorm cuando el IDE realmente importa

Oh, me encantan los editores de texto rápidos y simples. Siendo un usuario de Linux, viví años en compañía de Kate y KWrite. Con algunos ajustes y complementos podría hacerlos realmente inteligentes. Escribí proyectos completos en Perl, Bash e incluso algo de PHP y Java en esos editores. Puedo apreciar todo el entusiasmo en torno a Sublime Text o TextMate, pero hoy no podría vivir sin un IDE completo..

La cultura

Observé que hay dos tipos de programadores. El primer tipo tiene una tendencia a usar aplicaciones que pueden ofrecer mayor y mayor productividad en la manipulación de código, pero a costa de la curva de aprendizaje abrupta y la dificultad de uso. Estos programadores son los que prefieren Vi (m) o Emacs..

La segunda categoría de programadores tiende a migrar de editores simples a IDE. Esto es tan natural de una evolución como la primera categoría. Sin embargo, conduce a una mentalidad diferente y una visión diferente del proyecto y el código. Soy un programador de esta categoría, por lo que en este artículo hablaremos sobre el IDE que utilizo en este momento: PhpStorm.

Las herramientas y las preferencias de usuario para las aplicaciones son tan volátiles que rara vez escribo sobre un marco o aplicación específica. Sin embargo, si usa una aplicación de 10 a 14 horas cada día, se convierte en parte de usted, parte de cómo ve su código, sus proyectos. Se convierte en la autopista para su flujo de trabajo diario. Así que merece ser mencionado y presentado..


Entonces, cual es la diferencia?

Solía ​​abrir un editor de texto rápido cuando necesitaba codificar solo un script o programa corto. Pero ya no lo hago. Las computadoras y los IDE de hoy son tan rápidos que hay poca diferencia entre iniciar PhpStorm y escribir el código o iniciar KWrite y escribir el código. La aplicación en sí es casi tan rápida como un editor, y crear un proyecto, incluso para uno o dos archivos reales, no es más lento que hacer las mismas creaciones de archivos en su editor..

OK, OK ... Estas son todas las similitudes. ¿Pero de qué se trata esta cosa IDE? IDE proviene del entorno de desarrollo integrado. Esta expresión tiene dos partes clave: integrado y entorno de desarrollo. La parte del entorno de desarrollo se puede ver como el editor y las características específicas para la manipulación del código fuente: funciones de escritura de código, resaltado, autocompletado, funciones de edición complejas como selección múltiple y edición múltiple, herramientas de refactorización, etc. La parte de integración se puede ver como una integración entre el entorno de desarrollo descrito anteriormente y varias herramientas externas, marcos de prueba, sistema de control de versiones de documentos, depuradores y herramientas de creación de interfaces de usuario..

La característica clave de un IDE es su comprensión del código que escribe. Un IDE no solo tiene una lista de comandos que puede usar en su idioma favorito, como PHP. Cuenta con algoritmos complejos para entender su código. PhpStorm no te sugerirá un comando o expresión que sea sintácticamente incorrecta. Sabe, por ejemplo, que no puedes escribir "imprimir ('Hola Mundo');"directamente dentro de una clase, sin ponerlo en una función. Así que no sugerirá"impresión()"cuando no se puede usar. Pero esto es solo la punta del iceberg. Veamos algunos ejemplos más concretos.


Uso de PhpStorm para la serie de tutoriales de códigos heredados de refactorización

Sí. Si has leído las dos primeras partes de la serie de códigos heredados de refactorización, The Golden Master y Magic Strings & Constants, es posible que hayas observado que en el tutorial se muestran capturas de pantalla con un IDE. Así es como se ve mi PhpStorm. Y lo siguiente es cómo PhpStorm me ayuda, cuando te enseña a programar.

Código resaltado

Esto es esencial. La mayoría de los editores simples también pueden hacer resaltado de código básico, pero un IDE es una historia diferente. Aquí puede tener diferentes configuraciones de resaltado para diferentes idiomas como PHP, HTML, CSS, etc. Cada uno con sus propias reglas. Por ejemplo, me gusta tener cadenas verdes en CSS y naranja en PHP y HTML.

A la izquierda, puede ver todos los tipos de archivos e idiomas compatibles (algunos pueden agregarse mediante complementos), en el centro puede ver los diversos elementos del lenguaje PHP que se pueden configurar por separado, en la parte superior derecha están las opciones de cada elemento Puede tener, y en la parte inferior hay una vista previa..

Cuando estábamos buscando cadenas mágicas en nuestra sesión de refactorización, pudimos detectar fácilmente estas cadenas simplemente encontrando cosas naranjas en la pantalla. Lo mismo es cierto para las constantes mágicas y los números. Cuando se buscaban, el color azul era nuestro amigo..

La estructura y el diseño son esenciales cuando necesitamos entender el código fuente, y en este asunto es esencial colorear y resaltar adecuadamente.

Resumen de herramientas de refactorización

He usado muchos IDE y editores a lo largo de mi carrera. El que realmente me gustó y aprecié fue NetBeans. Pero después de unos cinco años de uso exclusivo de NetBeans, tuve que renunciar a él. PhpStorm puede ofrecer algo que ningún otro editor o IDE para PHP puede ofrecer. Este es un conjunto de herramientas de refactorización que son tan necesarias en nuestro trabajo diario..

Resaltado, sangría, administración de proyectos, plantillas, macros son todas las características que se encuentran en la mayoría de los editores. Las integraciones con entornos de prueba y depuradores son, por definición, parte de cualquier IDE. Sin embargo, las herramientas de refactorización inteligentes y complejas son una historia totalmente diferente..

Como programadores, pasamos la mitad de nuestro tiempo leyendo el código, aproximadamente un 40% modificando y refactorizando el código existente y, si tenemos suerte, realmente la suerte, el 10% escribe un código totalmente nuevo. Por lo tanto, contar con funciones de refactorización buenas, rápidas y confiables nos ayudará a concentrar nuestros esfuerzos más en qué refactorizar y menos en cómo hacerlo. También ahorraremos tiempo, pero considero que la ganancia en menos esfuerzo es mucho más importante. Cuando puede descartar el pensamiento sobre el proceso en su IDE, y solo pensar en la lógica, algoritmo, dependencias, principios SÓLIDOS, es una ganancia en productividad lo que debe considerarse.

Esta es la razón por la que dejé NetBeans de código abierto y gratuito para el PhpStorm pagado. Hay, en PhpStorm, un conjunto de herramientas de refactorización que lo hacen especial, hace que valga la pena pagar..

Introducir variable local

Una de las refactorizaciones más simples con las que ya hemos trabajado en Magic Strings & Constants fue Introducir Local Variable, también conocida como "Extraer Variable". Aquí hay un recordatorio con los pasos que debemos seguir para usar esta refactorización:

  • Añadir una variable con el valor deseado..
  • Encuentra todos los usos del valor..
  • Reemplazar todos los usos con la variable.

Estos pasos son fáciles de seguir si tenemos un solo valor para transformar en una variable, pero ¿qué pasa con el paso dos? ¿Cómo encontrar de manera confiable todas las ocurrencias de ese valor? Necesita analizar su código y tomar decisiones conscientes sobre qué reemplazar y qué no. Aquí hay un ejemplo.

class SomeClass function printAPairOfPlayers () echo "Los jugadores son:"; echo "Nombre del jugador:". $ this-> getRandomPlayerName (); echo "Nombre del jugador:". $ this-> getRandomPlayerName ();  function printOnePlayer () echo "Nombre del jugador:". $ this-> getRandomPlayerName ();  function getRandomPlayerName () // Alguna lógica para encontrar los nombres de los jugadores // return $ playerName; 

En printAPairOfPlayers () podemos observar que la cuerda "Nombre del jugador: "se repite dos veces. Si queremos extraer esa cadena en una variable local, una variable dentro de la función, tendremos que reemplazar ambas apariciones en printAPairOfPlayers () pero no el de printOnePlayer (). Si printOnePlayer () Sería 100 líneas abajo, es posible que ni siquiera nos demos cuenta de que existe otra duplicación de la cadena en otro método..

Así que queremos una variable local. Primero creamos la variable, ejecutamos las pruebas, luego buscamos la cadena y la encontramos en la segunda eco declaraciones Lo reemplazamos, ejecutamos las pruebas, miramos de nuevo, lo encontramos en el último eco Enunciado, lo reemplazamos, ejecutamos las pruebas. Miramos de nuevo, llegamos al final del método. Decidimos que hemos terminado con nuestro extracto de refactorización variable local. Este es un proceso cognitivo bastante exigente, especialmente con código feo y no bien entendido.

¿No sería útil presionar un solo atajo, o seleccionar una opción en un menú contextual y hacer que todo esto sea hecho por el IDE? Sería increíble, y PhpStorm es capaz de hacerlo por ti..

En el código de arriba, simplemente coloca tu cursor dentro de "Nombre del jugador: "cadena en cualquier lugar y Botón derecho del ratón.

Después de seleccionar "Extraer variable ... ", PhpStorm analizará su código y buscará varias piezas de código que desee extraer. Propondrá dos posibilidades para nuestro caso.

Esta no es solo una característica interesante, sino una muy útil. Hay muchos casos en que la duplicación puede ocurrir fuera de su campo de visión. Cuando se propone una extracción, PhpStorm realiza el análisis a lo largo de todo el código, no solo las pocas líneas que puede ver en la pantalla. En este caso, las opciones son obvias. Para nuestro ejercicio, seleccionemos solo la parte de la cuerda, sin concatenación.

Ahora que se identificó el fragmento de código que queremos extraer, el siguiente paso es nombrarlo. "jugadorHeadersString"Parece un nombre de variable sensato. No tienes que poner"PS"delante del nombre en el campo de entrada. PhpStorm lo colocará en el código automáticamente. Otro aspecto importante es que hay una casilla de verificación. PhpStorm encontró todas las ocurrencias de nuestra variable. Seleccionamos extraer una variable local, por lo que PhpStorm supo buscar solo en el método actual y encontró solo dos apariciones. La misma cadena en el método printOnePlayer (), no fue contado, ni propuesto, y no será reemplazado. Eso llevaría a un código incorrecto, y PhpStorm es lo suficientemente inteligente como para no escribir un código no válido para usted.

Menos pruebas

Otra ventaja de PhpStorm es que no tiene que ejecutar sus pruebas a menudo. Cuando hicimos una refactorización manual, ejecutamos nuestras pruebas después de cada paso. Si hicimos un error tipográfico o reemplazamos algo que pensamos que era lo mismo, pero en realidad no lo era, necesitábamos una red de seguridad para decirnos rápidamente. Sin embargo, PhpStorm no reemplazará algo que no sea lógicamente correcto en el contexto. Es posible que se sorprenda de que un fragmento de código que también espera que se extraiga no lo esté, pero al menos puede estar seguro de que el código resultante será correcto. Además, tenemos menos pasos. Manualmente, hacemos un solo paso. Después de ese único paso, debemos ejecutar nuestras pruebas una sola vez..

No importa cómo lo veas, es más fácil, más rápido y mucho menos propenso a errores que cualquier otra forma de hacer la refactorización..

Clase de extracción de variable

Para extraer nuestra cadena en una variable de clase, también conocida como campo de clase, podemos usar el "Campo de extracto"opción de refactorización del mismo menú que arriba. Se nos pedirá que identifiquemos el fragmento de código que necesitamos extraer, y se nos presentará con una forma ligeramente diferente.

Además de su nombre, ahora tenemos tres ocurrencias encontradas. PhpStorm sabía que queríamos una variable de clase y era capaz de identificar la misma cadena donde se necesitaba. También tenemos opciones para inicializar la variable en varios lugares y establecer su visibilidad. Al seleccionar las opciones como en la imagen, el código resultante será el siguiente.

Por supuesto, si desea que sea público o que se inicie en el constructor, todo lo que necesita hacer es seleccionar las opciones apropiadas y dejar que PhpStorm haga el trabajo por usted..

Inicialización de variables dependientes del contexto

Cuando extrae una variable, desea inicializarla lo más cerca posible de su primer uso. En la mayoría de los casos, esto es simple, especialmente si hay un solo uso de la variable. Pero ¿qué pasa con los casos más complejos? Revisemos una de nuestras extracciones variables de Magic Strings & Constants.

En el rodar() Método, en la línea 73 - el seleccionado - hay un número "11". Es un número mágico que acabamos de identificar y queremos extraerlo..

Si hacemos nuestro método de extracción a mano, debemos seguir estos pasos:

  • Defina una variable justo arriba de esa línea con el valor 11.
  • Ejecuta las pruebas.
  • Cambia el valor con la variable..
  • Ejecuta las pruebas.
  • Busca otra ocurrencia del número 11..
  • Identifícalo en la línea 90..
  • Reemplace el valor con nuestra variable.
  • Rung las pruebas. Lo harán fallar.
  • Pregúntese dónde colocar la inicialización de la variable para que funcione y esté lo más cerca posible de su uso..
  • Mueve la inicialización de la variable un nivel hacia arriba..
  • Ejecutar las pruebas. Siguen fallando.
  • Mueva la inicialización de la variable un nivel más hacia arriba, fuera de todas las sentencias if.
  • Ejecutar las pruebas. Finalmente están pasando.
  • Buscas otras ocurrencias..
  • No encontrar mas Estás listo.

Ahora, eso es complicado para un humano. Y es propenso a errores. Suponemos que tiene pruebas que pueden ayudarlo, pero ¿qué sucede si está trabajando en un código desconocido que no se puede probar? PhpStorm entenderá el contexto de su código. Extraerá correctamente la variable para todas las ocurrencias y la pondrá exactamente donde debería estar.

El iceberg bajo la punta

Lo que presentamos anteriormente sobre las herramientas de refactorización es solo la punta del iceberg. Extraer variables es probablemente la refactorización más simple y fácil que puedes hacer. Todavía no utilizamos el método de extracción ni la subclase de extracción, ni siquiera algunos cambios de nombre más complejos en nuestras lecciones de refactorización, pero lo haremos. Aprenderemos cómo hacerlo a mano, pero lo alentaré a usar un IDE inteligente para hacer el trabajo por usted..

Cambio de nombre

PhpStorm es muy bueno para renombrar variables o métodos incluso en cientos de clases. Imagine lo difícil que sería cambiar el nombre de un método público utilizado en 100 clases diferentes en su proyecto. PhpStorm puede hacer que un trabajo de cinco minutos en lugar de un trabajo de dos horas. Puede encontrar y cambiar el nombre de todos los métodos, y solo tendrá que verificar si hay errores de coincidencia antes de indicarle que actúe.. 

Sí, sí ... Necesitará verificar algunas de las incidencias encontradas, ya que PHP es un lenguaje de tipo dinámico y, en algunos casos, PhpStorm, o cualquier otro algoritmo de IDE, o programa, puede saber qué tipo de objeto es. utilizado para esa llamada de método específico. Imagínate, tienes dos clases totalmente diferentes. En cada uno de ellos, tienes un método público llamado "encuentra todos()". Esto es muy común y correcto. 

¿Por qué necesitamos evaluar los cambios??

Ahora, hay 50 clases usando tu primera clase y otras 50 usando la segunda. Si usó interfaces adecuadas y sugerencias de tipo donde sea posible, PhpStorm propondrá las clases correctas para cambiar. Pero si no especificó el tipo que usa, o si no usó ninguna interfaz implementada por su clase con el encuentra todos() método, no hay forma de saber automáticamente cuál de sus dos clases, ambas tienen un encuentra todos() Método, se utilizará. Esa es la esencia de la tipificación dinámica de PHP. Pero si bien esto es una ventaja en algunos casos, es una desventaja cuando necesitamos hacer una refactorización como esta. Cuando esto sucede, lo único que se puede hacer es que un humano evalúe la necesidad del cambio..

Con todo esto, aunque hay otras refactorizaciones presentes en PhpStorm, ya es el mejor IDE solo con refactorizaciones. El cambio de nombre, la extracción y la incorporación de variables, la extracción y los métodos de incorporación son las refactorizaciones más utilizadas cada día. Si estos funcionan bien, tenemos un IDE ganador..

Pero PhpStorm no se detiene aquí. Tiene muchas otras herramientas de refactorización que te hacen sentir bien en situaciones difíciles. Realmente tiene eso "cereza en la parte superior"sentimiento.


Pruebas y cobertura de código

Usted hace TDD, ¿verdad? Si no lo haces, deberías. La prueba es tan esencial para la programación como escribir el propio código de producción. No podría imaginar mi vida sin TDD. Me he acostumbrado tanto en los últimos años, que incluso pensar en el código sin pensar en las pruebas resulta antinatural y difícil..

Pruebas e IDE

Con las pruebas, su proceso y herramientas deben ser tan buenos como el propio código de producción. PhpStorm tiene una gran integración con PHPUnit. Es el único IDE de PHP que conozco que en realidad se vincula directamente al marco PHPUnit, lo amplía y lo usa para recopilar toda la información que se necesita presentar. Esto le da una conexión mucho más íntima con PHPUnit, una mejor salida para el usuario y velocidades de ejecución de prueba mucho más altas.

Otros IDE tienden a usar el ejecutable PHPUnit, escribir la salida en un archivo XML e interpretar los resultados para mostrarlos. Así es como funciona NetBeans. Este enfoque ofrece una mayor flexibilidad para usted, el usuario, si desea piratear el sistema y convencerlo de que realice las pruebas de forma inusual (por ejemplo, a través de telnet o SSH). Pero esto también tiene una gran desventaja. Las cosas se vuelven lentas. En primer lugar, un proceso de shell debe ser bifurcado. "exec ()"es siempre un importante consumidor de tiempo. Entonces, el resultado debe escribirse en un archivo, posiblemente en una máquina remota. 

Todos sabemos que el sistema de archivos es lento, muy lento. Los SSD lo están mejorando un poco, pero aún están a años luz de la velocidad de la memoria RAM. Luego, si ejecutamos nuestras pruebas de forma remota, debemos copiar ese archivo en nuestra máquina. Por lo tanto, no solo debemos golpear el sistema de archivos una vez, sino que también debemos agregar a ese tiempo, el costo de la comunicación de la red, además de escribirlo en un archivo local. Luego, el archivo debe leerse para que finalmente se muestre al usuario..

Si bien esa es una solución super personalizable y flexible, solo toma tiempo. Demasiado tiempo cuando pensamos en pruebas de unidad y pruebas de milisegundos. Y las pruebas unitarias que tardan más de cinco milisegundos en ejecutarse ya no son pruebas unitarias.

PhpStorm utiliza PHPUnit internamente

PhpStorm resuelve, o al menos reduce, la sobrecarga mediante el uso de PHPUnit internamente y le indica que genere el resultado en la forma preferida por PhpStorm. Esto reduce la flexibilidad. No puedes hackearlo para probar fuera de sus límites. Pero, aumenta la velocidad mucho. No más exec, No hay más archivos escritos en sistemas de archivos lentos. La ejecución remota puede agregar el precio de la comunicación de red, pero no podemos eliminar eso de todos modos. Otra buena ventaja es que el uso directo de PHPUnit permite presentar información más detallada sobre las pruebas fallidas de una manera más organizada. Por lo tanto, ganamos en velocidad, detalles y claridad a costa de la flexibilidad..

Al estar acostumbrado a NetBeans, al principio me resultó difícil aceptar esta inflexibilidad, pero al final del día, incluso si a veces tengo que ejecutar un script externo para probar mi código en máquinas remotas, las ventajas de la mejor integración de PHPUnit están prevaleciendo.


Organizar y buscar archivos

Como la mayoría de los IDE, Phpstorm también está orientada a proyectos. Por lo general, en un proyecto puede tener archivos de origen y pruebas. Como PhpStorm funciona, requiere que especifique una sola carpeta como la carpeta para las pruebas. Me resulta bastante útil tener la misma estructura de directorio entre el código fuente y el código de prueba. Esto también ayuda a PhpStorm a encontrar sus pruebas más fácilmente y le permite cambiar entre el código de producción y las pruebas con un solo atajo.

Pero eso no es todo. Cuando se trata de encontrar y abrir archivos, hay una característica única en PhpStorm: Ir a Todo (o Buscar todo) - Me encanta éste. En primer lugar, su atajo de teclado predeterminado Mayús + Mayús (Doble turno) es tan natural de usar, en segundo lugar, es la función de navegación más útil. Se introdujo recientemente, y antes de eso, teníamos cuadros de navegación y accesos directos separados para abrir archivo por nombre, abrir archivo por nombre de clase, abrir documento que contiene el símbolo (variable o nombre del método) y así sucesivamente. Ahora solo puedo hacer doble turno y empezar a escribir. Es increible y rapido.


Pensamientos finales

Hay tantas características interesantes en los IDE de hoy que podríamos continuar con esta historia para otros tres tutoriales y aún no contarlos todos. Pero tenemos que parar en algún momento. Así que como gran finalizador de nuestra mini-maratón de funciones de PHPUnit dentro de PhpStorm, aquí hay algunas últimas que mis colegas y yo en Syneto apreciamos:

  • Plantillas en vivo - Son excelentes para escribir repetitivo para ti. Por ejemplo, cuando escribo estos tutoriales en HTML, necesito respetar un conjunto específico de etiquetas y formatos. Tengo pequeñas plantillas agradables que pueden escribir eso para mí, por lo que el tiempo dedicado a agregar una imagen al tutorial, por ejemplo, se reduce a aproximadamente el tiempo que toma presionar las teclas, en lugar de escribir la sintaxis y el estilo de toda la imagen..
  • Gestión de proyectos - Esto es bastante común en los IDEs. Todos tus archivos están organizados en proyectos. Pero los programadores de JetBrains hicieron algo muy sorprendente. Su motor de indexación es rápido como el infierno. Ningún otro IDE podría cargar nuestro gran proyecto en Syneto tan rápido y luego buscarlo tan rápido. De hecho, los IDE como NetBeans o Eclipse y sus derivados en su mayoría no lograron indexar todo el proyecto. Eso hizo que la búsqueda fuera muy lenta. PhpStorm hace esto correctamente y las cosas son rápidas en comparación con cualquier otro IDE.
  • Integración de versiones de documentos - Es otra joya en la bolsa. Mercurial, Git, CVS, Subversion, lo que sea. PhpStorm se siente como en casa con todos ellos. Desde la selección selectiva y el empuje a través de la fusión avanzada, con una gran herramienta de fusión y fusión, hasta la representación gráfica de la rama, usted tiene todo lo que necesita. Desde que uso PhpStorm, usé la CLI para emitir un "hg"comando probablemente dos veces más o menos. Es sólo trabajos.
  • Macros - Son útiles para esas pequeñas tareas repetitivas molestas que tienes que hacer. En PHP, cada línea debe terminar con un punto y coma. ¿Con qué frecuencia está su cursor al final de la línea cuando termina de escribir todo el código en ella? Muy raramente La mayoría de las veces, estás dentro de algunos paréntesis rellenando parámetros o similares. Tienes que ir al final de la línea y golpear ";". Bueno, eso es fácilmente automatizable por macros.

OK, basta de hablar. Ahora te dejaré ir, descargar y probar PhpStorm tú mismo. Que te diviertas.