Programmering

JRuby on Rails: Kraften til Java, enkelheten til Ruby on Rails

Ruby, det fullstendige objektorienterte dynamiske (skriptspråket), med sterk støtte for funksjonell programmering og metaprogrammering, har nylig trukket oppmerksomhet for sin fleksibilitet og lette utvikling. JRuby, en JVM-basert tolk for Ruby, kombinerer Ruby-språkets lette med utførelse i kraftige JVM, inkludert full integrering til og fra Java-biblioteker.

Siden min forrige JavaWorld artikkel om emnet ("JRuby for Java World"), har det vært noen spennende utvikling for JRuby. Sun Microsystems hyret de to ledende JRuby-utviklerne, Charles Nutter og Thomas E. Enebo, i et tegn på støtte til Ruby i JVM. Java Platform, Standard Edition 6 (Java SE 6) ble utgitt med en ny standard API for å plugge inn tolker for dynamiske språk. Planene styrker for Java 7 VM for å støtte dynamiske språk direkte med en ny "påkalle dynamisk" bytekode og hot-swapping av klassedefinisjoner ved kjøretid. I mellomtiden har JRuby-teamet gitt ut versjon 0.9.2 med bredere støtte for Ruby on Rails, og den neste store utgivelsen av JRuby, forventet i februar, vil inkludere full støtte for Ruby on Rails.

Ruby on Rails, et brukervennlig, men kraftig web-rammeverk bygget på Ruby-språket, har raskt fått popularitet for nye databasestøttede webapplikasjoner, spesielt i Web 2.0-verdenen. Jeg henviser deg andre steder for detaljer om Ruby on Rails, også kalt Rails. Selv om prosjektet bare er 3 år, har det blitt skrevet mange artikler og bøker om det, og dokumentasjonen er enestående for et open source-prosjekt (se nettstedet Ruby on Rails). På samme måte henviser jeg deg til min tidligere artikkel for en introduksjon til JRuby.

I denne artikkelen undersøker jeg krysset mellom Rails og Java. Jeg sammenligner Rails og Java Web Framework, beskriver fordelene ved å kjøre Rails med JRuby, og gjennomgår noen leksjoner som en Java-utvikler - til og med en som ikke bruker Rails - kan lære av dette innovative rammeverket.

Kraft pluss enkelhet

Skinner gir raskere og forenkling av utviklingen av webapplikasjoner radikalt, men det lider av et bilde av umodenhet, spesielt i high-end virksomhetsstyrkeegenskaper.

På den annen side har Java-plattformen, med sine virtuelle maskiner, biblioteker og applikasjonsservere, økt i hastighet, stabilitet og funksjonalitet, til det punktet at den generelt regnes som den ledende plattformen for avanserte serverapplikasjoner. Likevel, så lenge det forblir bundet til Java-språket, risikerer Java-plattformen å havne etter hvert som nyere språk blir populære.

JRuby binder sammen de komplementære styrkene til alle disse teknologiene, og lover ekstra popularitet for både Ruby og Rails, samtidig som Java-plattformen får en ny rolle i å kjøre språk som ikke er Java.

Rails: Hvor Java-rammer er på vei

For en Java-utvikler virker Rails som den naturlige kulminasjonen av trender i utviklingen av Java Web-rammeverk: mindre unødvendig kode, mer abstraksjon og dynamikk og fullstendig out-of-the-box-funksjonalitet.

Konvensjon om konfigurasjon

Tidlige versjoner av Java Platform, Enterprise Edition (Java EE) krevde omfattende konfigurasjon og kode for hver komponent. Enterprise JavaBeans hadde for eksempel flere kildekode- og XML-konfigurasjonsfiler for hver bønne. Denne kompleksiteten gjorde EJB til et ord for tungvektsutvikling, og til slutt førte til en 180 graders sving i EJB 3, som sikter mot POJO (vanlige Java-objekter) bønner med minimal redundans og konfigurasjon. Allikevel krever tunge Java EE-applikasjoner utviklere å utvikle kode for å uttrykke de samme forretningsobjektene på tvers av flere programvarelag - GUI, forretningslogikk og utholdenhet. Deretter, til tross for overflødighet og likhet mellom lagene, må utviklere lim lagene sammen med konfigurasjonsfiler. I motsetning til dette utsetter de nyere Java Web-rammene Seam and Spring forretningsobjekter med mye mindre konfigurasjon og kode.

