JRuby on Rails: Snaga Jave, jednostavnost Ruby on Rails

Ruby, cjeloviti objektno orijentirani dinamički (skriptni) jezik, sa snažnom podrškom za funkcionalno programiranje i metaprogramiranje, nedavno je skrenuo pozornost na svoju fleksibilnost i lakoću razvoja. JRuby, JVM-ov tumač za Ruby, kombinira jednostavnost jezika Ruby s izvršavanjem u moćnom JVM-u, uključujući potpunu integraciju u Java knjižnice i iz njih.

Od mog prethodnog članka o JavaWorldu na tu temu ("JRuby za svijet Java"), za JRuby je došlo do nekih uzbudljivih događaja. Sun Microsystems angažirao je dvojicu vodećih programera JRubyja, Charlesa Nuttera i Thomasa E. Eneba, u znak podrške Rubyju u JVM-u. Java Platform, Standard Edition 6 (Java SE 6) objavljen je s novim standardnim API-jem za priključivanje tumača za dinamičke jezike. Javljaju se planovi za Java 7 VM za izravnu podršku dinamičkih jezika s novim "pozivanjem dinamičkog" bajt-koda i zamjenom definicija klase tijekom izvršavanja. U međuvremenu, tim JRuby-a objavio je verziju 0.9.2 sa širom podrškom za Ruby on Rails, a sljedeće veliko izdanje JRuby-a, koje se očekuje u veljači, uključivat će punu podršku za Ruby on Rails.

Ruby on Rails, jednostavan za upotrebu, ali moćan web okvir izgrađen na jeziku Ruby, brzo je stekao popularnost za nove web aplikacije podržane bazom podataka, posebno u svijetu Web 2.0. Uputiću vas drugdje za detalje o Ruby on Rails, koji se također naziva Rails. Iako je projekt star samo 3 godine, o njemu je napisano mnoštvo članaka i knjiga, a njegova je dokumentacija izvanredna za projekt otvorenog koda (vidi web mjesto Ruby on Rails). Isto tako, upućujem vas na moj raniji članak za uvod u JRuby.

U ovom članku ispitujem spoj između Railsa i Jave. Usporedim okvire Rails i Java Web, opisujem prednosti pokretanja Railsa s JRubyem i pregledam neke lekcije koje programer Java - čak i onaj koji ne koristi Rails - može naučiti iz ovog inovativnog okvira.

Snaga plus jednostavnost

Rails radikalno ubrzava i pojednostavljuje razvoj web aplikacija, ali pati od slike nezrelosti, posebno u vrhunskim sposobnostima poduzeća.

S druge strane, Java platforma, sa svojim virtualnim strojevima, knjižnicama i aplikacijskim poslužiteljima, dobiva na brzini, stabilnosti i funkcionalnosti, do te mjere da se općenito smatra vodećom platformom za vrhunske poslužiteljske aplikacije. Ipak, sve dok ostaje vezana uz jezik Java, Java platforma riskira zaostajati kako noviji jezici stječu popularnost.

JRuby povezuje komplementarne snage svih ovih tehnologija, obećavajući dodatnu popularnost i za Ruby i za Rails, dok Java platformi daje novu ulogu u pokretanju ne-Java jezika.

Rails: Kamo idu Java okviri

Java programeru Rails izgleda kao prirodna kulminacija trendova u evoluciji Java Web okvira: manje nepotrebnog koda, više apstrakcije i dinamičnosti i potpunija funkcionalnost izvan okvira.

Konvencija oko konfiguracije

Rane verzije Java Platform, Enterprise Edition (Java EE) zahtijevale su opsežnu konfiguraciju i kôd za svaku komponentu. Poduzeće JavaBeans, na primjer, imalo je više izvornih kodova i XML konfiguracijskih datoteka za svaki grah. Ova složenost pretvorila je EJB u pojma za razvoj teške kategorije, a na kraju je dovela do okreta za 180 stupnjeva u EJB 3, koji ima za cilj POJO (obični-stari Java objekti) grah s minimalnom redundancijom i konfiguracijom. Unatoč tome, teške Java EE aplikacije i dalje zahtijevaju od programera da razviju kôd za izražavanje istih poslovnih objekata na više softverskih slojeva - GUI, poslovna logika i postojanost. Zatim, unatoč suvišnosti i sličnosti između slojeva, programeri moraju slojeve zalijepiti zajedno s konfiguracijskim datotekama. U kontrastu,noviji Java Web okviri Seam i Spring izlažu poslovne objekte s mnogo manje konfiguracije i koda.

