Programmering

JRuby on Rails: Kraften i Java, enkelheden ved Ruby on Rails

Ruby, det komplette objektorienterede dynamiske (script) sprog med stærk understøttelse af funktionel programmering og metaprogrammering, har for nylig gjort opmærksom på sin fleksibilitet og lette udvikling. JRuby, en JVM-baseret tolk til Ruby, kombinerer Ruby-sprogets lethed med udførelse i den kraftfulde JVM, inklusive fuld integration til og fra Java-biblioteker.

Siden min forrige JavaWorld artikel om emnet ("JRuby for Java World"), har der været nogle spændende udviklinger for JRuby. Sun Microsystems hyrede de to førende JRuby-udviklere, Charles Nutter og Thomas E. Enebo, i et tegn på støtte til Ruby i JVM. Java Platform, Standard Edition 6 (Java SE 6) blev frigivet med en ny standard API til tilslutning af tolke til dynamiske sprog. Planerne styrker for Java 7 VM til at understøtte dynamiske sprog direkte med en ny "påkald dynamisk" bytecode og hot-swapping af klassedefinitioner ved kørsel. I mellemtiden har JRuby-teamet frigivet version 0.9.2 med bredere support til Ruby on Rails, og den næste store frigivelse af JRuby, der forventes i februar, vil omfatte fuld support til Ruby on Rails.

Ruby on Rails, en brugervenlig, men kraftfuld webramme, der er bygget på Ruby-sproget, har hurtigt fået popularitet for nye databasestøttede webapplikationer, især i Web 2.0-verdenen. Jeg henviser dig andre steder for detaljer om Ruby on Rails, også kaldet Rails. Selvom projektet kun er 3 år gammelt, er der skrevet mange artikler og bøger om det, og dets dokumentation er fremragende til et open source-projekt (se Ruby on Rails-webstedet). På samme måde henviser jeg dig til min tidligere artikel for en introduktion til JRuby.

I denne artikel undersøger jeg krydset mellem Rails og Java. Jeg sammenligner Rails og Java Web-rammerne, beskriver fordelene ved at køre Rails med JRuby og gennemgår nogle lektioner, som en Java-udvikler - selv en, der ikke bruger Rails - kan lære af denne innovative ramme.

Kraft plus enkelhed

Rails fremskynder og forenkler radikalt udviklingen af ​​webapplikationer, men det lider under et billede af umodenhed, især i avancerede virksomhedsstyrkefunktioner.

På den anden side har Java-platformen med sine virtuelle maskiner, biblioteker og applikationsservere fået hastighed, stabilitet og funktionalitet til det punkt, hvor den generelt betragtes som den førende platform til avancerede serverapplikationer. Men så længe det forbliver bundet til Java-sproget, risikerer Java-platformen at blive bagud, når nyere sprog vinder popularitet.

JRuby binder de supplerende styrker af alle disse teknologier sammen og lover ekstra popularitet for både Ruby og Rails, samtidig med at Java-platformen får en ny rolle i kørsel af ikke-Java-sprog.

Rails: Hvor Java-rammer er på vej

For en Java-udvikler virker Rails som den naturlige kulmination af tendenser i udviklingen af ​​Java Web-rammer: mindre unødvendig kode, mere abstraktion og dynamik og fyldigere out-of-the-box-funktionalitet.

Konvention om konfiguration

Tidlige versioner af Java Platform, Enterprise Edition (Java EE) krævede omfattende konfiguration og kode for hver komponent. Enterprise JavaBeans havde for eksempel flere kildekode- og XML-konfigurationsfiler til hver bønne. Denne kompleksitet forvandlede EJB til et ordord for tungvægtsudvikling og førte til sidst til en 180 graders drejning i EJB 3, der sigter mod POJO (almindeligt gamle Java-objekter) bønner med minimal redundans og konfiguration. Alligevel kræver tunge Java EE-applikationer stadig udviklere at udvikle kode til at udtrykke de samme forretningsobjekter på tværs af flere softwaretrin - GUI, forretningslogik og vedholdenhed. Derefter, på trods af redundansen og ligheden mellem lagene, skal udviklere lime lagene sammen med konfigurationsfiler. I modsætning hertil udsætter de nyere Java Web-rammer Seam and Spring forretningsobjekter med meget mindre konfiguration og kode.

