MokaByte 88 - 7mbre 2004 

L'uso della Model Driven Architecture nello Sviluppo di Applicazioni J2EE

II parte: applichiamo la pratica

di
Doriano
Gallozzi

Sviluppare Applicazioni J2EE può essere molto più efficace e produttivo se si utilizza la Model Driven Architecture (MDA), la metodologia definita da Object Management Group. Viene qui presentata una applicazione pratica di MDA al fine di evidenziarne "sul campo" potenzialità e vantaggi.

Introduzione
Nella parte I del presente articolo, si è visto come le diverse problematiche che si incontrano nel processo di sviluppo del software possano essere affrontate in modo integrato utilizzando la Model Driven Architecture (MDA nel seguito), la metodologia definita da Object Management Group (http://www.omg.org/mda/).
MDA prevede la definizione di tre tipologie di modelli, un Platform Independent Model (PIM nel seguito) avente lo scopo di catturare i requisiti di business del sistema da sviluppare, un insieme di Platform Specific Model (PSM nel seguito), ciascuno specifico per una data tecnologia e contenente elementi atti a rappresentarne le particolari caratteristiche, e un Code Model, destinato a contenere tutto il codice che viene sviluppato derivandolo dai diversi PSM di cui al passo precedente.
Nei successivi paragrafi verrà mostrato, su un caso reale, in quale modo l'adozione di MDA permetta di rendere lo sviluppo di un progetto estremamente più efficace, diminuendo sensibilmente tempi e costi, e permettendo di raggiungere una qualità complessiva di quanto viene prodotto molto più elevata.

 

Analisi e modellazione
Per mostrare come possa essere impiegata in pratica la metodologia MDA, vediamo in dettaglio un esempio concreto, tratto dalla vita reale, e quindi non banale.
Si partirà dalla modellazione di un sistema caratterizzato da un PIM relativamente semplice per osservare poi come è possibile pervenire a una serie di PSM relativamente complessi, base per la successiva produzione del codice.
Per chi fosse interessato ad avere maggiori dettagli, l'esempio in questione è ampiamente trattato su http://www.klasse.nl/mdaexplained, da cui è possibile anche scaricare una versione demo.

 

Business requirements
Obiettivo del nostro business è la realizzazione di un completo sistema di composizione e consegna a domicilio di colazioni. Il generico cliente si connette al sito Web della azienda responsabile potendo scegliere, tra le differenti tipologie previste di colazione, quella preferita, e indicando poi data, ora e luogo richiesti per la consegna, oltre al proprio numero di carta di credito. Nell'ambito delle possibilità di scelta che ha il cliente sono previsti differenti tipi di colazioni, da quelle standard a quelle per occasioni speciali, a quelle tipiche di una determinata nazione, e quindi dotate delle varie specialità previste (uova e bacon su quella Inglese, succo di arancia e croissant su quella Francese, decorazioni speciali su quella per il giorno di S. Valentino o di Natale ecc.).
Ciascuna di tali colazioni è disponibile in formato simple, grand e deluxe.
Due volte alla settimana viene effettuato l'inventario di quanto disponibile in magazzino per le diverse preparazioni, fatta salva l'esigenza di approvigionamento di prodotti quali il pane fresco, che va acquistato giornalmente. Come ulteriore facility, ciascun cliente ha la possibilità di personalizzare ulteriormente la propria richiesta, potendo ad esempio decidere, a partire da una determinata colazione-base, di aggiungere o togliere determinati alimenti, come pure di modificare la quantità richiesta di altri.

 

L'applicazione software
Pur comprendendo perfettamente che a questo punto sarà venuto al lettore un certo languorino, occorre ricordare che il nostro principale interesse è incentrato sulle caratteristiche del sistema software destinato a implementare il business descritto. L'obiettivo finale è quello di produrre una applicazione web-based di tipo J2EE three-tier costituita da un DBMS, uno strato mid-tier EJB e una interfaccia utente costituita da JSP. L'applicazione sarà dotata di due differenti interfacce, una per i clienti, l'altra per le persone che lavorano nella azienda fornitrice di colazioni, per avere tutte le necessarie informazioni sul tipo di ordine da evadere e consegna da effettuare. Se il cliente è d'accordo, le sue generalità verranno conservate nel sistema, cosa che permetterà di riconoscere i clienti abituali e di praticare eventuali sconti. Quando un cliente abituale si connetterà al sistema, una lista di ordini già effettuati verrà mostrata, con l'opzione di ripeterli. Il DBMS manterrà le informazioni sui clienti: nome, prezzo e contenuti per ogni tipo di colazione offerta.

 

Applicare MDA - Trasformazioni
Nella figura 1 sono riportati tutti gli elementi del business oggetto del nostro studio. Si può notare come, data l'esigenza di avere tre differenti tecnologie a livello applicativo, si debbano costruire tre differenti PSM, operando tre differenti trasformazioni, e cioè in particolare:

  • una trasformazione dal PIM a un modello relazionale al fine di ottenere, a partire da un modello formale del PIM - espresso in UML - un modello espresso in termini di diagramma ER (Entity-Relationship)
  • una trasformazione dal PIM a un modello EJB al fine di ottenere, a partire da un modello formale del PIM - espresso in UML - un modello espresso in termini di una variante di UML che utilizzi stereotipi particolari per EJB
  • una trasformazione dal PIM a un modello Web al fine di ottenere, a partire da un modello formale del PIM - espresso in UML - un modello espresso in termini di una variante di UML che utilizzi stereotipi particolari per l'interfaccia Web


Figura 1
- Applicazione pratica di MDA
(clicca sull'immagine per ingrandire)

Successivamente, per passare dai tre PSM ai corrispondenti Code Model, sarà necessario poter disporre di:

  • una trasformazione dal modello PSM relazionale agli elementi SQL corrispondenti
  • una trasformazione dal modello EJB PSM relazionale al codice Java corrispondente
  • una trasformazione dal modello Web PSM relazionale ai corrispondenti elementi JSP e HTML

 

Dettaglio sul PIM
Diamo uno sguardo più dettagliato al PIM costruito per modellare il nostro sistema di gestione e consegna colazioni.

Tale modello è stato costruito servendosi del formalismo UML ed è rappresentato in figura 2.


Figura 2
- PIM del sistema di gestione e consegna colazioni
(clicca sull'immagine per ingrandire)


Si noti in particolare come ciascuna colazione (StandardBreakfast) contenga un certo numero di Parti (Part), ciascuna delle quali, a sua volta, indica la quantità di ciascun genere alimentare (Comestible) presente in quella determinata colazione. Il prezzo di ciascuna colazione viene calcolato sulla base del formato prescelto e del prezzo della colazione standard selezionata. Il prezzo complessivo dell'ordine viene ottenuto sommando ai prezzi dei singoli componenti la colazione una quota per la consegna. Si noti che il modello rappresentato definisce il sistema di gestione e consegna colazioni indipendentemente da qualsiasi particolare tecnologia.
In tal senso, è un Platform Independent Model (PIM).

 

Implementazione pratica: utilizzare un tool MDA
Nel presente paragrafo vediamo un esempio di realizzazione pratica dell'applicazione sopra descritta.
Per realizzare il sistema richiesto è stato impiegato lo strumento OptimalJ di Compuware (http://www.optimalj.com o anche http://javacentral.compuware.com per maggiori dettagli), proprio in virtù della sua caratteristica peculiare, e cioè di essere un tool che supporta completamente MDA.
Nella figura 3 viene riportato il modello UML disegnato per implementare il PIM sin qui discusso.


Figura 3
- Modello UML del PIM
(clicca sull'immagine per ingrandire)

Nella successiva figura 4 si può notare come, a partire dal modello UML visto precedentemente, vengano automaticamente generati i corrispondenti PSM per i tre layer DBMS, EJB e Web.


Figura 4 - Generazione dei PSM
(clicca sull'immagine per ingrandire)


È questo un passo particolarmente importante e delicato, giacchè essere in grado di derivare, a partire da un PIM, ossia un modello puramente logico, tanti diversi PSM quante sono le differenti tecnologie prescelte, ciascuno arricchito di tutti gli elementi che gli sono caratteristici, è un processo tutt'altro che banale.
Nella figura 4 è anche visualizzato il Web Diagram, ossia il diagramma delle dipendenze tra gli elementi del web tier (in verde) e quelli dell'EJB tier (in arancio).
A questo punto, il passo successivo consiste nell'effettuare una opportuna trasformazione che, a partire da quanto contenuto nei diversi PSM, derivi tutti i componenti software necessari a costituire l'applicazione completa.
Per quanto descritto precedentemente, tale passo è relativamente diretto, dato che i diversi PSM contengono già tutti gli ingredienti necessari e sufficienti alla costruzione del relativo codice.
Nelle successive figure sono riportati alcuni dettagli di quanto generato.
Scegliendo come elemento di riferimento nel PIM la classe Customer, vediamo nei diversi PSM cosa è stato generato. In particolare:

PSM EJB - Nella figura 5 abbiamo un dettaglio del codice dell'Entity Bean relativo all'elemento Customer.


Figura 5
- Dettaglio di Entity Bean generato
(clicca sull'immagine per ingrandire)

PSM Web - Nella figura 6 è possibile visualizzare uno dei componenti generati a partire dal web component Customer, nel nostro caso si tratta di una Action Class, ossia di uno di quei componenti Java demandati, nell'ambito di determinati scenari architetturali (MVC Struts, nella situazione in esame, cfr [5]) ad eseguire le diverse azioni che l'utente richiede a partire dalla GUI visualizzata nel browser. Nel caso riportato in figura, in particolare, l'azione svolta è quella di browse sul Customer


Figura 6
- Customer Browse Action Class
(clicca sull'immagine per ingrandire)

 

PSM DBMS - Nella figura 7 è riportato il diagramma E-R della applicazione in corso di sviluppo


Figura 7
- Entity Relationship Diagram
(clicca sull'immagine per ingrandire)

mentre nella figura 8 si può esaminare anche uno dei diversi SQL script generati automaticamente al fine di permettere la gestione delle tabelle nel DBMS scelto per il deploy della applicazione. Nel caso riportato in figura il DBMS scelto è Oracle - senz'altro uno dei più diffusi e affidabili - e lo script riportato è quello di Create Tables


Figura 8
- ORACLE SQL Script Create Tables
(clicca sull'immagine per ingrandire)


È chiaro che questo tipo di artifatti prodotti nel PSM DBMS non servono nel caso in cui si tratti di lavorare con un DBMS preesistente, per il quale non avrà senso pensare di utilizzare script di creazione tabelle.

Il codice che è stato generato rispecchia fedelmente tutto quanto è stato modellato nel PIM e successivi PSM da esso derivati. Si può inoltre notare come, durante ciascun passaggio di trasformazione - dal PIM ai PSM e dai vari PSM al Code - ogni elemento di un layer costituisca base per la costruzione di numerosi elementi nel layer successivo (corrispondenza 1-n): ad es., con riferimento alla classe Customer del PIM, ad essa corrispondono n elementi nel PSM EJB, n elementi nel PSM Web, n elementi nel PSM DBMS.

Analogamente, da ciascuno di essi viene derivato un insieme di componenti software (notare ad es. in figura 5, il numeroso insieme di "generated files" corrispondenti ad un singolo elemento del PSM EJB).
Tutto ciò evidenzia una importantissima caratteristica di MDA, e cioè l'elevata capacità di astrazione: è sufficiente lavorare su un elemento di un layer per influenzare
automaticamente le caratteristiche di tutti gli elementi ad esso corrispondenti del layer sottostante.

L'applicazione risultante può a questo punto essere compilata ed eseguita, e permette di effettuare tutte le operazioni base sulle diverse tabelle che costituiscono il database del sistema (si veda, a titolo esemplificativo, la figura 9)


Figura 9
- Main Menu della Applicazione Base
(clicca sull'immagine per ingrandire)


È chiaro d'altra parte che l'applicazione in questione non rappresenta affatto qualcosa di pronto per essere consegnato agli utenti finali perchè mancheranno, in generale, tutta una serie di funzionalità che devono ancora essere aggiunte.
Come procedere allora?


Modifiche all'applicazione generata - L'approccio White Box
L'applicazione base vista in figura 9 è ancora lontana dal poter essere consegnata agli utenti finali. Allo stato attuale essa costituisce un semilavorato completamente funzionante, coerente e ben organizzato, ma pur sempre un semilavorato.
Nascono allora tutta una serie di quesiti:

  • Come si può modificare l'applicazione sin qui ottenuta, intervenendo su quanto presente?
  • Come posso aggiungere nuove funzionalità?
  • E se voglio aggiungere del codice Java scritto ad hoc?
  • Come si può avere garanzia di allineamento tra le diverse parti nei diversi modelli se alcune di esse vengono modificate?
  • E la documentazione?

Queste sono solo alcune delle diverse possibili numerosissime domande che possono venire in mente.
Proviamo a dare una risposta valida per tutte? MDA, naturalmente.
La Model Driven Architecture ci permette, in ogni momento, di intervenire sul semilavorato scegliendo, a seconda dei casi e della esperienza dello sviluppatore, il layer più idoneo ad effettuare la modifica (evolutiva o correttiva) richiesta, di qualunque natura essa sia.
In tal modo, il semilavorato può essere via via arricchito nei propri modelli (PIM, PSM e Code) fornendo, in ogni momento, piena garanzia di allineamento tra tutte le sue parti, e facendo, di conseguenza, evolvere l'applicazione generata, secondo un meccanismo di approssimazioni successive che giustifica in pieno la locuzione white box con cui è possibile contrapporsi alla filosofia black box, così tipica di quegli strumenti CASE che, a suo tempo, videro fallire i propri obiettivi, proprio in virtù della loro rigidità d'uso.

 

Alcuni esempi
Solo a titolo di esempio e senza la pretesa di essere esaustivi, dati anche i limiti imposti dallo spazio a disposizione, proviamo a fornire alcune idee su come affrontare, in ambito MDA, modifiche del tipo di quelle descritte più sopra.

Come si può modificare l'applicazione sin qui ottenuta, intervenendo su quanto presente?
Dipende dal tipo di modifica. Occorre prima di tutto decidere su quale layer effettuarla, tenendo conto del fatto che più "in alto" si va, in termini di astrazione, più semplice sarà intervenire. Se ad esempio desideriamo che un dato campo su una JSP sia visualizzato con determinati attributi (colore rosso e testo bold, ad esempio), si potrà senz'altro pensare ad una proprietà da specificare in ambito PSM Web.

In tal caso, converrà definire la proprietà in questione come elemento a sè stante. Successivamente, basterà mapparla su tutti quegli attributi ai quali si intenda assegnarla.
In figura 10 è riportato un semplice esempio di definizione della proprietà, che viene poi messa in corrispondenza con l'attributo AccountNumber di Customer.


Figura 10
- Modellare una modifica sul web tier
(clicca sull'immagine per ingrandire)

Un altro esempio potrebbe essere costituito dalla esigenza di definire un metodo di ricerca (finder method) su un campo diverso dalla chiave primaria. Anche in tal caso si opera a livello PSM, ma stavolta sul layer EJB.
Si veda in figura 11 un esempio, in cui si è definito un finder method sull'attributo AccountNumber di Customer.
Anche in questo caso, la funzionalità da implementare è stata semplicemente modellata.


Figura 11 - Modellare una modifica sull' EJB tier
(clicca sull'immagine per ingrandire)

Altri tipi di modifiche possono suggerire un intervento a livelli più alti, ad esempio a livello PIM.
Nel prossimo esempio verrà illustrata una situazione di questo tipo.

 

Come posso aggiungere nuove funzionalità? E se voglio aggiungere del codice Java scritto ad hoc?
Si pensi alla esigenza di definire sul cliente una operazione di Creazione Ordini.
Un possibile approccio può consistere nel definire, a livello PIM (sempre su Customer) una Operation, da modellare definendone tipo di ritorno e parametri (vedere figura 12).


Figura 12 - Modificare il PIM - Creazione di una Operation
(clicca sull'immagine per ingrandire)

Una Operation a livello PIM a cosa corrisponde nei livelli PSM sottostanti? Il successivo passo di trasformazione si occupa proprio di questo, e pertanto dovrà creare:

PSM Web: una web action appartenente all'elemento Customer (ricordiamo che secondo le specifiche J2EE una web action è la formalizzazione di una qualunque interazione con l'utente). Sarà poi possibile inserire il proprio codice Java nelle zone pre e post - figura 13


Figura 13
- Web Action sul PSM Web
(clicca sull'immagine per ingrandire)

PSM EJB: un business method appartenente all'elemento Customer. Anche in questo caso sarà possibile intervenire scrivendo il proprio codice Java nell'apposito spazio, al fine di implementare il metodo di business modellato al passo precedente - figura 14


Figura 14
- Business Method sul PSM EJB
(clicca sull'immagine per ingrandire)


Come si può avere garanzia di allineamento tra le diverse parti nei diversi modelli se alcune di esse vengono modificate?
I tool che implementano MDA e' previsto che siano in grado di mantenere costantemente aggiornati tutti i diversi modelli (PIM, PSM, Code), e ciò allo scopo di avere garanzia di coerenza tra le diverse modifiche apportate e gli artifatti via via generati tramite le differenti trasformazioni. La figura 15 illustra appunto tale fondamentale passo di sincronizzazione (update) tra i diversi layer.
Come risultato di tale step, tutte le modifiche effettuate a livello PIM e PSM vengono a sincronizzarsi tra di loro, rendendo sempre completamente coerenti ntra di loro tutte le sue parti.
Un successivo passo di Generate Code permette infine di produrre tutta la parte di codice conseguente a quanto presente nei diversi PIM e PSM.
Il risultato finale sarà, ancora una volta, una applicazione completa (rispetto allo stato dell'arte dei modelli) e completamente funzionante, sulla quale intraprendere la successiva iterazione di modifiche, e così via, fino al raggiungimento dello stato finale della applicazione pronta per essere consegnata.


Figura 15 - Sincronizzazione attiva tra PIM, PSM e Code
(clicca sull'immagine per ingrandire)

 

La documentazione
Nella prima parte del presente articolo si è evidenziato come anche il problema di avere in ogni momento una documentazione allineata con l'applicazione possa essere risolto seguendo l'approccio MDA.
Fonte principale di documentazione è proprio il modello di business (PIM), proprio in virtù del fatto che esso cattura tutti i requisiti di business del sistema da sviluppare e ne costituisce una rappresentazione completa e costantemente allineata - a patto, naturalmente, che si utilizzi un tool MDA, che mantenga costantemente aggiornato il PIM con tutti gli artifatti dei layer sottostanti.

Nasce allora l'idea di combinare le caratteristiche in tal senso "native" di Java - e cioè la funzionalità di Javadoc che permette di produrre automaticamente la documentazione di progetto - con le caratteristiche proprie del PIM, e cioè, tanto per essere concreti, con il diagramma UML che formalizza il nostro PIM.
Sempre utilizzando il tool OptimalJ, siamo in grado di produrre un enhanced Javadoc, vale a dire un package di documentazione Javadoc arricchito del diagramma (o dei diagrammi) di interesse, tra tutti quelli sviluppati nel corso del progetto.
Nella figura 16 si può vedere un esempio di Javadoc generato in formato HTML arricchito col diagramma UML del PIM oggetto del nostro studio.


Figura 16
- Enhanced Javadoc
(clicca sull'immagine per ingrandire)

 

Conclusioni: il futuro di MDA
Si è visto come applicare in modo estensivo MDA al ciclo di sviluppo di una applicazione software permetta di raggiungere elevati livelli di produttività e di qualità.
Tuttavia, al tempo della stesura di questo articolo, MDA viene ancora considerata immatura.
Viene quindi naturale porsi domande sul futuro di MDA, e su quali tendenze potrebbero emergere in seno ad essa.
Non è possibile, ad oggi, dare una risposta definitiva, tuttavia è possibile individuare alcune aree chiave per i futuri sviluppi, e cioè:

  • sviluppo completo di linguaggi MDA compliant, in virtù del fatto che ad oggi la maggior parte delle specifiche OMG per descrivere modelli si sofferma maggiormente sugli aspetti statici dei linguaggi utilizzati (attraverso il MOF meta-model, cfr [6]), nel senso che manca totalmente la parte semantica dinamica dei linguaggi stessi. Si pensi a descrivere ad esempio il comportamento di un automa a stati servendosi del formalismo MOF. Ad oggi, MOF non è completo e pertanto una trattazione dinamica della attività di un tale automa non è possibile
  • modalità e metodologie di astrazione più raffinate sui modelli, man mano che le esperienze sul campo diverranno sempre più significative. L'esigenza sarà allora di arricchire sempre di più le potenzialità espressive dei modelli al fine di essere in grado di produrre "artifatti" sempre più sofisticati (si pensi ad aree quali il riuso di astrazioni, in modo da rendere possibile ereditare e combinare variamente template, pattern, package, si pensi ad architetture complesse, i cui blueprints possano poi essere diffusi al fine di creare sistemi completamente coerenti, solo per citare alcuni esempi)

Utilizzare MDA in pratica significa cambiare radicalmente il proprio modo di approcciare le attività di sviluppo di un sistema software, significa capovolgere il focus sino ad ora saldamente ancorato all'attività di codifica, per imparare, prima di tutto, a pensare agli aspetti del business che si intende affrontare, prima ancora che ai dettagli tecnologico-applicativi.
Significa scegliere, come affermato sul sito web di OMG, una "Architettura per un mondo in continua evoluzione".

 

Bibliografia
[1] Java Community Process "UML Profile for EJB" - http://www.jcp.org/en/jsr
[2] Jon Siegel & the OMG Staff Strategy Group - "Developing in OMG's Model Driven Architecture", OMG document, 01-12-01, 2001
[3] King's College London - "An Evaluation of Compuware OptimalJ Professional Edition as an MDA Tool", University of York, 2003
[4] Compuware Lab "OptimalJ Community" - http://javacentral.compuware.com
[5] Web Tier Application Framework Design - http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/web-tier/web-tier5.html
[6] Meta Object Facility (MOF) Specification, 1999


MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it