JRuby on Rails: Die Leistung von Java, die Einfachheit von Ruby on Rails

Ruby, die objektorientierte dynamische (Skriptsprache) mit vollem Funktionsumfang und starker Unterstützung für funktionale Programmierung und Metaprogrammierung, hat in letzter Zeit aufgrund ihrer Flexibilität und einfachen Entwicklung Aufmerksamkeit erregt. JRuby, ein JVM-basierter Interpreter für Ruby, kombiniert die Leichtigkeit der Ruby-Sprache mit der Ausführung in der leistungsstarken JVM, einschließlich der vollständigen Integration in und aus Java-Bibliotheken.

Seit meinem vorherigen JavaWorld- Artikel zum Thema ("JRuby für die Java-Welt") gab es einige aufregende Entwicklungen für JRuby. Sun Microsystems stellte die beiden führenden JRuby-Entwickler Charles Nutter und Thomas E. Enebo ein, um Ruby in der JVM zu unterstützen. Java Platform, Standard Edition 6 (Java SE 6) wurde mit einer neuen Standard-API zum Einstecken von Interpreten für dynamische Sprachen veröffentlicht. Es ist geplant, dass die Java 7-VM dynamische Sprachen direkt mit einem neuen Bytecode "Dynamic aufrufen" und dem Hot-Swap von Klassendefinitionen zur Laufzeit unterstützt. In der Zwischenzeit hat das JRuby-Team Version 0.9.2 mit umfassenderer Unterstützung für Ruby on Rails veröffentlicht. Die nächste große Version von JRuby, die im Februar erwartet wird, wird die vollständige Unterstützung für Ruby on Rails enthalten.

Ruby on Rails, ein benutzerfreundliches, aber leistungsstarkes Webframework, das auf der Ruby-Sprache basiert, hat für neue datenbankgestützte Webanwendungen, insbesondere in der Web 2.0-Welt, schnell an Popularität gewonnen. Ich verweise Sie an anderer Stelle auf Details zu Ruby on Rails, auch Rails genannt. Obwohl das Projekt erst 3 Jahre alt ist, wurden viele Artikel und Bücher darüber geschrieben, und seine Dokumentation ist für ein Open-Source-Projekt hervorragend (siehe die Ruby on Rails-Website). Ebenso verweise ich Sie auf meinen früheren Artikel für eine Einführung in JRuby.

In diesem Artikel untersuche ich die Verbindung zwischen Rails und Java. Ich vergleiche die Rails- und Java-Webframeworks, beschreibe die Vorteile der Ausführung von Rails mit JRuby und überprüfe einige Lektionen, die ein Java-Entwickler - selbst einer, der Rails nicht verwendet - aus diesem innovativen Framework lernen kann.

Leistung plus Einfachheit

Rails beschleunigt und vereinfacht die Entwicklung von Webanwendungen radikal, leidet jedoch unter einem Image der Unreife, insbesondere bei High-End-Funktionen für Unternehmen.

Andererseits hat die Java-Plattform mit ihren virtuellen Maschinen, Bibliotheken und Anwendungsservern an Geschwindigkeit, Stabilität und Funktionalität gewonnen, bis sie allgemein als die führende Plattform für High-End-Serveranwendungen gilt. Solange es jedoch an die Java-Sprache gebunden bleibt, besteht die Gefahr, dass die Java-Plattform ins Hintertreffen gerät, wenn neuere Sprachen an Popularität gewinnen.

JRuby verbindet die komplementären Stärken all dieser Technologien und verspricht zusätzliche Popularität sowohl für Ruby als auch für Rails, während die Java-Plattform eine neue Rolle bei der Ausführung von Nicht-Java-Sprachen erhält.

Schienen: Wohin Java-Frameworks gehen

Für einen Java-Entwickler scheint Rails der natürliche Höhepunkt von Trends in der Entwicklung von Java-Webframeworks zu sein: weniger unnötiger Code, mehr Abstraktion und Dynamik sowie eine umfassendere sofort einsatzbereite Funktionalität.

Konvention über Konfiguration

Frühere Versionen von Java Platform, Enterprise Edition (Java EE) erforderten eine umfangreiche Konfiguration und Code für jede Komponente. Enterprise JavaBeans verfügten beispielsweise über mehrere Quellcode- und XML-Konfigurationsdateien für jede Bean. Diese Komplexität machte EJB zu einem Inbegriff für die Entwicklung im Schwergewicht und führte schließlich zu einer 180-Grad-Drehung in EJB 3, die auf POJO-Beans (Plain-Old Java Objects) mit minimaler Redundanz und Konfiguration abzielt. Trotzdem müssen Entwickler für Java EE-Anwendungen im Schwergewicht immer noch Code entwickeln, um dieselben Geschäftsobjekte über mehrere Softwareebenen hinweg auszudrücken - GUI, Geschäftslogik und Persistenz. Dann müssen Entwickler trotz der Redundanz und Ähnlichkeit zwischen den Ebenen die Ebenen mit Konfigurationsdateien zusammenkleben. Im Gegensatz,Die neueren Java Web Frameworks Seam und Spring machen Geschäftsobjekte mit viel weniger Konfiguration und Code verfügbar.

