JRuby on Rails: la potenza di Java, la semplicità di Ruby on Rails

Ruby, il linguaggio dinamico (scripting) orientato agli oggetti completo, con un forte supporto per la programmazione funzionale e la metaprogrammazione, ha recentemente attirato l'attenzione per la sua flessibilità e facilità di sviluppo. JRuby, un interprete basato su JVM per Ruby, combina la facilità del linguaggio Ruby con l'esecuzione nella potente JVM, inclusa la piena integrazione da e verso le librerie Java.

Dal mio precedente articolo su JavaWorld sull'argomento ("JRuby for the Java World"), ci sono stati alcuni sviluppi entusiasmanti per JRuby. Sun Microsystems ha assunto i due sviluppatori principali di JRuby, Charles Nutter e Thomas E. Enebo, in segno di supporto per Ruby nella JVM. Java Platform, Standard Edition 6 (Java SE 6) è stato rilasciato con una nuova API standard per il collegamento di interpreti per linguaggi dinamici. Si stanno consolidando i piani per Java 7 VM per supportare direttamente i linguaggi dinamici con un nuovo bytecode "invoke dynamic" e hot-swapping delle definizioni di classe in fase di runtime. Nel frattempo, il team di JRuby ha rilasciato la versione 0.9.2 con un supporto più ampio per Ruby on Rails, e il prossimo grande rilascio di JRuby, previsto a febbraio, includerà il pieno supporto per Ruby on Rails.

Ruby on Rails, un framework Web facile da usare ma potente basato sul linguaggio Ruby, ha rapidamente guadagnato popolarità per le nuove applicazioni Web basate su database, specialmente nel mondo Web 2.0. Ti rimando altrove per i dettagli su Ruby on Rails, chiamato anche Rails. Anche se il progetto ha solo 3 anni, sono stati scritti molti articoli e libri a riguardo e la sua documentazione è eccezionale per un progetto open source (vedere il sito Web Ruby on Rails). Allo stesso modo, ti rimando al mio articolo precedente per un'introduzione a JRuby.

In questo articolo, esamino la giunzione tra Rails e Java. Confronto i framework Rails e Java Web, descrivo i vantaggi di eseguire Rails con JRuby e rivedo alcune lezioni che uno sviluppatore Java - anche uno che non usa Rails - può imparare da questo framework innovativo.

Potenza più semplicità

Rails accelera e semplifica radicalmente lo sviluppo di applicazioni Web, ma soffre di un'immagine di immaturità, soprattutto nelle capacità aziendali di fascia alta.

D'altra parte, la piattaforma Java, con le sue macchine virtuali, librerie e server applicativi, sta guadagnando velocità, stabilità e funzionalità, al punto da essere generalmente considerata la piattaforma leader per applicazioni server di fascia alta. Tuttavia, fintanto che rimane legata al linguaggio Java, la piattaforma Java rischia di rimanere indietro poiché i nuovi linguaggi guadagnano popolarità.

JRuby unisce i punti di forza complementari di tutte queste tecnologie, promettendo una maggiore popolarità sia per Ruby che per Rails, dando alla piattaforma Java un nuovo ruolo nell'esecuzione di linguaggi non Java.

Rails: dove stanno andando i framework Java

Per uno sviluppatore Java, Rails sembra il culmine naturale delle tendenze nell'evoluzione dei framework Web Java: meno codice inutile, più astrazione e dinamismo e funzionalità più complete pronte all'uso.

Convenzione sulla configurazione

Le prime versioni di Java Platform, Enterprise Edition (Java EE) richiedevano una configurazione e un codice estesi per ogni componente. Enterprise JavaBeans, ad esempio, aveva più file di configurazione XML e codice sorgente per ogni bean. Questa complessità ha trasformato EJB in un sinonimo di sviluppo pesante e alla fine ha portato a una svolta di 180 gradi in EJB 3, che mira a bean POJO (semplici oggetti Java) con ridondanza e configurazione minime. Anche così, le applicazioni Java EE pesanti richiedono ancora agli sviluppatori di sviluppare codice per esprimere gli stessi oggetti di business su più livelli software: GUI, logica di business e persistenza. Quindi, nonostante la ridondanza e la somiglianza tra i livelli, gli sviluppatori devono incollare i livelli insieme ai file di configurazione. In contrasto,i più recenti framework Java Web Seam e Spring espongono oggetti di business con molta meno configurazione e codice.