Java okviri također se kreću prema standardizaciji i integraciji stoga na razinama web aplikacija. U najranijim danima programeri Java web aplikacija ručno su kodirali HTML izlaz iz servleta, stvorili vlastite arhitekture Model-View-Controller i pristupili svojim bazama podataka pomoću SQL-a preko Java Database Connectivity (JDBC). Kasnije su okupili komponente za izvršavanje većine uobičajenih funkcionalnosti, poput knjižnica oznaka, Struts i Hibernate. Nedavno je Spring integrirao velik dio funkcionalnosti u jedan lagani niz od vrha do dna.

Od početka je Rails utjelovio ova načela jednostavnosti, principe poznate Rails zajednici kao "Ne ponavljaj se" i "Konvencija nad konfiguracijom". (Ne-redundancija i značajne zadane postavke među su najstarijim načelima softverskog inženjerstva; čudo je što smo toliko dugo morali čekati nešto poput Rails-a.) Okvir pogađa vezu između različitih razina na temelju neposrednih konvencija. Na primjer, nema potrebe za XML-om, bilješkama ili slično da bi se okviru customerskazalo da klasa kupaca stoji u tablici; Rails-ov ActiveRecord sloj za omatanje baze podataka pretpostavlja (uzimajući u obzir pluralizaciju i pisanje velikih slova). Rails ide toliko daleko da implicitno i dinamički dodaje atribute koji odražavaju stupce baze podataka: alast_namestupac automatski dovodi last_nameatribut u postojanje.

U posebnim slučajevima, kada konvencije ne zadovoljavaju vaše potrebe, i dalje možete dodati konfiguraciju, koristeći čisti Ruby kôd ili lagani YAML format sličan Rubyu, koji izostavljaju XML suvišne zagrade i zaključne oznake. No, trebali biste se držati zadanih vrijednosti kad god je to moguće. Rails je "softverski softver", što znatno olakšava rad u tijeku.

Rails je okvir "uključene baterije" (fraza koju je popularizirao Python): uključuje sve što je potrebno za standardnu ​​web-aplikaciju poduprtu bazom podataka, od sloja za pristup podacima, preko modela, pogleda i kontrolera. Omogućuje vam da se usredotočite na ono što je specifično za vašu aplikaciju, umjesto da prekodirate uobičajene funkcije ili potražite biblioteke otvorenog koda koje se dobro integriraju.

Dinamičnost i promišljanje

Java okviri također se kreću prema većoj uporabi refleksije i metaprogramiranja. Proljeće, na primjer, koristi refleksiju za spajanje svih njegovih dijelova zajedno s ubrizgavanjem ovisnosti, za razliku od statičnijeg pristupa standardnog Java EE poslužiteljskog snopa. Hibernate, popularni objektno-relacijski okvir za mapiranje, svoje mapiranje vrši dinamičkim metaprogramiranjem, ažuriranjem bajtkoda tijekom izvođenja, za razliku od ranih okvira za pristup podacima, koji su u vrijeme razvoja zahtijevali glomazan izvorni kod ili bajt kod.

Programeri Hibernate-a morali su koristiti neke napredne tehnike da bi postigli ovu funkcionalnost, ali u Ruby-u je metaprogramiranje toliko prirodan dio jezika da Rails u vrijeme izvođenja dinamički generira ne samo mapiranja, već i definicije klasa poslovnog sloja potrebne za pristup i prikazati temeljnu bazu podataka, čime se minimalizira potreba za ručnim kodiranjem ili stvaranjem nefleksibilnog generiranog koda.

Podržavanje procesa razvoja

Otprilike krajem devedesetih, Java programeri su se "testirali" s JUnit okvirima, ali pisanje testova za aplikacije na poslužitelju uvijek je bilo teško. Spring sada generira testove zajedno s web aplikacijom. Rails čini isto, iskorištavajući dinamičnost i metaprogramiranje za podršku više vrsta testova: jedinični testovi koji koriste pojedinačne metode klasa modela; funkcionalni testovi koji rade na razini pojedinačnog web zahtjeva; i integracijski testovi koji pokreću niz web zahtjeva u simuliranoj korisničkoj sesiji.

Popularni alati Ant i Maven standardizirali su automatizaciju gradnji u Javi. Šine, također, čini gradi lako s Ruby grablje graditi alata; dodaje inovativni sustav migracije, koji automatizira nadogradnju (ili vraćanje) shema baze podataka i podataka.