JRuby on Rails: el poder de Java, la simplicidad de Ruby on Rails

Ruby, el lenguaje dinámico (scripting) orientado a objetos con todas las funciones, con un fuerte soporte para la programación funcional y la metaprogramación, ha llamado la atención recientemente por su flexibilidad y facilidad de desarrollo. JRuby, un intérprete de Ruby basado en JVM, combina la facilidad del lenguaje Ruby con la ejecución en la potente JVM, incluida la integración completa desde y hacia las bibliotecas de Java.

Desde mi artículo anterior de JavaWorld sobre el tema ("JRuby para Java World"), ha habido algunos desarrollos interesantes para JRuby. Sun Microsystems contrató a los dos desarrolladores principales de JRuby, Charles Nutter y Thomas E. Enebo, en una señal de soporte para Ruby en la JVM. Java Platform, Standard Edition 6 (Java SE 6) se lanzó con una nueva API estándar para conectar intérpretes para lenguajes dinámicos. Se están estableciendo planes para que la máquina virtual Java 7 admita lenguajes dinámicos directamente con un nuevo código de bytes de "invocación dinámica" e intercambio en caliente de definiciones de clases en tiempo de ejecución. Mientras tanto, el equipo de JRuby ha lanzado la versión 0.9.2 con soporte más amplio para Ruby on Rails, y el próximo gran lanzamiento de JRuby, esperado en febrero, incluirá soporte completo para Ruby on Rails.

Ruby on Rails, un marco web fácil de usar pero poderoso construido en el lenguaje Ruby, ha ganado rápidamente popularidad para las nuevas aplicaciones web respaldadas por bases de datos, especialmente en el mundo de la Web 2.0. Lo referiré a otro lugar para obtener detalles de Ruby on Rails, también llamado Rails. Aunque el proyecto tiene solo 3 años, se han escrito muchos artículos y libros al respecto, y su documentación es excelente para un proyecto de código abierto (consulte el sitio web Ruby on Rails). Asimismo, le remito a mi artículo anterior para una introducción a JRuby.

En este artículo, examino la unión entre Rails y Java. Comparo los frameworks Rails y Java Web, describo los beneficios de ejecutar Rails con JRuby y reviso algunas lecciones que un desarrollador de Java, incluso uno que no usa Rails, puede aprender de este innovador framework.

Poder más simplicidad

Rails acelera y simplifica radicalmente el desarrollo de aplicaciones web, pero adolece de una imagen de inmadurez, especialmente en las capacidades empresariales de alto nivel.

Por otro lado, la plataforma Java, con sus máquinas virtuales, bibliotecas y servidores de aplicaciones, ha ido ganando velocidad, estabilidad y funcionalidad, hasta el punto de que generalmente se considera la plataforma líder para aplicaciones de servidor de alta gama. Sin embargo, mientras permanezca vinculada al lenguaje Java, la plataforma Java corre el riesgo de quedarse atrás a medida que los nuevos lenguajes ganan popularidad.

JRuby une las fortalezas complementarias de todas estas tecnologías, lo que promete una popularidad adicional tanto para Ruby como para Rails, al tiempo que otorga a la plataforma Java un nuevo rol en la ejecución de lenguajes que no son Java.

Rails: hacia dónde se dirigen los frameworks Java

Para un desarrollador de Java, Rails parece la culminación natural de las tendencias en la evolución de los marcos web de Java: menos código innecesario, más abstracción y dinamismo, y una funcionalidad más completa y lista para usar.

Convención sobre configuración

Las primeras versiones de Java Platform, Enterprise Edition (Java EE) requerían una configuración y un código extensos para cada componente. Enterprise JavaBeans, por ejemplo, tenía varios archivos de configuración XML y de código fuente para cada bean. Esta complejidad convirtió a EJB en un sinónimo de desarrollo pesado y, finalmente, condujo a un giro de 180 grados en EJB 3, que apunta a beans POJO (objetos Java simples) con una redundancia y configuración mínimas. Aun así, las aplicaciones Java EE de gran peso todavía requieren que los desarrolladores desarrollen código para expresar los mismos objetos comerciales en múltiples niveles de software: GUI, lógica comercial y persistencia. Luego, a pesar de la redundancia y similitud entre las capas, los desarrolladores deben pegar las capas junto con los archivos de configuración. A diferencia de,los marcos web Java más nuevos, Seam y Spring, exponen los objetos comerciales con mucha menos configuración y código.

