Ruby, plně vybavený objektově orientovaný dynamický (skriptovací) jazyk se silnou podporou funkčního programování a metaprogramování, nedávno upozornil na svou flexibilitu a snadný vývoj. JRuby, tlumočník založený na JVM pro Ruby, kombinuje snadnost jazyka Ruby s výkonem ve výkonném JVM, včetně plné integrace do a z knihoven Java.
Od mého předchozího JavaWorld článek na toto téma („JRuby pro svět Java“), došlo k některým vzrušujícím vývojům pro JRuby. Sun Microsystems najal dva hlavní vývojáře JRuby, Charles Nutter a Thomas E. Enebo, na znamení podpory Ruby v JVM. Byla vydána platforma Java Standard Edition 6 (Java SE 6) s novým standardním API pro připojení tlumočníků pro dynamické jazyky. Zpracovávají se plány pro virtuální počítač Java 7 pro podporu dynamických jazyků přímo s novým "vyvolat dynamický" bytecode a hot-swapping definic tříd za běhu. Tým JRuby mezitím vydal verzi 0.9.2 s širší podporou Ruby on Rails a další velké vydání JRuby, které se očekává v únoru, bude zahrnovat plnou podporu Ruby on Rails.
Ruby on Rails, snadno použitelný, ale výkonný webový rámec postavený na jazyce Ruby, rychle získal popularitu nových webových aplikací podporovaných databází, zejména ve světě Web 2.0. Odkázám vás jinde na podrobnosti o Ruby on Rails, nazývané také Rails. Přestože je projekt starý jen 3 roky, bylo o něm napsáno spousta článků a knih a jeho dokumentace je vynikající pro open source projekt (viz web Ruby on Rails). Podobně vás odkazuji na můj dřívější článek s úvodem do JRuby.
V tomto článku zkoumám spojení mezi Rails a Java. Porovnávám webové rámce Rails a Java, popisuji výhody běhu Rails s JRuby a zkoumám několik lekcí, které si z tohoto inovativního rámce může vzít vývojář Java - i ten, kdo Rails nepoužívá.
Síla a jednoduchost
Rails radikálně zrychluje a zjednodušuje vývoj webových aplikací, ale trpí obrazem nezralosti, zejména pokud jde o špičkové schopnosti podnikové síly.
Na druhou stranu platforma Java se svými virtuálními stroji, knihovnami a aplikačními servery získává na rychlosti, stabilitě a funkčnosti až do bodu, kdy je obecně považována za přední platformu pro špičkové serverové aplikace. Přestože platforma Java zůstane vázána na jazyk Java, riskuje, že s rostoucí popularitou nových jazyků zaostane.
JRuby spojuje vzájemně se doplňující silné stránky všech těchto technologií a slibuje přidanou popularitu pro Ruby i Rails a zároveň dává platformě Java novou roli při spouštění jiných jazyků než Java.
Rails: Kam směřují rámce Java
Vývojáři Java se Rails jeví jako přirozené vyvrcholení trendů ve vývoji Java Web frameworků: méně zbytečného kódu, více abstrakce a dynamiky a plnější funkce ihned po vybalení.
Konvence nad konfigurací
Dřívější verze platformy Java Platform, Enterprise Edition (Java EE) vyžadovaly rozsáhlou konfiguraci a kód pro každou komponentu. Například Enterprise JavaBeans měla pro každou fazole více konfiguračních souborů zdrojového kódu a XML. Tato složitost proměnila EJB v slovo pro vývoj těžké váhy a nakonec vedla k obratu v EJB 3 o 180 stupňů, jehož cílem jsou fazole POJO (prosté staré objekty Java) s minimální redundancí a konfigurací. I přesto těžké aplikace Java EE stále vyžadují, aby vývojáři vyvinuli kód pro vyjádření stejných obchodních objektů na více softwarových úrovních - GUI, obchodní logika a vytrvalost. Poté, přes redundanci a podobnost mezi vrstvami, musí vývojáři slepit vrstvy společně s konfiguračními soubory. Naproti tomu novější webové platformy Java Seam a Spring vystavují obchodní objekty s mnohem menší konfigurací a kódem.
Rámec Java také směřují ke standardizaci a integraci zásobníku napříč vrstvami webové aplikace. V prvních dnech vývojáři webových aplikací Java ručně kódovali výstup HTML z servletů, vytvořili vlastní architektury Model-View-Controller a přistupovali ke svým databázím pomocí SQL přes Java Database Connectivity (JDBC). Později shromáždili komponenty k provádění většiny běžných funkcí, jako jsou knihovny značek, Struts a Hibernate. Nedávno Spring integroval většinu funkcí do jediného lehkého stohu shora dolů.
Rails od začátku ztělesňuje tyto principy jednoduchosti, principy známé komunitě Rails jako „Don't Repeat Yourself“ a „Convention over Configuration“. (Neredundance a smysluplné výchozí hodnoty patří mezi nejstarší principy softwarového inženýrství; je divu, že jsme museli tak dlouho čekat na něco jako Rails.) Rámec odhaduje spojení mezi různými úrovněmi na základě přímých konvencí. Například není potřeba XML, anotací apod., Aby se rozhraní řeklo, že třída zákazníka je podpořena zákazníky
stůl; To hádá vrstva Rails ActiveRecord pro zabalování databáze (při zohlednění pluralizace a velkých písmen). Rails jde tak daleko, že implicitně a dynamicky přidává atributy, které odrážejí databázové sloupce: a příjmení
sloupec automaticky přináší a příjmení
atribut do bytí.
Ve zvláštních případech, kdy konvence nesplňují vaše potřeby, můžete stále přidat konfiguraci pomocí čistého kódu Ruby nebo odlehčeného formátu YAML podobného Ruby, přičemž oba vynechávají redundantní závorky XML a uzavírací značky. Pokud je to možné, měli byste se držet výchozích hodnot. Rails je „názorný software“, díky kterému je to mnohem snazší, když jdete s proudem.
Rails je rámec „z baterií“ (fráze popularizovaná Pythonem): zahrnuje vše, co potřebujete pro standardní webovou aplikaci podporovanou databází, od vrstvy pro přístup k datům, přes model, pohled a řadič. Umožňuje vám soustředit se na to, co je specifické pro vaši aplikaci, místo překódování běžných funkcí nebo hledání knihoven otevřených zdrojů, které se dobře integrují.
Dynamika a reflexe
Rámec Java také směřuje k většímu využívání reflexe a metaprogramování. Jaro například používá reflexi k připojení všech svých částí společně s injekcí závislostí, na rozdíl od statičtějšího přístupu standardního zásobníku serveru Java EE. Hibernate, populární rámec objektově-relačního mapování, provádí své mapování pomocí dynamického metaprogramování, aktualizuje bytecode za běhu, na rozdíl od časných frameworků pro přístup k datům, které v době vývoje vyžadovaly těžkopádné generování zdrojového kódu nebo bytecode.
Vývojáři Hibernate museli k dosažení této funkce použít některé pokročilé techniky, ale v Ruby je metaprogramování tak přirozenou součástí jazyka, že Rails za běhu dynamicky generuje nejen mapování, ale také definice tříd obchodní vrstvy potřebné pro přístup a zobrazit podkladovou databázi, čímž se minimalizuje potřeba ručního kódování nebo vytváření nepružného generovaného kódu.
Podpora procesu vývoje
Kolem konce 90. let byli programátoři Java „testováni“ rámci JUnit, ale psaní testů pro aplikace na straně serveru bylo vždy obtížné. Jaro nyní generuje testy společně s webovou aplikací. Rails dělá totéž, využívá dynamiky a metaprogramování k podpoře více typů testů: testy jednotek, které procvičují jednotlivé metody modelových tříd; funkční testy, které fungují na úrovni jednotlivých webových požadavků; a integrační testy, které spouští řadu webových požadavků v simulované relaci uživatele.
Populární nástroje Ant a Maven standardizovaly automatizaci sestavení v Javě. Rails také usnadňuje stavění s Ruby's hrábě nástroj pro sestavení; přidává inovativní migrační systém, který automatizuje upgrade (nebo vrácení) databázových schémat a dat.