Todo el poder de IntelliJ IDEA en el ejemplo de un idioma (en imágenes)

El modelo de desarrollo clásico para cualquier aplicación implica una buena documentación sobre la interfaz de usuario y la API, así como, si es necesario, una buena cobertura del código fuente con comentarios. En este caso, la finalización del sistema comienza con un estudio de la documentación, luego el código se cambia directamente y, finalmente, se actualiza toda la información necesaria.

Sin embargo, uno de los problemas con este enfoque es que aumenta significativamente el costo y ralentiza el proceso de desarrollo. ¿Qué pasa si todo esto no es? Luego, el IDE viene al rescate, gracias al cual puede estudiar la lógica actual utilizando código simple.

Cuando desarrollamos la plataforma lsFusion con un lenguaje incrustado, teníamos varias opciones. Reinvente la rueda y escriba desde cero su propio IDE, como lo hizo 1C al mismo tiempo, o implemente un complemento para uno existente. Fuimos por el segundo camino, y en este artículo mostraré lo que sucedió.

Como la plataforma en sí se desarrolló en Java, teníamos dos opciones principales: Eclipse o IDEA. Nos decidimos por la última opción y no fallamos. Cuando tomamos la decisión, IDEA todavía no era lo suficientemente popular, pero desde entonces, han emergido como líderes en el mercado, y Eclipse está silenciosamente detrás.

No llevó mucho tiempo desarrollar el complemento en sí, ya que fue posible utilizar el código utilizado directamente durante la ejecución de la plataforma de muchas maneras. Por lo tanto, con un esfuerzo mínimo, obtuvimos un IDE muy potente, en muchos aspectos significativamente superior en funcionalidad al IDE de muchas otras plataformas ERP (tanto nativas como basadas en Eclipse).

El papel del IDE en el desarrollo es difícil de sobreestimar. A pesar del hecho de que muchos desarrolladores todavía usan vim y creen que debería serlo. Esta posición tiene derecho a la vida si una persona se desarrolla y respalda aún más este código. Sin embargo, en proyectos más grandes donde una gran cantidad de personas están involucradas, su intercambiabilidad es muy importante. Los empleados se enferman, se van de vacaciones, se van al final. Además, la carga en diferentes proyectos es desigual y, a veces, es necesario conectar a más personas con uno de ellos para cumplir con los plazos. En esos momentos, debe conectar a nuevas personas con las mejoras, que necesitan descubrir rápidamente cómo funciona el programa actualmente y realizar los cambios necesarios. Y aquí viene el IDE.

En primer lugar, necesitábamos lo siguiente del IDE:

  • Soporte de sintaxis . Resaltado de palabras clave, sustitución automática, resaltado de errores.
  • La navegación Vaya al anuncio, busque usos, busque por cadena de texto, archivo o nombre, etc.
  • Análisis La jerarquía de clases y llamadas, así como las propiedades y acciones de la clase.
  • Refactorización Renombrar clases, propiedades y acciones.
  • Visualización de formas . Para mostrar al desarrollador del diseño actual de una determinada forma.
  • Metaprogramación La capacidad de generar código basado en metacódigo sobre la marcha .
  • Depurador La capacidad de establecer puntos de interrupción (incluidas las condiciones), depurar la lógica imperativa, ver relojes.
  • Inyección de lenguaje . Navegación, refactorización, sustitución automática y resaltado de sintaxis de lsFusion cuando se usa en otros idiomas: Java y JasperReports XML.

Como utilizamos el esquema estándar integrado en IDEA para el complemento, el resultado de trabajar con lógica en lsFusion resultó ser casi idéntico al desarrollo en Java. Los mismos elementos de menú, teclas de acceso rápido, depuración transparente, que puede cambiar de código lsFusion a Java y viceversa, y así sucesivamente.

Aquí hay algunos ejemplos simples para mostrar cómo funciona esto en la práctica.

Soporte de sintaxis


El complemento puede sustituir palabras clave válidas, posibles propiedades, detectar automáticamente varios errores:

imagen

La navegación


Tome la lógica del ejemplo de Gestión de materiales . Supongamos que necesitamos ver dónde se declara la propiedad Price. Para hacer esto, debe colocar el puntero del mouse sobre el encabezado de la columna que necesitamos como usuario con derechos de administrador:

imagen

En la ventana que aparece, puede ver de inmediato en qué módulo se crea esta propiedad (envío), qué número de fila contiene (37), la tabla en la que está almacenada (_auto_Shipment_ShipmentDetail) y otra cantidad de información.

Para ir directamente a la declaración de propiedad, debe iniciar la búsqueda de archivos e ingresar Envío en el cuadro de diálogo que aparece:

imagen

imagen

Luego, usando Navigate - Line / Column, vaya a la línea 37, donde vemos la declaración de propiedad:

imagen

Al presionar CTRL + ALT + F7, mientras el cursor se encuentra en la propiedad deseada, puede encontrar rápidamente todos sus usos para todos los proyectos:

imagen

En este caso, el primer uso del precio es calcular la cantidad por línea. Los dos últimos se agregan a los formularios apropiados.

Si es necesario, puede habilitar la búsqueda solo por registro en esta propiedad, si elimina la opción correspondiente:

imagen

Entonces solo la entrada en esta propiedad permanecerá en la lista. Para averiguar qué valor específico está escrito en él, debe pasar el cursor sobre precio de venta y hacer clic en Ir a declaración o usos. A continuación, regrese a Navigation - Back y vaya a la declaración de la propiedad del elemento:

imagen

Para resumir, encontramos dónde se declaró esta propiedad que necesitábamos, en qué casos se usa y cuándo va la grabación allí. En el video, hice todas las acciones con el mouse, aunque, por supuesto, en la práctica, solo se usa el teclado. Esta técnica le permite determinar rápidamente la lógica del sistema implementado actual y realizar cambios en ella, teniendo una comprensión completa de lo que esto conducirá.

Refactorización


A menudo hay situaciones en las que necesita cambiar el nombre de una propiedad, clase, formulario o cualquier otro elemento del sistema. Para llevar a cabo tal acción, debe pararse en este elemento y hacer clic en Refactorizar - Cambiar nombre:

imagen

Cambiar el nombre de un elemento cambia automáticamente el código fuente en todos los lugares de su uso. Además, si se crea el archivo migration.script, las entradas correspondientes se agregarán allí. El servidor necesita conocer los cambios de nombre para, por ejemplo, migrar automáticamente los datos de una columna a otra. De lo contrario, es imposible distinguir el cambio de nombre de la creación de una nueva propiedad con un nombre diferente.

Análisis


Antes de realizar la refactorización, a menudo es necesario averiguar "qué está sucediendo" y "quiénes son todas estas personas".

Para hacer esto, IDEA, casi listo para usar, le permite ver la estructura de la clase seleccionada (propiedades y acciones disponibles para esta clase):



Además, si necesita obtener una imagen general de lo que está sucediendo, IDEA le permite construir varias jerarquías:

  • herencia de la clase seleccionada
  • Usos del elemento seleccionado (por ejemplo, propiedades o formularios)



IDEA proporciona todas las funciones principales automáticamente (con gestos mínimos) después de implementar los anuncios de los motores de búsqueda. El siguiente conjunto de características hizo que el complemento jugara un poco más, pero IDEA proporcionó una parte importante de la infraestructura (no sin problemas, por supuesto, pero más sobre eso más adelante).

Visualización de formularios


En lsFusion, la estructura y el diseño de los formularios se configuran en el mismo código que la lógica del dominio utilizando construcciones especiales. Además, se pueden declarar diferentes partes del formulario en diferentes módulos, y cuando se inicia el servidor, se "fusionarán", dependiendo de los módulos conectados.

Para ver el diseño resultante, puede, por supuesto, reiniciar el servidor y ver el resultado en el cliente. Pero el reinicio del servidor lleva algo de tiempo. Un complemento puede:

  • Muestra el diseño actual y la estructura jerárquica del formulario en una ventana especial.
  • Encuentra elementos en la estructura de formas
  • Resalte el elemento de forma seleccionado en el diseño

Así es como se ve en el IDE:

imagen

Al crear un formulario, solo se tienen en cuenta el módulo activo actual y todo lo que depende.

Todavía no es posible cambiar visualmente el diseño actual, ya que el formulario se forma a partir de varios bloques de código. Durante la modificación, es difícil determinar claramente en qué lugar necesita realizar los cambios apropiados. Además, el mismo elemento puede modificarse en varios bloques de código, y la plataforma garantiza que si un módulo depende de otro, sus cambios se aplicarán en último lugar. Sin embargo, en el futuro planeamos agregar cierta funcionalidad para los cambios de diseño visual.

Metaprogramación


A veces es necesario crear el mismo tipo de código para diversas tareas. LsFusion tiene un mecanismo de metacódigo que le permite generar código basado en alguna plantilla. En este caso, en caso de un cambio en el metacódigo, el código se actualizará automáticamente. De hecho, esta es una copia / pegado automática con la capacidad de reemplazar ciertos identificadores con valores específicos.

Para habilitar este mecanismo, primero debe activarlo en el menú. Después de eso, el IDE cambiará automáticamente el código correspondiente.

imagen

Cuando se inicia el servidor, solo se utilizará el código generado. Las plantillas META en sí mismas no se tendrán en cuenta al iniciar el servidor.

Por cierto, la implementación de la posibilidad de metaprogramación nos obligó a hacer otra contribución al código abierto (en este caso, Intellij IDEA). El hecho es que en ERP los metacódigos se usan de forma bastante activa y, en consecuencia, a menudo es necesario generar código / eliminar el código generado. Esto conduce a una gran cantidad de cambios de archivos asíncronos, lo que, a su vez, condujo a un error muy peculiar. El problema es que no se podían reproducir en JetBrains, por lo que todo se redujo al hecho de que nosotros mismos tuvimos que escribir una prueba de unidad que no funcionaba. Por supuesto, esto tomó varios días, pero indirectamente nos ayudó a implementar las siguientes dos posibilidades.