I framework Java si sono anche spostati verso la standardizzazione e l'integrazione di uno stack tra i livelli di un'applicazione Web. Nei primi giorni, gli sviluppatori di applicazioni Web Java codificavano manualmente l'output HTML dei servlet, creavano le proprie architetture Model-View-Controller e accedevano ai propri database con SQL su Java Database Connectivity (JDBC). Successivamente, hanno raccolto componenti per eseguire gran parte delle funzionalità comuni, come le librerie di tag, Struts e Hibernate. Di recente, Spring ha integrato gran parte delle funzionalità in un unico stack leggero dall'alto verso il basso.

Fin dall'inizio, Rails ha incarnato questi principi di semplicità, principi noti alla comunità di Rails come "Don't Repeat Yourself" e "Convention over Configuration". (La non ridondanza e le impostazioni predefinite significative sono tra i principi più antichi dell'ingegneria del software; è sorprendente che abbiamo dovuto aspettare così a lungo per qualcosa come Rails.) Il framework ipotizza la connessione tra i diversi livelli sulla base di convenzioni semplici. Ad esempio, non c'è bisogno di XML, annotazioni o simili, per dire al framework che la classe del cliente è supportata dalla customerstabella; Il livello di wrapping del database ActiveRecord di Rails lo indovina (tenendo conto della pluralizzazione e delle maiuscole). Rails arriva al punto di aggiungere implicitamente e dinamicamente attributi per riflettere le colonne del database: alast_namecolonna porta automaticamente last_namein essere un attributo.

In casi speciali, in cui le convenzioni non soddisfano le tue esigenze, puoi comunque aggiungere la configurazione, utilizzando il codice Ruby puro o il formato YAML leggero simile a Ruby, entrambi omettono le parentesi ridondanti ei tag di chiusura dell'XML. Ma dovresti attenersi alle impostazioni predefinite ove possibile. Rails è un "software supponente", che rende molto più facile quando segui il flusso.

Rails è un framework "batterie incluse" (una frase resa popolare da Python): include tutto il necessario per un'applicazione Web standard basata su database, dal livello di accesso ai dati, attraverso il modello, la vista e il controller. Ti consente di concentrarti su ciò che è specifico della tua applicazione, invece di ricodificare funzionalità comuni o cercare librerie open source che si integrano bene insieme.

Dinamismo e riflessione

I framework Java si stanno anche muovendo verso un maggiore utilizzo della riflessione e della metaprogrammazione. Spring, ad esempio, utilizza la riflessione per collegare tutti i suoi pezzi insieme all'inserimento delle dipendenze, in contrasto con l'approccio più statico dello stack di server Java EE standard. Hibernate, il popolare framework di mappatura relazionale a oggetti, esegue la mappatura con metaprogrammazione dinamica, aggiornando il bytecode in fase di runtime, in contrasto con i primi framework di accesso ai dati, che richiedevano ingombranti codice sorgente o generazione di bytecode in fase di sviluppo.

Gli sviluppatori di Hibernate hanno dovuto utilizzare alcune tecniche avanzate per realizzare questa funzionalità, ma in Ruby, la metaprogrammazione è una parte così naturale del linguaggio che Rails, in fase di esecuzione, genera dinamicamente non solo i mapping, ma anche le definizioni di classe del livello aziendale necessarie per accedere e visualizzare il database sottostante, riducendo così al minimo la necessità di codifica manuale o la creazione di codice generato non flessibile.

Supportare il processo di sviluppo

Verso la fine degli anni '90, i programmatori Java sono stati "infettati dai test" con i framework JUnit, ma scrivere test per le applicazioni lato server è sempre stato difficile. Spring ora genera test insieme all'applicazione Web. Rails fa lo stesso, sfruttando dinamismo e metaprogrammazione per supportare molteplici tipologie di test: unit test, che esercitano i metodi individuali delle classi modello; test funzionali, che lavorano a livello della singola richiesta Web; e test di integrazione, che eseguono una serie di richieste Web in una sessione utente simulata.

I popolari strumenti Ant e Maven hanno standardizzato l'automazione delle build in Java. Anche Rails semplifica le build con lo strumento di build rake di Ruby ; aggiunge un innovativo sistema di migrazione, che automatizza l'aggiornamento (o il rollback) di schemi e dati di database.