JRuby on Rails: La puissance de Java, la simplicité de Ruby on Rails

Ruby, le langage de script (script) dynamique orienté objet complet, avec un support solide pour la programmation fonctionnelle et la métaprogrammation, a récemment attiré l'attention pour sa flexibilité et sa facilité de développement. JRuby, un interpréteur basé sur JVM pour Ruby, combine la facilité du langage Ruby avec une exécution dans la puissante JVM, y compris une intégration complète vers et depuis les bibliothèques Java.

Depuis mon précédent article sur JavaWorld sur le sujet ("JRuby for the Java World"), il y a eu des développements passionnants pour JRuby. Sun Microsystems a embauché les deux principaux développeurs de JRuby, Charles Nutter et Thomas E. Enebo, en signe de soutien pour Ruby dans la JVM. Java Platform, Standard Edition 6 (Java SE 6) a été publié avec une nouvelle API standard permettant de connecter des interprètes pour les langages dynamiques. Les plans se renforcent pour que la machine virtuelle Java 7 supporte directement les langages dynamiques avec un nouveau bytecode «invoke dynamic» et un échange à chaud des définitions de classe au moment de l'exécution. Pendant ce temps, l'équipe JRuby a publié la version 0.9.2 avec une prise en charge plus large de Ruby on Rails, et la prochaine grande version de JRuby, prévue en février, inclura un support complet pour Ruby on Rails.

Ruby on Rails, un framework Web facile à utiliser mais puissant basé sur le langage Ruby, a rapidement gagné en popularité pour les nouvelles applications Web basées sur des bases de données, en particulier dans le monde Web 2.0. Je vous renvoie ailleurs pour plus de détails sur Ruby on Rails, également appelé Rails. Même si le projet n'a que 3 ans, de nombreux articles et livres ont été écrits à son sujet, et sa documentation est exceptionnelle pour un projet open source (voir le site Web Ruby on Rails). De même, je vous renvoie à mon article précédent pour une introduction à JRuby.

Dans cet article, j'examine la jonction entre Rails et Java. Je compare les frameworks Rails et Java Web, décris les avantages de l'exécution de Rails avec JRuby, et passe en revue certaines leçons qu'un développeur Java - même celui qui n'utilise pas Rails - peut tirer de ce framework innovant.

Puissance plus simplicité

Rails accélère et simplifie radicalement le développement des applications Web, mais il souffre d'une image d'immaturité, en particulier dans les capacités d'entreprise haut de gamme.

D'autre part, la plate-forme Java, avec ses machines virtuelles, ses bibliothèques et ses serveurs d'applications, gagne en vitesse, en stabilité et en fonctionnalités, au point qu'elle est généralement considérée comme la plate-forme leader pour les applications serveur haut de gamme. Pourtant, tant qu'elle reste liée au langage Java, la plateforme Java risque de prendre du retard à mesure que les nouveaux langages gagnent en popularité.

JRuby relie les forces complémentaires de toutes ces technologies, promettant une popularité accrue pour Ruby et Rails, tout en donnant à la plate-forme Java un nouveau rôle dans l'exécution de langages non Java.

Rails: où se dirigent les frameworks Java

Pour un développeur Java, Rails semble être le point culminant naturel des tendances de l'évolution des frameworks Web Java: moins de code inutile, plus d'abstraction et de dynamisme, et des fonctionnalités prêtes à l'emploi plus complètes.

Convention sur la configuration

Les premières versions de Java Platform, Enterprise Edition (Java EE) nécessitaient une configuration et un code étendus pour chaque composant. Enterprise JavaBeans, par exemple, avait plusieurs fichiers de configuration de code source et XML pour chaque bean. Cette complexité a transformé EJB en synonyme de développement lourd, et a finalement conduit à un virage à 180 degrés dans EJB 3, qui vise des beans POJO (objets Java simples) avec une redondance et une configuration minimales. Même ainsi, les applications Java EE lourdes exigent toujours que les développeurs développent du code pour exprimer les mêmes objets métier sur plusieurs niveaux de logiciels: interface graphique, logique métier et persistance. Ensuite, malgré la redondance et la similitude entre les couches, les développeurs doivent coller les couches avec les fichiers de configuration. En revanche,les nouveaux frameworks Web Java Seam et Spring exposent des objets métier avec beaucoup moins de configuration et de code.

