Ruby on Rails: il framework MVC per applicazioni web complesse
Nel 2004 l’azienda americana dedita allo sviluppo di applicazioni web 37signals (oggi Basecamp) rilasciò l’applicazione per la gestione dei progetti Basecamp, che conteneva, tra le altre, funzioni come la to-do list, il time tracking e un sistema per lo scambio di messaggi. Faceva parte del software un’architettura informatica di base, creata dal programmatore David Heinemeier Hansson proprio per questo scopo, compilata ancora in quello stesso anno e rilasciata nel 2005 come framework per applicazioni web indipendente e open source. Il nome dell’architettura sviluppata in Ruby e oggi più conosciuta è Ruby on Rails, in acronimo RoR o anche solo Rails. Nessuno aveva previsto il fatto che il framework, di cui ora se ne occupa un intero team di sviluppo, sarebbe stato sviluppato fino al punto di diventare una delle soluzioni più richieste per la creazione di nuove applicazioni web.
Cos’è Ruby on Rails?
Dal momento che Ruby on Rails era rilasciato all’epoca con licenza MIT, i programmatori hanno sviluppato ulteriormente e costantemente il framework. Fino ad oggi la filosofia di base è rimasta la stessa: il principio “Don’t repeat yourself” (DRY, cioè “non ripeterti”) resta sempre valido. Quindi ogni informazione dovrebbe essere presente in un progetto basato sul framework Rails solo una volta. Così, ad esempio, basta definire le colonne di una tabella solo nel database, senza registrare queste informazioni anche nel codice sorgente o in un file di configurazione separato. Il modulo ActiveRecord implementato legge le direttive direttamente dal database.
Il secondo paradigma del design è la “Convention over configuration” (cioè “convenzione prima della configurazione”). Il framework RoR stabilisce quindi precise convenzioni, ad esempio nella denominazione delle classi. Se gli sviluppatori si attengono a queste convenzioni, si risparmia molto lavoro durante la configurazione. Ma Ruby on Rails permette anche configurazioni alternative, ragion per cui la flessibilità resta completamente intatta nella programmazione della vostra web app.
Ruby: un linguaggio flessibile e multipiattaforma del framework Rails
Nella metà degli anni ’90, il giapponese Yukihiro Matsumoto rilasciò il linguaggio di programmazione orientato agli oggetti Ruby. Inizialmente usato solo in Giappone, questo linguaggio di scripting si è nel frattempo affermato in tutto il mondo come un’alternativa amata rispetto ai leader del mercato PHP, Python, ecc. Questo successo non è però nato per puro caso: Matsumoto ha stabilito come obiettivo principale il divertimento continuo nella programmazione e quindi ha combinato le migliori proprietà degli altri linguaggi in Ruby. In quanto linguaggio di scripting interpretato, il codice viene eseguito da un interprete, che sebbene comporti una piccola diminuzione della velocità al contrario degli script precompilati, lo rende anche decisamente più flessibile e dinamico. Dal momento che per tutti i sistemi operativi comuni esistono interpreti specifici, il codice Ruby può essere utilizzato grazie a questo aspetto su tutti i tipi di piattaforma. Una caratteristica molto importante di Ruby è la capacità multiparadigma, che contraddistingue ad esempio anche il linguaggio C++. Quindi non siete legati ad un paradigma di programmazione specifico. Grazie al “principle of least astonishment” (letteralmente “principio della minima sorpresa”) usate il linguaggio di scripting in maniera intuitiva e, di regola, non incorrete in comportamenti inaspettati. Ruby, software open source con licenza libera BSD, gode di una community grande e molto attiva, che ha contribuito a numerose e attuali librerie software, che per la maggior parte sottostanno alla stessa licenza e giocano un ruolo importante nella programmazione delle applicazioni web più moderne, che si lasciano installare, utilizzare e aggiornare con l’aiuto di RubyGems. Uno di questi Gems, tra i quali si contano ad esempio anche le web API di Google e Facebook, è il framework Rails.
Model-View-Controller (MVC)
Gli ambienti di runtime di Ruby on Rails sono sistemi chiusi, che contengono l’interprete, le librerie di software necessarie e i rispettivi script. Ogni sito con Rails sottostà ad una struttura di directory generata automaticamente, nella quale gli script, le configurazioni, le classi, i contenuti ecc. sono divisi tra loro. Grazie a questo modo di procedere strutturale per gestire separatamente i dati e i loro adattamenti così come la loro forma di presentazione, le applicazioni web sono facili da usare. Si parla anche di pattern architetturale Model-View-Controller (Modello-Vista-Controllo), dove i suoi componenti principali si possono descrivere come di seguito:
Model
Di solito le applicazioni Rails sono collegate a database relazionali. Per comunicare con il rispettivo Database Management System e preparare o manipolare i dati inseriti, sono necessari i modelli del framework Ruby, che rappresentano le classi in una tabella di un database e i singoli attribuiti sulle colonne appropriate. Il componente “Model” si basa di solito su un framework ORM (object-relational mapping) ActiveRecord. A partire dalla versione Rails 3.0 potete utilizzare, grazie all’implementazione dell’API per i plug-in, anche altre librerie ORM, come Sequel.
View
Il componente “View” ha bisogno del framework per accedere ai dati del modello e presentarli graficamente. Per questo scopo, Ruby on Rails usa la classe Action View, che supporta diversi formati di output. Resi sotto forma di documenti HTML, i view presentano i rispettivi dati, ad esempio agli utenti che ne fanno richiesta. I documenti XML o JSON servono inoltre per rendere disponibile l’accesso ai dati sul database per altri programmi o servizi.
Controller
I controller sono il punto di contatto tra il modello e il view. Elaborano le richieste in entrata attraverso il browser, utilizzano i modelli corrispondenti del database e li inoltrano al view, che si preoccupa di renderli visualizzabili. Inoltre, in quanto unità di controllo centrale delle applicazioni Rails, i controller gestiscono anche il comportamento di caching o sintetizzano in una sessione diverse richieste di un singolo client, effettuate in un certo intervallo di tempo.
Componenti standard del framework RoR
In quanto framework per applicazioni web, Ruby on Rails mette già a disposizione nella configurazione standard tutti i componenti di cui avete bisogno per programmare un’applicazione ricca di funzioni. Gli unici ulteriori prerequisiti sono che Ruby, il gestore di pacchetti RubyGems e il database SQL siano installati. Per quanto riguarda l’ultimo elemento, il team di Rails consiglia SQLite, la libreria open source scritta in C, che contiene un database relazionale. Questi sono i moduli standard del framework di Ruby on Rails:
- Action Controller: con l’aiuto del modulo Action Controller create i punti di contatto menzionati tra i dati del database, gli utenti che vi accedono e i programmi.
- Action View: Action View vi offre la possibilità di creare view per i singoli dati e controller. Per quanto concerne l’assegnazione del nome, per convenzione tutte le view devono essere riconosciute dal rispettivo controller.
- Active Record: si tratta di un modulo centrale di manipolazione del database della vostra applicazione Rails. Per creare i singoli modelli con il suo aiuto, il lavoro di configurazione richiesto è minimo, se vi attenete alle convenzioni relative alla denominazione e allo schema. Ruby on Rails offre per questo scopo con l’aiuto della procedura scaffolding (letteralmente impalcatura) lo strumento ottimale per creare interfacce per le quattro operazioni CRUD, che presentano i dati aggiornati sul livello orientato agli oggetti.
- Active Resource: questo modulo implementa l’Object Relational Mapping (ORM) per i servizi REST. Come Active Record si concentra su queste componenti anche per risparmiare nella configurazione.
- Action Mailer: Action Mailer permette di inviare e ricevere e-mail con la vostra applicazione. In questo modo potete configurare in maniera semplice la registrazione e il login dell’e-mail.
- Active Support: il modulo Active Support contiene diverse classi utili di programmi di utilità ed estensioni di libreria standard.
- Railties: affinché tutti i componenti del framework RoR funzionino insieme, ci sono i cosiddetti railties. Ogni modulo ha implementato per questa ragione il proprio railtie per iniziare, ad esempio, il processo di inizializzazione o poter apportare modifiche alle impostazioni del framework. Inoltre i railties sono necessari per aggiungere alcuni moduli a Ruby on Rails.
Ruby on Rails: vantaggi e svantaggi del framework
Quando si parla di Ruby on Rails, ci si riferisce spesso a questa storiella:
- Due sviluppatori discutono sui diversi linguaggi di programmazione. Il primo dice: “Io lavoro con Java, PHP lo usano i miei figli per giocare.” E il secondo risponde: “Io gioco con i miei bambini e faccio lavorare Ruby al posto mio!”.
Naturalmente dietro a questa storiella c’è una buona dose di esagerazione, ma anche un fondo di verità. Java è adatto per realizzare siti complessi e di ottima qualità, infatti si usa spesso come framework negli e-commerce. Programmare con un linguaggio multipiattaforma, è però spesso tutt’altro che semplice per via della sua struttura complessa e, di regola, richiede molto impegno e tempo. Anche Ruby, in quanto linguaggio di scripting interpretato, non è legato ad alcuna piattaforma specifica ma, allo stesso tempo, si scrive molto più velocemente, è più facilmente personalizzabile e molto più leggero. Ma la velocità delle applicazioni sviluppate con Ruby on Rails è più lenta rispetto a quelle simili realizzate in JavaScript.
Anche PHP, se confrontato con Java, ha dei chiari vantaggi per quanto riguarda la semplicità e l’impegno richiesto nello sviluppo. Non a caso infatti PHP si è stabilito come soluzione standard, che tra l’altro costituisce la base di diversi CMS come WordPress, TYPO3 e Joomla. Tenendo conto del fatto che PHP era composto arbitrariamente e non era sempre orientato agli oggetti, gli upgrade delle applicazioni web, che sono stati sviluppati con versioni precedenti, si configurano in maniera più faticosa. Fin dall’inizio Ruby on Rails era interamente programmato orientato agli oggetti, perciò le applicazioni, che sono programmate con l’aiuto di versioni vecchie, contengono di solito codici più puliti rispetto ai progetti PHP simili.
Ruby on Rails contiene un framework integrato, con l’aiuto del quale si può testare in ogni momento il funzionamento della vostra applicazione, individuando ed risolvendo fin dall’inizio gli errori. Le tecniche del web 2.0 come AJAX sono utilizzabili solo inserendo poche righe. Inoltre Ruby e il framework Rails godono di una community sempre più vasta e in crescita, come testimonia anche la maggiore scelta delle estensioni.
La filosofia innovativa di Rails, cioè il perseguire la semplificazione maggiore possibile per lo sviluppatore, che Matsumoto ha cercato sin dall’inizio con funzioni come lo scaffolding, le convenzioni stabilite o la struttura MVC, serve da modello anche per molti altri nuovi framework. Così l’approccio si ritrova tra l’altro nei framework PHP Symfony, CakePHP e Zend.
Per chi è adatto il framework Ruby?
Ruby on Rails offre tutto ciò di cui uno sviluppatore ha bisogno per la creazione di una web app moderna: architetture di qualità per realizzare l’interfaccia, una connessione facile da configurare e collegare al database SQL e la possibilità di configurare tecnologie web come AJAX. I principi chiari “Don’t repeat yourself” e “Convetion over configuration” offrono le basi per programmare un codice pulito, facilmente comprensibile ed personalizzabile nel migliore dei modi, che si scrive anche in fretta. Ma alcune configurazioni sono possibili senza problemi perché Ruby offre tutte le libertà di cui ha bisogno un programmatore. Quindi il framework è adatto sia per i principianti che anche per i programmatori esperti che fino a quel momento hanno lavorato con altri linguaggi di scripting, anche se in entrambi i casi dovrebbe essere messo in conto un certo dispendio di tempo per imparare ad usarlo. Grazie al sistema scaffolding sono realizzati prototipi dei siti web pianificati in pochissimo tempo: questo è chiaramente uno dei punti di forza maggiori del framework Ruby. Grazie all’ambiente di test integrato, verificate che le vostre applicazioni non contengano possibili errori già durante la fase di sviluppo. Ruby on Rails si dimostra predisposto anche per applicazioni complesse. Con l’aiuto di estensioni, chiamate RubyGems, tra le quali rientra anche il framework stesso, aggiungete facilmente le interfacce necessarie, le librerie o le feature funzionali e grafiche. Dal momento che Ruby e il framework RoR sottostanno alla licenza libera BSD, i soli costi che ne derivano sono quelli dell’hosting del sito web. Ma non dovreste presumere che per Ruby on Rails non dobbiate disporre di alcuna conoscenza di programmazione. Naturalmente, a differenza di quanto affermato dalla storiella degli sviluppatori raccontata sopra, il linguaggio di scripting non si fa carico di tutto. In termini di velocità, le applicazioni sviluppate con RoR non possono tener completamente testa alla concorrenza. Il codice si esegue solo quando l’utente accede ai contenuti, perché l’elaborazione delle richieste in entrata dura ovviamente un po’ di più rispetto alle righe di codice precompilate. Inoltre dovete fare a meno del framework Rails, se volete gestire le vostre applicazioni con CMS come Drupal, Joomla o WordPress. Gli esempi citati si basano, come anche altre piattaforme, su PHP. Ma esistono già CMS basati su Ruby on Rails, come ad esempio Alchemy CMS. È difficile immaginare che RoR si diffonda al punto tale da mettere in difficoltà lo status dei leader del mercato PHP, Java e Python. In ogni caso, i vantaggi e la crescente popolarità del framework Ruby sono innegabili.