Depurador


Cuando el código no está completamente claro qué está sucediendo, debe recurrir al depurador. En cualquier línea de lógica imperativa (acciones, eventos, restricciones), puede poner un punto de interrupción. Tan pronto como la ejecución del servidor llegue a este punto, se detendrá y el control irá al depurador. En este momento, puede mirar relojes y también continuar la ejecución línea por línea. A la izquierda, se mostrará un seguimiento de la pila, a lo largo del cual puede navegar como si estuviera depurando una aplicación Java normal.

imagen

Al ver los valores actuales, puede acceder tanto a los objetos actuales (por ejemplo, Envíos) como a cualquier otro objeto de la base de datos (por ejemplo, Artículo i). Sin embargo, el propio desarrollador es responsable de agregar datos a los relojes, cuya lectura llevará mucho tiempo o memoria, y provocará una caída en el rendimiento.

También puede establecer puntos de interrupción en una propiedad específica. La ejecución se detendrá en cualquier lugar cuando se realice un registro:

imagen

Esto es útil cuando necesita determinar qué evento o acción cambia el valor de una propiedad.

Para implementar realmente el depurador, en realidad utilizamos el IDEA Java Debugger existente. Es decir, la plataforma se está depurando como una aplicación Java normal, pero para las acciones de lsFusion creamos métodos proxy de Java y reemplazamos su visualización con nuestro código (como lo entiendo en IDEA, esto se hace para admitir Scala y otros contenedores sobre Java). Y aquí fue un momento divertido. En algún momento, los desarrolladores de IDEA hicieron privado el constructor de su depurador de Java. Y si la situación con la llamada a métodos privados aún se puede eludir a través de Reflection, entonces no está claro cómo heredar de una clase con un constructor privado. Pero justo en ese momento hubo un enfrentamiento con un error de la sección superior, y "decidimos pedirle a la gente de JetBrains que protegiera a este constructor", a lo que reaccionaron muy rápidamente (por lo que, por supuesto, muchas gracias a ellos).

Inyección de lenguaje


Una de las características más inusuales de IDEA es la capacidad de proporcionar soporte para su idioma en las constantes de cadena de otros idiomas. Para hacer esto, es suficiente decirle a IDEA exactamente qué constantes de cadena se aplican a su idioma, y ​​luego IDEA automáticamente:

  • genera un archivo virtual (o varios archivos) con los prefijos dados para cada constante de cadena
  • crea en el editor del archivo fuente para todas las constantes una especie de "ventana" en este archivo virtual
  • proporciona en este archivo virtual soporte para todas las características del lenguaje "incrustado", como resaltar errores, cambiar a un anuncio, autocompletar, buscar usos y, lo más importante, refactorizar. Es decir, al renombrar cualquier elemento en un idioma, se renombra automáticamente en todas las constantes de cadena que se refieren a este elemento en otros idiomas. Por lo tanto, está protegido automáticamente contra enlaces rotos.



Aquí en IDEA había (y todavía hay) un pequeño error . Cuando el archivo virtual es grande, si IDEA debe ir al comienzo de la "ventana de implementación" cuando comienza a usarlo, en realidad va al final de la "ventana de implementación" anterior (es decir, al uso anterior de la propiedad en el archivo Java). Por supuesto, una solución simple para este error es crear un archivo virtual separado para cada literal de cadena. Pero este enfoque se ralentiza cuando hay más de 30 usos, por lo que en este caso aún debe usar un archivo virtual grande (por otro lado, cuando hay muchos usos, no es tan difícil encontrar el correcto, es decir, el siguiente). Pedimos que se corrigiera este error nuevamente en el marco del "intercambio de servicios", y los desarrolladores de JetBrains lo arreglaron de alguna manera, pero, como resultó más tarde, de alguna manera no fue así (todavía era visible por el commit, pero pensamos que simplemente no estaba a la altura lo entendí al final). Sin embargo, todos hemos estado acostumbrados a este error durante mucho tiempo, ya que la situación con el uso de más de 30 elementos en un archivo es bastante rara.

Conclusión


El artículo describe solo los principales casos de uso. También tiene la capacidad de buscar implementaciones de propiedades y clases abstractas, visualizar dependencias entre módulos y propiedades, generar automáticamente formularios basados ​​en xml / json y mucho más. Y, por supuesto, hay una integración incorporada con los principales sistemas de control de versiones de Git y Subversion, así como soporte para Maven y Ant.

Siguiendo el camino del desarrollo del complemento IDEA, con poco esfuerzo obtuvimos un entorno de desarrollo integrado gratuito muy poderoso que supera a los competidores IDE en muchos aspectos.

Source: https://habr.com/ru/post/465573/


All Articles