Les frameworks Java ont également évolué vers la standardisation et l'intégration d'une pile à travers les niveaux d'une application Web. Au tout début, les développeurs d'applications Web Java codaient à la main la sortie HTML des servlets, créaient leurs propres architectures Model-View-Controller et accédaient à leurs bases de données avec SQL via Java Database Connectivity (JDBC). Plus tard, ils ont rassemblé des composants pour exécuter une grande partie des fonctionnalités courantes, telles que les bibliothèques de balises, Struts et Hibernate. Récemment, Spring a intégré une grande partie des fonctionnalités dans une seule pile légère de haut en bas.

Depuis le début, Rails a incarné ces principes de simplicité, des principes connus de la communauté Rails sous le nom de "Ne vous répétez pas" et "Convention sur la configuration". (La non-redondance et les valeurs par défaut significatives font partie des principes les plus anciens de l'ingénierie logicielle; il est étonnant que nous ayons dû attendre si longtemps pour quelque chose comme Rails.) Le cadre devine la connexion entre différents niveaux sur la base de conventions simples. Par exemple, il n'y a pas besoin de XML, d'annotations ou autres pour indiquer au cadre que la classe client est soutenue par la customerstable; La couche d'enveloppement de base de données ActiveRecord de Rails le devine (tout en prenant en compte la pluralisation et la capitalisation). Rails va jusqu'à ajouter implicitement et dynamiquement des attributs pour refléter les colonnes de la base de données: alast_nameLa colonne crée automatiquement un last_nameattribut.

Dans des cas particuliers, où les conventions ne répondent pas à vos besoins, vous pouvez toujours ajouter une configuration, en utilisant du code Ruby pur ou le format YAML léger de type Ruby, qui omettent tous deux les crochets redondants et les balises de fermeture XML. Mais vous devez vous en tenir aux valeurs par défaut lorsque cela est possible. Rails est un «logiciel avisé», ce qui facilite grandement les choses lorsque vous suivez le courant.

Rails est un framework "batteries incluses" (une expression popularisée par Python): il comprend tout ce dont vous avez besoin pour une application Web standard basée sur une base de données, de la couche d'accès aux données, en passant par le modèle, la vue et le contrôleur. Il vous permet de vous concentrer sur ce qui est spécifique à votre application, au lieu de recoder des fonctionnalités communes ou de rechercher des bibliothèques open source qui s'intègrent bien ensemble.

Dynamisme et réflexion

Les frameworks Java ont également évolué vers une plus grande utilisation de la réflexion et de la métaprogrammation. Spring, par exemple, utilise la réflexion pour connecter toutes ses pièces avec l'injection de dépendances, contrairement à l'approche plus statique de la pile de serveurs Java EE standard. Hibernate, le cadre de mappage relationnel objet populaire, effectue son mappage avec une métaprogrammation dynamique, mettant à jour le bytecode au moment de l'exécution, contrairement aux premiers frameworks d'accès aux données, qui nécessitaient une génération de code source ou de bytecode fastidieuse au moment du développement.

Les développeurs d'Hibernate ont dû utiliser des techniques avancées pour accomplir cette fonctionnalité, mais dans Ruby, la métaprogrammation est une partie si naturelle du langage que Rails, au moment de l'exécution, génère dynamiquement non seulement les mappages, mais aussi les définitions de classe de la couche métier nécessaires pour accéder et afficher la base de données sous-jacente, minimisant ainsi le besoin de codage manuel ou de création de code généré inflexible.

Soutenir le processus de développement

Vers la fin des années 90, les programmeurs Java ont été "infectés par des tests" avec les frameworks JUnit, mais écrire des tests pour les applications côté serveur a toujours été difficile. Spring génère désormais des tests avec l'application Web. Rails fait de même, tirant parti du dynamisme et de la métaprogrammation pour prendre en charge plusieurs types de tests: les tests unitaires, qui exercent les méthodes individuelles des classes modèles; des tests fonctionnels, qui fonctionnent au niveau de la requête Web individuelle; et des tests d'intégration, qui exécutent une série de requêtes Web dans une session utilisateur simulée.

Les outils populaires Ant et Maven ont standardisé l'automatisation des builds en Java. Rails, aussi, facilite les constructions avec l' outil de construction de rake de Ruby ; il ajoute un système de migration innovant, qui automatise la mise à niveau (ou la restauration) des schémas et des données de base de données.