Java-rammer har også bevæget sig mod standardisering og integration af en stak på tværs af niveauerne i en webapplikation. I de tidligste dage håndkodede Java Web-applikationsudviklere HTML-output fra servlets, oprettede deres egne Model-View-Controller-arkitekturer og fik adgang til deres databaser med SQL via Java Database Connectivity (JDBC). Senere samlede de komponenter til at udføre meget af den fælles funktionalitet, såsom tagbiblioteker, Struts og Hibernate. For nylig integrerede Spring meget af funktionaliteten i en enkelt top-til-bund letvægtsstak.

Fra starten har Rails inkorporeret disse enkelhedsprincipper, principper der er kendt for Rails-samfundet som "Gentag ikke dig selv" og "Konvention om konfiguration." (Ikke-redundans og meningsfulde standarder er blandt de ældste principper for software engineering; det er et under, at vi har måttet vente så længe på noget som Rails.) Rammen gætter forbindelsen mellem forskellige niveauer baseret på ligefremme konventioner. For eksempel er der ikke behov for XML, annoteringer eller lignende for at fortælle rammen, at kundeklassen er bakket op af kunder bord; Rails 'ActiveRecord-databaseindpakningslag gætter på dette (under hensyntagen til pluralisering og kapitalisering). Rails går så langt som implicit og dynamisk at tilføje attributter til at afspejle databasekolonner: a efternavn kolonne bringer automatisk en efternavn attribut til at være.

I særlige tilfælde, hvor konventionerne ikke opfylder dine behov, kan du stadig tilføje konfiguration ved hjælp af ren Ruby-kode eller det lette Ruby-lignende YAML-format, som begge udelader XML's overflødige parenteser og lukkemærker. Men du skal holde dig til standardindstillingerne, hvor det er muligt. Rails er "opfattet software", hvilket gør det meget lettere, når du går med strømmen.

Rails er en "batteri inkluderet" -ramme (en sætning, der er populært af Python): den inkluderer alt hvad du har brug for til en standard databasestøttet webapplikation, fra dataadgangslag gennem model, visning og controller. Det giver dig mulighed for at fokusere på, hvad der er specifikt for din applikation, i stedet for at genkode almindelig funktionalitet eller søge efter open source-biblioteker, der integreres godt sammen.

Dynamisme og refleksion

Java-rammer har også bevæget sig i retning af større brug af refleksion og metaprogrammering. Spring bruger for eksempel refleksion til at tilslutte alle sine stykker sammen med afhængighedsinjektion i modsætning til den mere statiske tilgang til standard Java EE-serverstakken. Dvaletilstand, den populære objektrelationelle kortlægningsramme, udfører sin kortlægning med dynamisk metaprogrammering, opdaterer bytecode ved kørsel i modsætning til tidlige datatilgangsrammer, som krævede besværlig kildekode eller generering af bytecode på udviklingstidspunktet.

Hibernates udviklere var nødt til at bruge nogle avancerede teknikker til at udføre denne funktionalitet, men i Ruby er metaprogrammering sådan en naturlig del af sproget, at Rails under kørsel dynamisk genererer ikke kun kortlægninger, men også de definitioner på business-lagklasser, der er nødvendige for at få adgang til og vise den underliggende database og derved minimere behovet for manuel kodning eller oprettelse af ufleksibel genereret kode.

Støtter udviklingsprocessen

Omkring slutningen af ​​1990'erne blev Java-programmører "testinficeret" med JUnit-rammerne, men det har altid været svært at skrive tests til applikationer på serversiden. Spring genererer nu tests sammen med webapplikationen. Rails gør det samme ved at udnytte dynamik og metaprogrammering til at understøtte flere typer tests: enhedstest, der udøver de individuelle metoder i modelklasser; funktionelle tests, der fungerer på niveauet for den enkelte webanmodning; og integrationstest, der kører en række webanmodninger i en simuleret brugersession.

De populære Ant- og Maven-værktøjer standardiserede automatiseringen af ​​builds i Java. Rails gør det også let at bygge med Ruby's rive bygge værktøj; det tilføjer et innovativt migrationssystem, der automatiserer opgradering (eller tilbagevenden) af databaseskemaer og data.