|
È molto più bello sapere qualcosa di tutto, che tutto di
una cosa
|
|
| Home Page |
|
| Articoli |
|
| News |
|
| Forum |
|
| Classi |
|
|
|
|
|
XMoon : un framework per ottimizzare i tempi di sviluppo.
By
Mario Neè
7 giugno 2005
|
 |
|
Come spesso accade, per chi sviluppa applicazioni, si affrontano progetti dai tempi molto brevi e/o dai requirement che mutano durante la fase di sviluppo. Davanti ad una simile situazione è molto utile avere gli strumenti adeguati per ottenere un'applicazione reattiva ai cambiamenti provenienti dall'esterno in modo del tutto indolore per lo sviluppatore e al tempo stesso veloce da realizzare. Partendo da queste necessità è stato pensato e realizzato XMoon ( http://www.xmoon.it), un progetto opensource che ha lo scopo di rendere la fase di sviluppo e debug semplice e veloce. XMoon riesce ad ottenere questi risultati combinando due fattori : sfruttando oggetti dinamici a runtime insieme ad un linguaggio interpretato.
|
|
|
Panoramica del framework
|
top
|
|
Il framework segue il paradigma MVC "model view controller", ereditato direttamente da Struts, dove i ruoli di presentation, control e business logic vengono affidati a componenti diversi e sono tra di loro disaccoppiati, con evidenti vantaggi in termini di riusabilità, manutenibilità, modularità e qualità. XMoon definisce sia il business logic (Controller) che i business object (Model) con dei file xml traendo tutti i vantaggi da questo linguaggio che offre una maggiore flessibilità, compatibilità e portabilità rispetto a qualsiasi altro linguaggio. <?xml version="1.0" encoding="ISO-8859-1"?> <service> <task> <code> print("hello world !"); </code> </task> </service> Il livello di presentazione è affidato a Velocity, una delle migliori soluzioni per la creazione di template dinamici. (http://jakarta.apache.org/velocity/index.html) Velocity utilizza la sintassi del linguaggio di templating (Vtl, Velocity Template Language). Questo tipo di sintassi è estremamente ridotta e copre essenzialmente l'impostazione di variabili, cicli, istruzioni condizionali, macro, inclusione di file e d'altri template. A confronto delle jsp si ha una maggiore leggibilità del codice che risulta molto più compatto, efficiente e di facile comprensione.
Fig 1 Panoramica del framework
|
|
Business object
|
top
|
|
Alla base del sistema di XMoon troviamo un meta-oggetto denominato Obj, rappresentante le caratteristiche dell'istanza di un altro oggetto. Vediamo qui di seguito un esempio: <obj scope="session"> <dynadescriptor>Cliente</dynadescriptor> <init> data_creazione = new Date(); me.set("data_creazione", data_creazione) </init> </obj> In questo esempio stiamo inizializzando un obj cliente.xml che avrà uno scope di tipo sessione e si legherà ad un altro oggetto che è il Dynadescriptor, ossia il descrittore dei campi del nostro cliente che vedremo in seguito. All'intermo del tag <init> abbiamo la possibilità di scrivere come deve essere inizializzato ogni obj cliente. Nel nostro caso viene inizializzato l'attributo data creazione con la data attuale del sistema. <dynadescriptor> <field type="value"><name>id</name></field> <field type="value"><name>nome</name></field> <field type="value"><name>cognome</name></field> <field type="value"><name>citta</name></field> <field type="value"><name>data_creazione</name></field> </dynadescriptor> Il Dynadescriptor è un modo potente e dinamico di descrivere oggetti senza nemmeno scrivere una riga di codice Java. I campi di questo oggetto possono essere facilmente modificati o letti tramite semplice metodi set e get; per cui se volessimo settare il nome dell'oggetto cliente basterebbe scrivere : cliente.set("nome", "Gianni"). L'Obj oltre a legarsi ai dynadescriptor può anche istanziare le comuni classi java nel seguente modo: <obj scope="session"> <class>it.prova.Cliente</class> </obj>
|
|
Business logic
|
top
|
|
Sempre all'interno di file xml troviamo come si muoverà la nostra applicazione grazie ad un linguaggio di programmazione interpretato che utilizza come interprete Beanshell http://www.beanshell.org. L'interprete è un programma in grado di leggere un sorgente in un certo linguaggio e, istruzione per istruzione, verificarne la sintassi, effettuarne la traduzione in linguaggio macchina e far eseguire al microprocessore della macchina il codice binario generato. L'interprete è inoltre in grado di interrompere spontaneamente l'esecuzione quando rilevi un errore di sintassi, consentire al programmatore la correzione dell'errore e riprendere l'esecuzione dall'istruzione appena modificata. La programmazione interpretata facilita enormemente le varie fasi di sviluppo e correzione del programma. Fig. 2 Business Logic In questo servizio troviamo il tag <obj> dove viene definito quali Obj il sistema andrà a caricare nel contesto del servizio, utilizzando la classe ObjNode che si prende cura di gestire tutti gli Obj seguendo lo scope che essi hanno. Il servizio avrà uno o più task che si possono eseguire in successione e in qualsiasi momento, si potrà fermare la sequenza settando l'attributo execute del WorkBench a false. XMoon offre la possibilità di tenere in cache questi service per aumentare le prestazioni del sistema, nel caso di un'applicazione che giri su un sistema di produzione.
|
|
Integrazione con Struts
|
top
|
|
Per far lavorare i nostri service con struts dovremo aggiungere le seguenti righe al file struts-config.xml <action path="/test" type="it.xmoon.TaskAction"> <forward name="success" path="/test.vm"/> <forward name="error" path="/error.vm"/> </action> TaskAction, in questo esempio, cerca il service test.xml in WEB-INF/xml/service. Viene chiamato a questo punto la classe BshNode che si prenderà cura di gestire i task del service e ritornare un ActionForward.
|
|
Integrazione con Hibernate
|
top
|
|
Come in tutte le applicazioni del mondo reale si ha la necessità di avere un dispositivo in cui vengono salvati i dati, a questo si aggiunge il bisogno di garantirne la concorrenza e l'integrità. Sul mercato ci sono tante buone soluzioni, ma quella di Hibernate rappresenta la più versatile, potente e veloce da utilizzare. Dalla nuova release, la 0.5, è stato aggiunta l'integrazione con hibernate, da ritenersi ancora in fase beta e con alcune aree di miglioramento. All'interno di un service potremo accedere sia all'oggetto Session che Transaction di hibernate rispettivamente con hb e tx all'interno dei nostri service. Nella prossima release si cercherà di rendere maggiore l'integrazione tra il motore di persistenza e l'Obj.
|
|
Esempio
|
top
|
|
Come in tutti gli esempi che si rispettino, anche il nostro scriverà il classico messaggio "hello world" all'interno di una pagina web. Partiamo col creare il service che salvaremo nel file prova.xml : <?xml version="1.0" encoding="ISO-8859-1"?> <service> <task> <code> messaggio = "Hello World!"; </code> </task> </service> Fatto questo dobbiamo configurare il service appena creato nella configurazione di Struts (struts-config.xml), all'interno del tag <action-mappings>. <action path="/prova" type="it.xmoon.TaskAction"> <forward name="success" path="/prova.vm"/> <forward name="error" path="/error.vm"/> </action> Nella configurazione possiamo notare i forward che non sono altro che la "direzione" che vogliamo dare alla nostra richiesta Http dopo che il service è stato eseguito o è terminato in errore. XMoon dopo avere eseguito il task del service prova.xml se non trova un forward definito dall'utente e se il processo è andato a buon fine, assegna un valore il valore di default "success" che nella nostra configurazione và a richiamare il template prova.vm di Velocity. Andiamo ora a scrivere il template prova.vm: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Servizio prova</title> </head> <body> <table> <tr> <td> $messaggio </td> </tr> </table> </body> </html> e questo il risultato finale: Fig. 3 Esempio
|
|
|

Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati sotto licenza Creative Commons
|
|
|