Java-Frameworks haben sich auch in Richtung Standardisierung und Integration eines Stacks über die Ebenen einer Webanwendung hinweg bewegt. In den frühesten Tagen haben Entwickler von Java-Webanwendungen die HTML-Ausgabe von Servlets von Hand codiert, ihre eigenen Model-View-Controller-Architekturen erstellt und mit SQL über Java Database Connectivity (JDBC) auf ihre Datenbanken zugegriffen. Später sammelten sie Komponenten, um einen Großteil der allgemeinen Funktionen wie Tag-Bibliotheken, Struts und Hibernate auszuführen. Vor kurzem hat Spring einen Großteil der Funktionalität in einen einzigen leichten Stapel von oben nach unten integriert.

Von Anfang an hat Rails diese Prinzipien der Einfachheit verkörpert, Prinzipien, die der Rails-Community als "Don't Repeat Yourself" und "Convention over Configuration" bekannt sind. (Nichtredundanz und sinnvolle Standardeinstellungen gehören zu den ältesten Prinzipien des Software-Engineerings. Es ist ein Wunder, dass wir so lange auf so etwas wie Rails warten mussten.) Das Framework errät die Verbindung zwischen verschiedenen Ebenen anhand einfacher Konventionen. Beispielsweise sind XML, Anmerkungen oder dergleichen nicht erforderlich, um dem Framework mitzuteilen, dass die Kundenklasse von der customersTabelle unterstützt wird . Die ActiveRecord-Datenbank-Wrapping-Schicht von Rails errät dies (unter Berücksichtigung der Pluralisierung und Großschreibung). Rails geht so weit, Attribute implizit und dynamisch hinzuzufügen, um Datenbankspalten widerzuspiegeln: alast_nameSpalte erzeugt automatisch ein last_nameAttribut.

In besonderen Fällen, in denen die Konventionen nicht Ihren Anforderungen entsprechen, können Sie die Konfiguration mithilfe von reinem Ruby-Code oder dem leichtgewichtigen Ruby-ähnlichen YAML-Format hinzufügen. In beiden Fällen werden die redundanten Klammern und schließenden Tags von XML weggelassen. Sie sollten sich jedoch nach Möglichkeit an die Standardeinstellungen halten. Rails ist eine "meinungsgebundene Software", die es viel einfacher macht, mit dem Fluss zu fahren.

Rails ist ein "Batterien enthalten" -Framework (eine von Python verbreitete Formulierung): Es enthält alles, was Sie für eine standardmäßige datenbankgestützte Webanwendung benötigen, von der Datenzugriffsschicht über Modell, Ansicht bis hin zum Controller. Sie können sich auf das konzentrieren, was für Ihre Anwendung spezifisch ist, anstatt allgemeine Funktionen neu zu codieren oder nach Open Source-Bibliotheken zu suchen, die sich gut integrieren lassen.

Dynamik und Reflexion

Java-Frameworks haben sich auch verstärkt für Reflexion und Metaprogrammierung eingesetzt. Im Gegensatz zum statischeren Ansatz des Standard-Java-EE-Server-Stacks verwendet Spring beispielsweise Reflection, um alle Teile zusammen mit der Abhängigkeitsinjektion zu verbinden. Hibernate, das beliebte objektrelationale Mapping-Framework, führt sein Mapping mit dynamischer Metaprogrammierung durch und aktualisiert den Bytecode zur Laufzeit, im Gegensatz zu frühen Datenzugriffs-Frameworks, die zur Entwicklungszeit eine umständliche Generierung von Quellcode oder Bytecode erforderten.

Die Entwickler von Hibernate mussten einige fortgeschrittene Techniken verwenden, um diese Funktionalität zu erreichen. In Ruby ist die Metaprogrammierung jedoch ein so natürlicher Bestandteil der Sprache, dass Rails zur Laufzeit nicht nur Zuordnungen, sondern auch die für den Zugriff auf und erforderlichen Business-Layer-Klassendefinitionen dynamisch generiert Zeigen Sie die zugrunde liegende Datenbank an, wodurch die Notwendigkeit einer manuellen Codierung oder der Erstellung eines unflexibel generierten Codes minimiert wird.

Unterstützung des Entwicklungsprozesses

Gegen Ende der neunziger Jahre wurden Java-Programmierer mit den JUnit-Frameworks "testinfiziert", aber das Schreiben von Tests für serverseitige Anwendungen war immer schwierig. Spring generiert jetzt Tests zusammen mit der Webanwendung. Rails macht dasselbe und nutzt Dynamik und Metaprogrammierung, um mehrere Arten von Tests zu unterstützen: Unit-Tests, bei denen die einzelnen Methoden der Modellklassen angewendet werden; Funktionstests, die auf der Ebene der einzelnen Webanfragen funktionieren; und Integrationstests, bei denen eine Reihe von Webanforderungen in einer simulierten Benutzersitzung ausgeführt werden.

Die beliebten Tools Ant und Maven standardisierten die Automatisierung von Builds in Java. Auch Rails erleichtert das Bauen mit Rubys Rake- Build-Tool. Es wird ein innovatives Migrationssystem hinzugefügt, das das Upgrade (oder Rollback) von Datenbankschemata und -daten automatisiert.