Los marcos de Java también se han estado moviendo hacia la estandarización e integración de una pila en los niveles de una aplicación web. En los primeros días, los desarrolladores de aplicaciones web Java codificaron manualmente la salida HTML de los servlets, crearon sus propias arquitecturas Modelo-Vista-Controlador y accedieron a sus bases de datos con SQL sobre Java Database Connectivity (JDBC). Más tarde, reunieron componentes para ejecutar gran parte de la funcionalidad común, como bibliotecas de etiquetas, Struts e Hibernate. Recientemente, Spring integró gran parte de la funcionalidad en una sola pila liviana de arriba a abajo.

Desde el principio, Rails ha incorporado estos principios de simplicidad, principios conocidos por la comunidad de Rails como "No se repita" y "Convención sobre configuración". (La no redundancia y los valores predeterminados significativos se encuentran entre los principios más antiguos de la ingeniería de software; es una maravilla que hayamos tenido que esperar tanto tiempo para algo como Rails). El marco adivina la conexión entre diferentes niveles basándose en convenciones sencillas. Por ejemplo, no hay necesidad de XML, anotaciones o similares, para decirle al marco que la clase de cliente está respaldada por la customerstabla; La capa de envoltura de base de datos ActiveRecord de Rails adivina esto (mientras toma en cuenta la pluralización y las mayúsculas). Rails llega incluso a agregar atributos implícita y dinámicamente para reflejar las columnas de la base de datos:last_namecolumna automáticamente crea un last_nameatributo.

En casos especiales, donde las convenciones no satisfacen sus necesidades, aún puede agregar configuración, utilizando código Ruby puro o el formato YAML ligero similar a Ruby, los cuales omiten los corchetes redundantes de XML y las etiquetas de cierre. Pero debe atenerse a los valores predeterminados siempre que sea posible. Rails es un "software obstinado", que lo hace mucho más fácil cuando te dejas llevar.

Rails es un marco de "baterías incluidas" (una frase popularizada por Python): incluye todo lo que necesita para una aplicación web estándar respaldada por una base de datos, desde la capa de acceso a datos hasta el modelo, la vista y el controlador. Le permite concentrarse en lo que es específico de su aplicación, en lugar de recodificar la funcionalidad común o buscar bibliotecas de código abierto que se integren bien entre sí.

Dinamismo y reflexión

Los marcos de Java también se han movido hacia un mayor uso de la reflexión y la metaprogramación. Spring, por ejemplo, usa la reflexión para conectar todas sus piezas junto con la inyección de dependencia, en contraste con el enfoque más estático de la pila de servidores Java EE estándar. Hibernate, el popular marco de trabajo de mapeo relacional de objetos, hace su mapeo con metaprogramación dinámica, actualizando el código de bytes en tiempo de ejecución, en contraste con los marcos de acceso a datos tempranos, que requerían una complicada generación de código fuente o código de bytes en tiempo de desarrollo.

Los desarrolladores de Hibernate tuvieron que usar algunas técnicas avanzadas para lograr esta funcionalidad, pero en Ruby, la metaprogramación es una parte tan natural del lenguaje que Rails, en tiempo de ejecución, genera dinámicamente no solo mapeos, sino también las definiciones de clase de la capa empresarial necesarias para acceder y mostrar la base de datos subyacente, minimizando así la necesidad de codificación manual o creación de código generado inflexible.

Apoyando el proceso de desarrollo

Hacia fines de la década de 1990, los programadores de Java se "infectaron de prueba" con los frameworks JUnit, pero escribir pruebas para aplicaciones del lado del servidor siempre ha sido difícil. Spring ahora genera pruebas junto con la aplicación web. Rails hace lo mismo, aprovechando el dinamismo y la metaprogramación para soportar múltiples tipos de pruebas: pruebas unitarias, que ejercitan los métodos individuales de las clases modelo; pruebas funcionales, que funcionan al nivel de la solicitud web individual; y pruebas de integración, que ejecutan una serie de solicitudes web en una sesión de usuario simulada.

Las populares herramientas Ant y Maven estandarizaron la automatización de compilaciones en Java. Rails también facilita las construcciones con la herramienta de construcción de rake de Ruby ; agrega un sistema de migración innovador, que automatiza la actualización (o reversión) de los esquemas y datos de la base de datos.