Java-rammeverk har også beveget seg mot standardisering og integrering av en stabel på tvers av nivåene i et webapplikasjon. I de tidligste dagene håndterte Java Web-applikasjonsutviklere HTML-utdata fra servlets, opprettet sine egne Model-View-Controller-arkitekturer og fikk tilgang til databasene sine med SQL over Java Database Connectivity (JDBC). Senere samlet de komponenter for å utføre mye av den vanlige funksjonaliteten, som tagbiblioteker, Struts og Hibernate. Nylig integrerte Spring mye av funksjonaliteten i en enkelt topp-til-bunn lettvektsstabel.

Helt fra starten har Rails legemliggjort disse prinsippene om enkelhet, prinsipper kjent for Rails-samfunnet som "Don't Repeat Yourself" og "Convention over Configuration." (Ikke-redundans og meningsfulle standarder er blant de eldste prinsippene for programvareteknikk; det er rart at vi har måttet vente så lenge på noe som Rails.) Rammeverket gjetter sammenhengen mellom forskjellige nivåer basert på enkle konvensjoner. Det er for eksempel ikke behov for XML, merknader eller lignende, for å fortelle rammeverket at kundeklassen er støttet av kunder bord; Rails 'ActiveRecord-databaseinnpakningslag gjetter dette (mens man tar i betraktning pluralisering og bruk av store bokstaver). Rails går så langt som å implisitt og dynamisk legge til attributter for å gjenspeile databasekolonner: a etternavn kolonne bringer automatisk en etternavn attributt til å være.

I spesielle tilfeller der konvensjonene ikke oppfyller dine behov, kan du fremdeles legge til konfigurasjon ved hjelp av ren Ruby-kode eller det lette Ruby-lignende YAML-formatet, som begge utelater XMLs overflødige parenteser og lukkekoder. Men du bør holde deg til standardene der det er mulig. Rails er "meningsfull programvare", noe som gjør det langt enklere når du går med strømmen.

Rails er et "batterier inkludert" -rammeverk (et uttrykk som er populært av Python): det inneholder alt du trenger for en standard databasestøttet webapplikasjon, fra datatilgangslag, gjennom modell, visning og kontroller. Den lar deg fokusere på det som er spesifikt for applikasjonen din, i stedet for å kode om vanlig funksjonalitet eller søke etter open source-biblioteker som integreres godt sammen.

Dynamikk og refleksjon

Java-rammer har også gått mot større bruk av refleksjon og metaprogrammering. Spring bruker for eksempel refleksjon for å koble alle delene sammen med avhengighetsinjeksjon, i motsetning til den mer statiske tilnærmingen til standard Java EE-serverstakken. Dvalemodus, det populære rammeverket for objektrelasjonell kartlegging, gjør kartleggingen med dynamisk metaprogrammering, og oppdaterer bytekoden ved kjøretid, i motsetning til tidlige datatilgangsrammer, som krevde tungvint kildekode eller generering av bytekodene på utviklingstidspunktet.

Hibernates utviklere måtte bruke noen avanserte teknikker for å oppnå denne funksjonaliteten, men i Ruby er metaprogrammering en så naturlig del av språket at Rails genererer dynamisk ikke bare kartlegginger, men også definisjoner av virksomhetslagsklassen som trengs for å få tilgang til og vise den underliggende databasen, og derved minimere behovet for manuell koding eller opprettelse av ufleksibel generert kode.

Støtter utviklingsprosessen

Rundt slutten av 1990-tallet ble Java-programmerere "testinfisert" med JUnit-rammene, men det har alltid vært vanskelig å skrive tester for server-side-applikasjoner. Våren genererer nå tester sammen med webapplikasjonen. Rails gjør det samme ved å utnytte dynamikk og metaprogrammering for å støtte flere typer tester: enhetstester som utøver de individuelle metodene i modellklassene; funksjonstester, som fungerer på nivået til den enkelte nettforespørsel; og integrasjonstester, som kjører en serie med nettforespørsler i en simulert brukersesjon.

De populære Ant og Maven-verktøyene standardiserte automatiseringen av bygg i Java. Skinner gjør det også enkelt å bygge med Ruby's rake bygge verktøy; det legger til et innovativt migrasjonssystem som automatiserer oppgraderingen (eller tilbakeføring) av databaseskjemaer og data.

$config[zx-auto] not found$config[zx-overlay] not found